13浏览
查看: 13|回复: 4

[项目] 【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围

[复制链接]
Kitronik ARCADE 是一款由英国教育科技公司 Kitronik 精心打造的可编程游戏机开发板,专为编程教学与创客实践而设计。该设备原生支持微软的 MakeCode Arcade 平台,用户可通过图形化或 JavaScript 编程方式,轻松创建、下载并运行复古风格的街机游戏。

它集成了彩色 LCD 显示屏、方向控制键、功能按键、蜂鸣器和震动马达等交互组件,提供完整的游戏输入输出体验。无论是初学者进行编程启蒙,还是创客群体开发交互式作品,Kitronik ARCADE 都能作为理想的硬件载体,助力创意实现。

凭借其开源友好、易于上手、兼容性强等特点,该开发板广泛应用于中小学编程课程、创客工作坊、游戏开发教学以及个人项目原型设计,深受教育者与技术爱好者的喜爱。

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图3

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图1

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图2

驴友花雕  中级技神
 楼主|

发表于 4 小时前

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围

作为学习、练习与尝试,这里创建一个太空冒险氛围的小游戏。
打开网页版:https://arcade.makecode.com/,设置项目名称:太空冒险氛围

MicroPython实验参考代码

  1. @namespace
  2. class SpriteKind:
  3.     Star = SpriteKind.create()
  4. ship: Sprite = None
  5. hyper = False
  6. star: Sprite = None
  7. scroll = False
  8. lineAdjust = 0
  9. sagaSprite: Sprite = None
  10. sagaImage: Image = None
  11. storyLines = ["TALE OF TALAGRON",
  12.     "",
  13.     "Once upon a time,",
  14.     "like really long ago,",
  15.     "a peaceful people lived",
  16.     "happily on Planet Talagron.",
  17.     "",
  18.     "They used the rare mineral",
  19.     "Xelantium for energy to",
  20.     "power their planet.",
  21.     "",
  22.     "Dobanites raided Talagron",
  23.     "and took all the known",
  24.     "Xelantium from them. Not",
  25.     "nice! Ugh! Err!",
  26.     "",
  27.     "Your mission is to help",
  28.     "protect Talagron from the",
  29.     "greedy Dobanites. So, on",
  30.     "your way now and good luck!"]
  31. scroll = True
  32. sagaImage = image.create(scene.screen_width(), 10 * len(storyLines))
  33. i = 0
  34. while i <= len(storyLines) - 1:
  35.     sagaImage.print_center(storyLines[i], i * 10, 7 if i > 0 else 4)
  36.     i += 1
  37. sagaSprite = sprites.create(sagaImage, 0)
  38. sagaSprite.top = scene.screen_height() - 1
  39. sagaSprite.set_flag(SpriteFlag.AUTO_DESTROY, True)
  40. sagaSprite.vy = -10
  41. def on_a_pressed():
  42.     global hyper, scroll
  43.     if not hyper:
  44.         sagaSprite.vy = 0 if scroll else -10
  45.         scroll = not (scroll)
  46. controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)
  47. def on_up_pressed():
  48.     global hyper, scroll, lineAdjust
  49.     if not hyper:
  50.         sagaSprite.vy = 0
  51.         scroll = False
  52.         lineAdjust = (sagaSprite.bottom + 1) % 10
  53.         sagaSprite.bottom -= lineAdjust if (lineAdjust > 0) else 10
  54. controller.up.on_event(ControllerButtonEvent.PRESSED, on_up_pressed)
  55. def on_down_pressed():
  56.     global hyper, scroll, lineAdjust
  57.     if not hyper:
  58.         sagaSprite.vy = 0
  59.         scroll = False
  60.         lineAdjust = (sagaSprite.top + 1) % 10
  61.         sagaSprite.top += 10 - lineAdjust
  62. controller.down.on_event(ControllerButtonEvent.PRESSED, on_down_pressed)
  63. def on_on_update():
  64.     global star
  65.     if sagaSprite.bottom < 0:
  66.         sagaSprite.destroy()
  67.     if Math.percent_chance(25) or hyper:
  68.         star = sprites.create(img("""
  69.             1
  70.             """), SpriteKind.Star)
  71.         star.set_flag(SpriteFlag.AUTO_DESTROY, True)
  72.         star.set_flag(SpriteFlag.GHOST, True)
  73.         star.x = randint(0, scene.screen_width())
  74.         star.y = randint(0, scene.screen_height())
  75.         star.vx = -2 if (star.x < scene.screen_width() / 2) else 2
  76.         star.vy = -1 if (star.y < scene.screen_height() / 2) else 1
  77.         if hyper:
  78.             star.ax = star.vx * 1000
  79.             star.ay = star.vy * 1000
  80.             if Math.percent_chance(15):
  81.                 ship.x = randint(scene.screen_width() / 2 - 5, scene.screen_width() / 2 + 5)
  82.                 ship.y = randint(scene.screen_height() / 2 - 2, scene.screen_height() / 2 + 2)
  83. game.on_update(on_on_update)
  84. def on_on_destroyed():
  85.     global ship, hyper
  86.     ship = sprites.create(img("""
  87.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  88.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  89.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  90.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  91.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  92.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  93.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  94.             . . . . . . . . . . . . . . . 7 4 . . . . . . . . . . . . . . .
  95.             . . . . . . . . . . . . . . . e e . . . . . . . . . . . . . . .
  96.             . . . . . . . . . . . . . . . e e . . . . . . . . . . . . . . .
  97.             . . . . . . . . . . . . . . . e e . . . . . . . . . . . . . . .
  98.             . . . . . . . . . . . . . . . e e . . . . . . . . . . . . . .
  99.             . . . . . . . . . . . . . . 4 e e 4 . . . . . . . . . . . . . .
  100.             . . . . . . . . . . . . e e e e e e e e . . . . . . . . . . . .
  101.             . . . . . . . . . . . e e e e e e e e e e . . . . . . . . . . .
  102.             . . . . . . . . . . e e e e 5 3 3 5 e e e e . . . . . . . . . .
  103.             . . . . . . . . . 4 e e e 5 3 5 2 2 5 e e e 4 . . . . . . . . .
  104.             . . . . . . . 7 7 e e e e 5 2 2 5 5 2 e e e e 7 7 . . . . . . .
  105.             . . . . . . 7 e e e e e e 2 2 5 2 3 3 e e e e e e 7 . . . . . .
  106.             . . . . 7 e e e e e e e e 5 2 2 2 5 2 e e e e e e e e 7 . . . .
  107.             . . e e e e e e e e e e e e 3 5 5 2 e e e e e e e e e e e e . .
  108.             . e e e e e e . . . 7 e e e e e e e e e e 7 . . . e e e e e e .
  109.             e e e e 7 . . . . . . . e e e e e e e e . . . . . . . 7 e e e e
  110.             e 7 . . . . . . . . . . . e e e e e e . . . . . . . . . . . 7 e
  111.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  112.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  113.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  114.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  115.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  116.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  117.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  118.             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  119.             """),
  120.         SpriteKind.player)
  121.     ship.start_effect(effects.warm_radial)
  122.     hyper = True
  123.     for slowStar in sprites.all_of_kind(SpriteKind.Star):
  124.         slowStar.ax = slowStar.vx * 1000
  125.         slowStar.ay = slowStar.vy * 1000
  126. sagaSprite.on_destroyed(on_on_destroyed)
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 小时前

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围

