對比python學julia(第三章:遊戲編程)--(第三節)瘋狂摩托(1)

3.1.    遊戲介紹

  這是一個考驗玩家反應能力的競速類小遊戲-瘋狂摩托。如原書圖 30-1 所示,遊戲的背景畫面由高速公路、沙漠、仙人掌等構成,駕駛摩托車(車頭朝右)的伊文居於畫面左側,在畫面的左上方顯示摩托車的行駛速度和里程o 在遊戲中,玩家使用鍵盤的 4 個方向鍵來操控摩托車。遊戲開始時,麾託車速度爲 0,經過連續加速,最高速度接近 l40km/h。在摩托車前進的道路上,每隔一段距離就會出現一個作爲障礙物的大箱子。當摩托車接近大箱子時,系統會響起報警聲提醒玩家注意躲避。在高速行駛時,人的反應能力將變得不可靠,如果玩家不小心碰到障礙物,則摩托車速度降爲0。這也提醒我們,在現實生活中千萬不要超速行駛,否則後果不堪設想。

   這個遊戲沒有勝負之分,主要用於測試玩家的反應能力。如果要退出遊戲程序,可以單擊窗口中的“關閉”按鈕。

在編寫這個遊戲之前,先進行試玩,以便更好地瞭解這個遊戲需要實現的各個功能。

  源碼下載:https://files.cnblogs.com/files/zjzkiss/fkmt.rar

3.2.    編程思路

  這是一個精簡版本的賽車競速類小遊戲,被設計用於教學目的,主要實現了模擬動畫、橫屏滾動、 盤操控等技術,現將其編程思路介紹如下。

  1. 模擬動畫

  本遊戲的騎手和摩托是有動態效果的,讓玩家感覺摩托車在開動。原書是通過加載並播放一幅gif動圖來實現。但是GameZero不支持播放gif動圖,即使加載了gif圖,也只能顯示一幀靜態圖片。

  所謂gif動圖,是一個可以將多幅圖像數據存於一起,並逐幀顯示到屏幕上,形成簡單動畫的圖像文件。根據這個原理,我們也可以將角色的圖片循環更換的方式來模擬動畫。

  筆者將原書資源包中的摩托動圖拆解得到六張圖片:

  利用Actor的image屬性,循環顯示這六張圖片,即可達到模擬動畫的效果。

  2.橫屏滾動技術

  運動和靜止都是相對的。在現實世界中,人坐在行駛的汽車裏,如果以汽車作爲參照物,那麼人是靜止的;如果以大地作爲參照物,那麼人是運動的。 這個原理可以被用來設計遊戲。 在這個遊戲中以一輛車頭朝右的摩托車作爲參照物,使其在遊戲窗口中不移動;另控制一幅沙漠公路的背景圖像以摩托車的行駛速度向遊戲窗口左側移動。那麼,從玩家的視角來看,就產生了摩托車在沙漠公路上向前行駛的效果。

  通過移動背景圖像使玩家角色產生運動效果的技術,在遊戲設計中被稱爲屏幕滾動技術。根據需要,可以橫向滾動、垂直滾動或者向任意方向滾動,可以向前或向後滾動,等等。在這個遊戲中,採用向左橫向滾動的方式,並且只能前進,不能後退。

  如原書圖 30-2 所示,(a)和(b)是完全相同的圖像,且圖像能夠實現無縫拼接。當玩家控制摩托車加速時,(a)的起始位置將向窗口左側移動,而(b)的起始位置緊跟着(a)結束的位置,這樣(a)和(b)就被無縫拼接在一起。 從玩家的視角來看,超出窗口的部分是看不見的,在窗口中呈現的是一幅內容不斷變化的背景圖像,並且圖像向左移動的速度與摩托車的前進速度一致,這樣就產生了摩托車向前運動的效果。

  在這個遊戲中實現背景圖像的橫屏滾動,需要計算出圖30-2(a) 和 (b) 的起始位置。雖然摩托車不動,但是仍然需記錄摩托車在X 軸方向的位置變化,並用這個位置計算出圖30_2(a)和(b)的起始位置。假設摩托車的X座標用 motor_x 表示,那麼圖 30_2(a)和(b)起始位置的X座標的計算公式如下:

  (a)的X座標: 0-int(motor_x)% 600;

  (b)的X座標: 600-int(motor_x)% 600。

  其中,公式中的數字 600 是背景圖像的寬度(單位爲像素),且窗口的寬度也被設置爲600像素。

  3.摩托車移動

  在這個遊戲中,使用鍵盤上的4個方向鍵控制摩托車移動,這4個方向鍵的作用如原書的表 30_1。

表 30-1 用於控制摩托車運動的 4 個方向鍵的作用

按鍵名稱

作用

按鍵名稱

作用

向上鍵

控制摩托車向遊戲窗口上方移動

向左鍵

控制摩托車減

向下鍵

控制摩托車向遊戲窗口下方移動

向右鍵

控制摩托加減

  默認情況下,圖像的錨點(造型中心)位於左上角位置,但原書是左下角,因此我們可以利用Actor的bottom屬性,將錨點設定爲左下角。

  如原書圖30-3當摩托車沒有碰到箱子時,摩托車允許在 0~50像素垂直移動,這個距離略小於遊戲背景圖像中公路的高度。如圖 30-3 所示,當摩托車(motor)碰到箱子(box)時,分3種情況進行處理。

  第 1 種情況:當摩托車位於箱子的y座標開始的12像素之內(即 box.y < motor.y <box.y+12)時,摩托車的速度將被降爲0,此時摩托車位於箱子左側,不能前進,但可以向窗口上方或下方移動。

  第 2 種情況:當摩托車位於箱子的 y 座標+l2像索之上(即motor.y >= box.y +12)時,摩托車在垂直方向上只能在box.y+12 到 50 之間移動,此時摩托車會被箱子遮擋,可以繼續前進。

  第 3 種情況:當摩托車位於箱子的 y 座標之下(motor.y < box.y)時,摩托車在垂直方向上只能在 0 到 box.y 之間移動,此時箱子會披摩托車遮擋,可以繼續前進。

  按照上述方法進行處理,使得采用平面圖像的遊戲能夠增加一些立體感,讓玩家獲得更好的遊戲體驗。

  4.計算摩托車速度和里程

  這個遊戲採用寬度爲 600像素的圖像作爲背景,摩托車圖像的寬度84像素。同時,假設摩托車的長度爲2m最高車速爲140km/h,從0加速到140km/h 需要10s(即加速度爲3.89m/s)。

  根據以上數據,先計算出真實摩托車的長度(單位:m)與遊戲中麾託車圖像寬度(單位:像素)的比值 2/84≈0.24,再利用這一比值計算出遊戲中摩托車的最高速度爲140/0.024/3.6≈1620(像索/S),加速度爲3.89/0.024≈162(像素/S)。這樣就實現了按照真實數據模擬麾託車的行駛。

  反之,可以將遊戲中以像素爲單位的麾託車速度和里程換算成現實中以 km 爲單位的數據。 假設用變量 motor_speed 表示遊戲中摩托車的速度 ,則 motor_speed*0.024*3.6可換算成以 km/h 爲單位的行駛速度;假設用 motor_x 表示遊戲中摩托車行駛ns秒後的x座標,則 motor_x * 0.024/1000 可換算成以 km 爲單位的行駛里程。 這樣可以使玩家更好地感受遊戲中摩托車的運動速度。

  5.準備遊戲素材

  爲了實現這個遊戲,需要準備一些圖片素材和音樂素材

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章