Day23 ( 游戏设计 ) 射击幽浮

射击幽浮

教学原文参考:射击幽浮

这篇文章会介绍如何使用「建立游戏角色」、「游戏角色座标」、「游戏角色碰撞」、「变数」、「[重复回圈」、「逻辑判断」等积木,在 micro:bit 实作一个射击幽浮的射击小游戏。

相关文章参考:建立游戏角色游戏角色座标游戏角色碰撞变数重复回圈逻辑判断

游戏方式

射击幽浮是一款简单的射击小游戏,游戏开始後,画面上方会出现一个逐渐往下移动的 UFO,使用者需要操控下方炮塔发射炮弹阻止幽浮往下移动,当炮弹击中幽浮,幽浮会消失并重新从上方出现,再次向下移动,若幽浮碰到地面,游戏结束,显示得分。

如果使用 micro:bit 实作,游戏操作步骤如下:

  • 同时按下 AB 按钮,开始游戏 ( 或重新游戏 )。
  • 按下 A 按钮,控制炮塔向左移动。
  • 按下 B 按钮,控制炮塔向右移动。
  • 游戏开始後按下 AB 按钮,可以发射炮弹。
  • 炮弹击中幽浮,得分加 1,幽浮再度从最上方随机位置出现。
  • 幽浮抵达地面,游戏结束,显示得分。

micro:bit - 射击幽浮

积木程序原理

当启动时,先定义游戏启动与游戏角色的变数:

  • 变数 run:数值 0,判断游戏是否开始 ( 0 表示游戏尚未开始,1 表示开始 )。
  • 变数 player:炮塔游戏角色,创建於 (2,4) 座标。
  • 变数 bullet:炮弹游戏角色,创建於 (0,4) 座标,亮度 0 ( 不显示 )。
  • 变数 ufo:幽浮游戏角色,创建於 (2,0) 座标,亮度 0 ( 不显示 )。

micro:bit - 射击幽浮

因为按下 AB 按钮有两种动作,一种是启动游戏,另一种是发射炮弹,所以程序要加入逻辑判断:

  • 判断 run 等於 0 ( 游戏尚未开始或游戏结束 ) 时:
    • 设定 run 为 1 ( 游戏开始 )。
    • 设定 score 分数为 0。
    • 设定 fire 开火状态为 0。
    • 游戏继续 ( 搭配游戏结束时的游戏暂停 )
    • 设定 ufo 角色的位置、亮度。
  • 判断 run 不等於 0 时 ( 表示游戏开始或游戏正在进行 ):
    • 设定 fire 开火状态为 1 ( 开火 )

micro:bit - 射击幽浮

接着设计按下 A 按钮和 B 按钮时,移动炮塔的程序:

  • 按下 A 按钮时,fire 开火状态设定 0 ( 不开火 ),炮塔角色往左移动。
  • 按下 B 按钮时,fire 开火状态设定 0 ( 不开火 ),炮塔角色往右移动。

micro:bit - 射击幽浮

新增一个重复无限次积木,制作炮弹移动的程序:

  • 判断如果 run 等於 1 表示游戏正在进行。
  • fire 变更为 0,避免重复开火 ( 不然程序会变得较复杂 )。
  • 将炮弹移动到炮塔的位置,改变亮度为 30
  • 使用重复 4 次积木,让炮弹从下移动到顶端
  • 移动到顶端後,炮弹亮度改为 0 隐藏炮弹,并将炮弹移动到最下方

micro:bit - 射击幽浮

新增第二个重复无限次积木,制作炮弹打到幽浮的程序:

  • 判断如果 run 等於 1 表示游戏正在进行。
  • 判断如果炮弹 bullet 碰到幽浮 ufo
  • 得分 score 增加 1。
  • 幽浮角色再度移动到顶端 ( x 为 0~4 随机数,y 为 0 )

micro:bit - 射击幽浮

最後新增第三个重复无限次积木,制作幽浮往下移动的程序:

  • 判断如果 run 等於 1 表示游戏正在进行。
  • 每次重复让 ufo 的 y 座标改变 1 ( 往下移动 )。
  • 如果 ufo 的 y 等於 4,表示撞到地面,run 改为 0 ( 游戏结束 )
  • 使用游戏暂停积木,避免游戏角色影响画面显示
  • 游戏结束後,使用重复回圈显示得分 score ( 使用回圈是为了不断显示两位数得分 )。
  • 使用暂停积木,设定 ufo 移动速度。

micro:bit - 射击幽浮

完成後,启动 micro:bit,就可以开始进行设计幽浮的游戏。

micro:bit - 射击幽浮

范例解答

范例解答:射击幽浮

实作「射击幽浮」的小技巧

  • 为什麽要使用「游戏角色」呢?

    因为游戏角色积木很适合处理「互相碰撞」的状况,也可以很简单的让游戏角色彼此不会互相干扰,对於同一个画面里,具有许多不同方向、不同移动速度的角色说,是相当方便的功能。

  • 为什麽要使用「游戏暂停」和「游戏继续」呢?

    因为使用了「游戏角色」,如果不将游戏暂停,角色的 LED 灯会影响画面显示,进而造成得分无法顺利显示的状况 ( 只会显示一次就消失 )。

  • 为什麽不使用内建的「游戏得分」呢?

    如果使用了内建的「游戏得分」,显示得分後会造成「游戏结束」,然而内建的「游戏结束」必须重新启动 micro:bit 才能再次游戏,所以在这个范例就不使用「游戏得分」。

关於我

大家好,我是 OXXO,是个即将迈入中年的斜杠青年,如果对我有点兴趣(笑,可以与我联系,一起来做点有玩又有创意的东西吧!


<<:  [前端暴龙机,Vue2.x 进化 Vue3 ] Day14.监听器

>>:  Day23 - Day17 改为轻前端范例

Day 25 - 模板

Outline: Templates The standard library <vector...

Day [30] Azure Custom Vision-Line Chatbot整合(二)~完赛!

Use your model with the prediction API 昨天我们已经安装好Az...

学习Vim、VSCodeVim的历程&写书探索的一些经历

学习Vim、VSCodeVim的历程&写书探索的一些经历 [系列文目录] 相信不少人最早接触Vim,...

Day 29 部署 package

注册帐号 首先要注册 npm 帐号 注册页面 注册完後,登入你的帐号 npm login 成功後会显...

便利贴中的手势操作

在 Jetpack Compose 的官方文件中,拖曳手势操作是这样子使用的: Box(modifi...