这段代码是用 MakeCode Arcade 编写的一个具有剧情滚动展示 +星空特效 + 飞船登场的游戏开场动画系统。它融合了文字叙述、视觉动态和交互控制,营造出一种富有故事感的太空冒险氛围。

一、核心结构概览

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图1

二、剧情展示逻辑
创建剧情文本图像

  1. sagaImage = image.create(scene.screenWidth(), 10 * storyLines.length)
  2. for (let i = 0; i <= storyLines.length - 1; i++) {
  3.     sagaImage.printCenter(storyLines[i], i * 10, i > 0 ? 7 : 4)
  4. }
复制代码

创建一个高度足够容纳所有文本的图像。

每行文字垂直间隔为 10 像素,使用不同字体大小区分标题与正文。

创建剧情精灵并滚动

  1. sagaSprite = sprites.create(sagaImage, 0)
  2. sagaSprite.top = scene.screenHeight() - 1
  3. sagaSprite.vy = -10
复制代码

将剧情图像作为精灵显示,并从底部开始向上滚动。

设置 AutoDestroy 标志,当滚动出屏幕自动销毁。

三、控制器交互逻辑
A键:暂停/恢复滚动

  1. controller.A.onEvent(...): sagaSprite.vy = scroll ? 0 : -10
复制代码

切换滚动状态,允许玩家手动控制剧情节奏。

↑键:向上滚动一行

  1. lineAdjust = (sagaSprite.bottom + 1) % 10
  2. sagaSprite.bottom -= (lineAdjust > 0) ? lineAdjust : 10
复制代码

精确对齐每行文字,避免错位。

↓键:向下滚动一行

  1. lineAdjust = (sagaSprite.top + 1) % 10
  2. sagaSprite.top += 10 - lineAdjust
复制代码

同样实现逐行滚动,适合手动阅读。

四、星空背景动态生成
星星生成逻辑

  1. if (Math.percentChance(25) || hyper) {
  2.     star = sprites.create(img`1`, SpriteKind.Star)
  3.     star.vx = (star.x < screenWidth/2) ? -2 : 2
  4.     star.vy = (star.y < screenHeight/2) ? -1 : 1
  5. }
复制代码

随机生成星星,模拟星空流动。

星星速度根据位置决定方向,制造“向中心汇聚”或“向外扩散”效果。

超空间模式(hyper)

  1. if (hyper) {
  2.     star.ax = star.vx * 1000
  3.     star.ay = star.vy * 1000
  4. }
复制代码

星星加速,模拟飞船进入超空间时的视觉冲击。

飞船位置也随机微调,增强动态感。

五、剧情结束后飞船登场
sagaSprite 被销毁时触发

  1. sagaSprite.onDestroyed(function () {
  2.     ship = sprites.create(..., SpriteKind.Player)
  3.     ship.startEffect(effects.warmRadial)
  4.     hyper = true
  5. })
复制代码

创建飞船精灵并启动径向特效。

设置 hyper = true,触发星星加速与飞船中心定位。

六、总结亮点与设计意图
叙事驱动:通过文字滚动引导玩家进入游戏世界。

视觉沉浸:星空动态与特效营造太空氛围。

交互控制:玩家可暂停或逐行阅读剧情,提升参与感。

状态切换:剧情结束后进入“游戏主阶段”,飞船登场,节奏转换自然。


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 小时前

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围

通过模拟器,调试与模拟运行

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图1

实验场景记录

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图3

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图4

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图2

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图5

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图6

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 小时前

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围

【花雕动手做】基于Kitronik可编程开发板之太空冒险氛围图1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail