2.1. 遊戲介紹
這是原書介紹的第一個遊戲,適合4 歲以上的小朋友玩。下圖所示是這個遊戲在不同狀態時的畫面截圖。啓動這個遊戲程序,就進人遊戲的歡迎畫面。這時按下鏈盤上的回車鍵就可以開始遊戲。
遊戲歡迎畫 | 遊戲進行畫面 | 遊戲結束畫面 |
在遊戲進行中,從天空中會不斷地隨機掉下雪花、禮物和剪刀。玩家使用鍵盤上的左、右方向鍵控制公主角色往左、右兩個方向移動,讓公主躲避剪刀、接住禮物和雪花。接到雪花可獲得10分,接到禮物可獲得50分。遊戲開始時,玩家有3顆愛心寶石。如果玩家讓公主碰到剪刀,就要扣掉1顆愛心寶石;如果愛心寶石用光了,那麼碰到剪刀就會結束遊戲。這個遊戲的時間限定爲5分鐘。遊戲開始後就開始倒計時,時間到,則遊戲結束。
在遊戲結束畫面,按下鏈盤上的回車鍵可以重新開始遊戲。如果要退出遊戲程序,可以單擊窗口中的“關閉”按鈕。
2.1. 編程思路
這個遊戲要實現的功能並不複雜,整個遊戲分爲3個狀態,即等待、進行和結束。在各個狀態下需要實現的功能見下表:
原書表 29-1 遊戲狀態及功能
狀態 |
功能 |
等待狀 |
l 顯示遊戲歡迎背景圖 l 等待狀態 按下回車開始玩 |
進行狀態 |
l 顯示遊戲進行背景圖 l 循環播放《鈴兒響叮噹》伴奏曲 l 用左、右方向鍵控制公主左、右移動 l 禮物、雪花和剪刀隨機地從天空中掉下 l 公主接到禮物加50分,接到雪花加10分 l 公主碰到剪刀減掉1課愛心寶石 |
結束狀態 |
l 顯示遊戲結束背景圖 l 按下回車鍵重新玩遊戲 |
這個遊戲的3個狀態在不同的條件下被觸發和轉換,其變化情況如原書 圖29-2 所示。
在遊戲進行中,從天空中會隨機掉落物體,可能是雪花、禮物或剪刀中的一個。 使用隨機函數決定掉落物體的類型,將雪花、禮物和剪刀三者的比例控制爲爲5:3:2。 也就是在1到10之間隨機生成一個數n 。如果1≤n≤5,則掉落物體是雪花。如果6≤n≤8,則掉落物體是禮物。如果9≤n≤10,則掉落物體是剪刀。
在遊戲時需要判斷公主是否碰到雪花、禮物或刀剪,專業的說法叫作“碰撞檢測 ”。在Pyglet 中並沒有提供碰撞檢測的功能,需要編程者自己實現。不過好在GameZero很貼心地提供了碰撞檢測的函數collide(a,b)。
function collide (a,b)
參數a,b是兩個actor對象
function collide (a, x::Integer, y::Integer)
參數a是一個actor對象,x,y是某個座標點
function collide (a, pos::Tuple)
這是上一個函數的變體:
collide(a, pos::Tuple) = collide(a, pos[1], pos[2])
事實上,所謂碰撞檢測,就是使用數學上的兩點之間距離公式算出計兩個角色之間的距離,當這個距離小於某個數值時,就認爲兩個精靈碰撞在一起。這個距離通常以角色的中心點起始計算。如果各位讀者需要自行檢測碰撞,GameZero還提供距離距離檢測函數:
function distance (a::Actor, target::Actor)
function distance(a::Actor, tx, ty)
爲了實現這個遊戲,需要準備一些圖片素材和音樂素材,原書提供的資源包中包含了這些素材。對各種素材的簡單介紹如下:
(1) 在遊戲處於3個不同狀態時分別顯示不同的背景圖像。每個狀態的背景圖像上已經寫上相應的提示信息,這樣可以減少編程的工作量。
(2) 遊戲開始時,玩家有3 顆愛心寶石,每次碰到剪刀就會被扣掉 1 顆。爲簡化編程,在愛心寶石數量變化時,將顯示不同的圖像。
(3) 遊戲進行中使用的公主、雪花、禮物、剪刀的造型圖像採用 PNG 格式。
(4) 在遊戲進行中循環播放一首名爲《鈴兒響叮噹》的伴奏曲。(原書資源包提供的是w4a格式的文件,GameZero不支持播放此類格式的音樂,筆者將其轉變爲MP3格式)
(5) 在公主碰到雪花、禮物或剪刀時播放一個 pop 音效聲。
提示:在進入這個遊戲的編程介紹之前,希望大家先試玩一下,以便更好地瞭解這個遊戲需要實現的各項功能。所以這裏先放出完整的代碼供大家下載試玩。