## **第 3 章 打地鼠**
* * * * *
**教學制作**:一克拉
* * * * *
**App作品下載**:
* * * * *
**視頻教程**:稍候上傳
* * * * *
**效果說明**:
靈感來自一款經典的街機游戲Whac-A-Mole,其中的小動物會突然從洞中冒出,玩家則用木槌擊打它們,擊中得分。

* * * * *

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:界面設計(組件及布局)**

* * * * *

拖拽一張畫布到屏幕上,為畫布設置指定的高度和寬度,我這里設置了寬350,高400。接著,拖拽9個圖像精靈到畫布上 ,將圖像精靈分別放在背景圖中有坑的位置。將第一排地鼠的圖像設置為mouse1.png、第二排設置為mouse2.png,第三排設置為mouse3.png,之所以沒有用到同一個圖像,是為了獲得視覺體驗的真實性,第一排地鼠最大,越往后地鼠越小。
* * * * *

mouselist為列表類型變量,用來存放9只地鼠
play為一個開關邏輯變量,初始化設置為false,當play按鈕被按下設置其為true
score為數據類型變量,初識成績為為0
endtime為數據類型變量,初識賦值60,單位為s,用來做游戲倒計時
music為一個開關邏輯變量,用來控制是否播放音樂
* * * * *
**Step3: 邏輯塊設計(塊程序)**
1、初始化全局變量

(1)mouselist為列表類型變量,用來存放9只地鼠
(2)play為一個開關邏輯變量,初始化設置為false,當play按鈕被按下設置其為true
(3)score為數據類型變量,初識成績為為0
(4)endtime為數據類型變量,初識賦值60,單位為s,用來做游戲倒計時
(5)music為一個開關邏輯變量,用來控制是否播放音樂
2、自定義一個過程 initialize


(1)計時器要等到開始按鈕被按下才啟用
(2)開始按鈕未被按下,將play設置為false
(3)背景音樂按鈕未被按下,將music設置為false
(4)初始化score為0
(5)為列表變量mouselist初始化,相當于為列表賦值
(6)一開始想設置圖像精靈全部不顯示,因此,這里使用了一個循環,循環取列表中的圖像精靈,將其顯示狀態設置為false,圖像精靈通過索引值的方法來獲得。而且這里用到了任意組件
(7)設置畫布的畫筆顏色為白色
(8)設置畫布的線寬
(9)在背景圖上畫字“倒計時”,這里調用了“沿角度畫字”這個方法,目的是讓畫出的字能夠很好地顯示在我們的背景圖中
(10)在背景圖上畫字“分數”
3、設置屏幕初始化動作

(1)設計隨機顯示地鼠的過程

* * * * *

隨機選擇要顯示的地鼠,這里同樣用到了任意組件中的任意精靈的方法
任意組件的好處是我們不必為每一個組件設置重復的方法
* * * * *
(2)設計地鼠隱藏過程

* * * * *
將傳值進來的地鼠顯示狀態設置為false,也就是隱藏該地鼠
將分數增加1分
調用隨機顯示地鼠的過程
該過程需要接收一個參數number,number為地鼠的序號
* * * * *
(3)設置精靈被觸碰的動作
當精靈被觸碰,即調用hidemouse這個過程,并把地鼠的序號作為參數傳過去,由于任意精靈中沒有精靈觸碰事件,因此9個精靈分別要寫相應的程序去處理。
* * * * *
(4)處理play按鈕單擊事件

將play開關設置為取反,即如果當前play為false,那么按下按鈕則為true
如果play為true,則將play按鈕的顯示文本設置為“暫停”,啟動計時器計時
否則,也就是play為false,則將play的顯示文本設置為“開始”,停止計時器計時,并且顯示警告信息“游戲暫停”,這個過程中play按鈕充當了一個開關。
* * * * *
(5)處理音樂按鈕單擊事件

這里的music邏輯變量也相當于一個開關,通過判斷music的真假來播放音樂。
* * * * *
(6)定義過程——“顯示結果”

* * * * *
(7)處理stop按鈕單擊事件

當按下停止按鈕,進行判斷,如果剩余時間大于0,說明游戲沒有結束,因此提醒用戶“時間還沒到,是否確定退出游戲?”
當用戶選擇退出,則停止計時器計時,停止音樂播放,顯示最終成績。
* * * * *
(8)設置計時器計時


每隔1S,剩余時間-1
如果剩余時間為0,停止計時器計時,顯示“時間到,游戲結束!”對話框;顯示最后的結果,顯示結果為一個單獨的過程,將music、play、stop都設置為不啟用
如果時間沒有到,就繼續顯示倒計時間和分數,這里在調用畫字過程之前都用到了清除畫布,原因是如果不清除畫布,畫布上會留下上一次的文字痕跡~~不懂?自己把清除畫布功能去掉看看效果嘛?!
* * * * *
(9)設置退出按鈕事件

直接關閉屏幕,退出程序。