本章主要介紹遊戲中演員的添加。
工具/原料
libgdx
Adding the Actors 添加演員
這一章中我們將要實現剩下的在我們遊戲世界中充當演員的遊戲對象。有我們的玩家角色-兔子頭圖片和所有的可收集的物品;金幣和羽毛。我們還將在level加載器中實現我們的遊戲對象來完成我們的level加載器,以便在level被加載後可以適當的管理遊戲對象。
我們還將使用一個簡單的物理模擬來擴展遊戲特性,他允許所有的遊戲對象擁有一些物理特性比如速度、加速度、和摩擦力。另外遊戲還要支持碰撞檢測來觸法某一個特定的事件。例如我們需要遊戲玩家可以跳躍站立或者在石頭上奔跑,當接觸某個遊戲對像是收集它,或者在落水是丟失一條性命。遊戲的代碼還有包括檢測遊戲結束的條件是否已經達到,如果達到遊戲結束的條件,遊戲應該馬上結束,並且彈出Game Over字樣。
GUI在遊戲中的羽毛對象被收集時將會繪製一個小的羽毛圖標。還會有一個數字顯示在羽毛圖標的旁邊來顯示收集羽毛之後帶來的升高(遊戲玩家可以通過連續跳躍在空中飛行)的效果還有多久結束。
Implementing the actor game objects 實現遊戲演員對象
首先我們通過添加一些另外的屬性來和物理機能以及收集物品的檢測代碼來擴展AbstractGameObject類來做一些準備工作。
在AbstractGameObject添加如下導入代碼:
import com.badlogic.gdx.math.Rectangle;
然後添加下面的成員變量和初始化代碼到同一個類中:
。。。 。。。
The following list contains a brief description of the purposeof each variable:
下面的列表是一個對於每個變量的目的的一個簡明的描述。
• velocity: 當前的遊戲玩家速度——— m/s.
• terminalVelocity: 玩家的正負最大速度—— m/s.
• friction: 反向作用力用來降低玩家速度,直到玩家的速度為0為止。這個值作為一個無因次的(不具因次的物理量稱為無因次量,就是純數,如圓周率π、雷諾數Re等。)係數被給出。如果這個值為0這表示沒有摩擦力,因此對象的速度將不會減小。
• acceleration: 對象的常量加速度—— m/s².
• bounds: 對象的輪廓盒子()用於和其他對對象之間的碰撞檢測。輪廓盒子可以被設置成任意的尺寸,他完全有遊戲世界中的對象的尺寸決定。
我們現在將使用velocity, terminalVelocity, friction, 和acceleration.屬性添加一些簡單的物理模擬。
把下面的導入代碼添加到 AbstractGameObject:
import com.badlogic.gdx.math.MathUtils;
另外在同一個類中添加如下代碼:
。。。 。。。
最後在已經存在的 update()方法中實現如下代碼的改變:
。。。 。。。
兩個新的方法:updateMotionX()和 updateMotionY()將會在每一個update週期中被調用用來根據給定的delta time計算遊戲對象在X和Y上的速度。這個計算分三步完成:
1.如果遊戲對象的速度不是0,遊戲對象肯定是在運動。所以摩擦裡應該起作用來降低對對象的速度。由於摩擦力的目的是用來降低速率,所以它可以從正速度中減去,或者在負速度上加上一個數值。當代數標記完全停止時(意思就是當對象的速度由於摩擦裡降低到0時)立刻使用
Math.max和Math.min函數直接把速率設置為0.
2. 然後加速度作用於當前速率.
3. 最後,確保新的速率一直在正負速率的最大範圍之內.
在速率的兩個組成部分都被跟新後,通過添加一個新的速率矢量到上一個點的矢量上實現對對象真實運動的模擬。