## **第 3 章 打地鼠**
* * * * *
**教学制作**:一克拉
* * * * *
**App作品下载**:
* * * * *
**视频教程**:稍候上传
* * * * *
**效果说明**:
灵感来自一款经典的街机游戏Whac-A-Mole,其中的小动物会突然从洞中冒出,玩家则用木槌击打它们,击中得分。
![](https://box.kancloud.cn/6278d8afc27adce46d46a428bc8bfbe4_240x189.png)
* * * * *
![](https://box.kancloud.cn/dcea87edcd25adc292a2aac62bf1c698_400x619.jpg)
APP界面截图
* * * * *
**一、【学习目标】**
“打地鼠”应用将实现以下功能:
1. 一只地鼠随机出现在屏幕上,每秒钟移动一次;
2. 手指触到地鼠,则让设备震动,显示的命中数加1,地鼠随机移动到新位置;
3. 手指触屏但没点击中地鼠,则显示失败数加1;
4. 点击“重新开始”按钮,游戏重新开始,命中和失败的计数归零。
**二、学习内容**
1. ImageSprite组件:具有触感的可移动图像;(精灵)
2. Canvas组件:容纳ImageSprite的平台;(画布)
3. Clock组件:用来计时,让sprite随即移动;(计时传感器)
4. Sound组件:击中地鼠时产生震动;(音效)
5. Button组件:开始新游戏;(按钮)
6. Procedures:用来实现一系列的指令,可以重复调用,如移动地鼠;()
7. 产生随机数;
8. 使用加法块(+)及减法块(-)。
**三、准备开始**
**Step1: 素材准备**
准备1:萝卜坑背景图一张
准备2:三种Size地鼠图片各一张
准备3:准备一份音频文件作为打地鼠背景音乐
**Step2:界面设计(组件及布局)**
![](https://box.kancloud.cn/dcea87edcd25adc292a2aac62bf1c698_400x619.jpg)
* * * * *
![](https://box.kancloud.cn/3070e818ba7b1d78a9cee1e3a359560d_441x832.png)
拖拽一张画布到屏幕上,为画布设置指定的高度和宽度,我这里设置了宽350,高400。接着,拖拽9个图像精灵到画布上 ,将图像精灵分别放在背景图中有坑的位置。将第一排地鼠的图像设置为mouse1.png、第二排设置为mouse2.png,第三排设置为mouse3.png,之所以没有用到同一个图像,是为了获得视觉体验的真实性,第一排地鼠最大,越往后地鼠越小。
* * * * *
![](https://box.kancloud.cn/8a6dcaea9e453d60e3ca232168584486_990x737.png)
mouselist为列表类型变量,用来存放9只地鼠
play为一个开关逻辑变量,初始化设置为false,当play按钮被按下设置其为true
score为数据类型变量,初识成绩为为0
endtime为数据类型变量,初识赋值60,单位为s,用来做游戏倒计时
music为一个开关逻辑变量,用来控制是否播放音乐
* * * * *
**Step3: 逻辑块设计(块程序)**
1、初始化全局变量
![](https://box.kancloud.cn/992bf11cf37644707a42453f349f53c2_360x250.jpg)
(1)mouselist为列表类型变量,用来存放9只地鼠
(2)play为一个开关逻辑变量,初始化设置为false,当play按钮被按下设置其为true
(3)score为数据类型变量,初识成绩为为0
(4)endtime为数据类型变量,初识赋值60,单位为s,用来做游戏倒计时
(5)music为一个开关逻辑变量,用来控制是否播放音乐
2、自定义一个过程 initialize
![](https://box.kancloud.cn/c4cadc6813c2b3a15f681638078f7ac6_635x617.png)
![](https://box.kancloud.cn/d08097e643aa70d159f3d920bdc052ac_435x330.png)
(1)计时器要等到开始按钮被按下才启用
(2)开始按钮未被按下,将play设置为false
(3)背景音乐按钮未被按下,将music设置为false
(4)初始化score为0
(5)为列表变量mouselist初始化,相当于为列表赋值
(6)一开始想设置图像精灵全部不显示,因此,这里使用了一个循环,循环取列表中的图像精灵,将其显示状态设置为false,图像精灵通过索引值的方法来获得。而且这里用到了任意组件
(7)设置画布的画笔颜色为白色
(8)设置画布的线宽
(9)在背景图上画字“倒计时”,这里调用了“沿角度画字”这个方法,目的是让画出的字能够很好地显示在我们的背景图中
(10)在背景图上画字“分数”
3、设置屏幕初始化动作
![](https://box.kancloud.cn/e4c51fa90ce530fc543616da609e72a5_226x91.png)
(1)设计随机显示地鼠的过程
![](https://box.kancloud.cn/4e3bce6981d273c67c738b3bc8e043d6_629x206.png)
* * * * *
![](https://box.kancloud.cn/402ce11e3ec11f7c252fd43932877f28_525x514.png)
随机选择要显示的地鼠,这里同样用到了任意组件中的任意精灵的方法
任意组件的好处是我们不必为每一个组件设置重复的方法
* * * * *
(2)设计地鼠隐藏过程
![](https://box.kancloud.cn/1f66ba378324ee2b67ee1062a1c8a9bf_594x248.png)
* * * * *
将传值进来的地鼠显示状态设置为false,也就是隐藏该地鼠
将分数增加1分
调用随机显示地鼠的过程
该过程需要接收一个参数number,number为地鼠的序号
* * * * *
(3)设置精灵被触碰的动作
![](https://box.kancloud.cn/fedb67a44152048121a87f8e45f3db45_793x398.png)当精灵被触碰,即调用hidemouse这个过程,并把地鼠的序号作为参数传过去,由于任意精灵中没有精灵触碰事件,因此9个精灵分别要写相应的程序去处理。
* * * * *
(4)处理play按钮单击事件
![](https://box.kancloud.cn/ea0c016de86466da3a4093090bed13d7_497x294.png)
将play开关设置为取反,即如果当前play为false,那么按下按钮则为true
如果play为true,则将play按钮的显示文本设置为“暂停”,启动计时器计时
否则,也就是play为false,则将play的显示文本设置为“开始”,停止计时器计时,并且显示警告信息“游戏暂停”,这个过程中play按钮充当了一个开关。
* * * * *
(5)处理音乐按钮单击事件
![](https://box.kancloud.cn/cc3a4a1388abcf7be0230f7a0ca2f85e_482x246.png)
这里的music逻辑变量也相当于一个开关,通过判断music的真假来播放音乐。
* * * * *
(6)定义过程——“显示结果”
![](https://box.kancloud.cn/1cde374a6c44c55e7a06b08608e302a1_721x185.png)
* * * * *
(7)处理stop按钮单击事件
![](https://box.kancloud.cn/234fbff51c7248ca4bd18b15de79de69_653x467.png)
当按下停止按钮,进行判断,如果剩余时间大于0,说明游戏没有结束,因此提醒用户“时间还没到,是否确定退出游戏?”
当用户选择退出,则停止计时器计时,停止音乐播放,显示最终成绩。
* * * * *
(8)设置计时器计时
![](https://box.kancloud.cn/c3cf97f4400210285f5bbb321e835019_567x331.png)
![](https://box.kancloud.cn/6e14a989dce05b93c286bcfeb8706f8b_517x587.png)
每隔1S,剩余时间-1
如果剩余时间为0,停止计时器计时,显示“时间到,游戏结束!”对话框;显示最后的结果,显示结果为一个单独的过程,将music、play、stop都设置为不启用
如果时间没有到,就继续显示倒计时间和分数,这里在调用画字过程之前都用到了清除画布,原因是如果不清除画布,画布上会留下上一次的文字痕迹~~不懂?自己把清除画布功能去掉看看效果嘛?!
* * * * *
(9)设置退出按钮事件
![](https://box.kancloud.cn/be5c835e0ff76c33b4b4ebe2b788d0aa_169x74.png)
直接关闭屏幕,退出程序。