天天看點

libgdx遊戲引擎開發筆記(十一)SuperJumper遊戲例子的講解(篇五)---- .遊戲中的物體的建立

   遊戲中物體比較多,這裡源碼裡用了兩個類封裝了遊戲中物體的主要屬性,友善遊戲中物體的封裝。

1.GameObject類:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>package</code> <code>com.zhf.mylibgdx;</code>

<code>import</code> <code>com.badlogic.gdx.math.Rectangle;</code>

<code>import</code> <code>com.badlogic.gdx.math.Vector2;</code>

<code>/**</code>

<code> </code><code>* 所有的遊戲物體都會在一個平面内繪制(或者說在螢幕大小内繪制),那麼所有的物體都應該包含一個位置(position) 和一個作用範圍(bounds)</code>

<code> </code><code>* @author ZHF</code>

<code> </code><code>*</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>GameObject {</code>

<code>    </code><code>public</code> <code>final</code> <code>Vector2 position;  </code><code>//位置</code>

<code>    </code><code>public</code> <code>final</code> <code>Rectangle bounds;  </code><code>//作用範圍</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    </code> 

<code>    </code><code>/**postion在這裡是指遊戲物體的中心點,而bounds中的x ,y 坐标是指這個遊戲原素在螢幕坐标系中的作用起點,也就是矩形的左下角頂點**/</code>

<code>    </code><code>public</code> <code>GameObject(</code><code>float</code> <code>x, </code><code>float</code> <code>y, </code><code>float</code> <code>width, </code><code>float</code> <code>height) {</code>

<code>        </code><code>this</code><code>.position = </code><code>new</code> <code>Vector2(x, y);</code>

<code>        </code><code>this</code><code>.bounds = </code><code>new</code> <code>Rectangle(x - width / </code><code>2</code><code>, y - height / </code><code>2</code><code>, width, height);</code>

<code>    </code><code>}</code>

<code>}</code>

2.DynamicGameObject類

<code> </code><code>* 會移動的遊戲物體</code>

<code>public</code> <code>class</code> <code>DynamicGameObject </code><code>extends</code> <code>GameObject {</code>

<code>    </code><code>//包含了 x, y 軸方向相關的運動資訊。</code>

<code>    </code><code>public</code> <code>final</code> <code>Vector2 velocity;  </code><code>//速度</code>

<code>    </code><code>public</code> <code>final</code> <code>Vector2 accel;   </code><code>//加速度</code>

<code>    </code><code>public</code> <code>DynamicGameObject (</code><code>float</code> <code>x, </code><code>float</code> <code>y, </code><code>float</code> <code>width, </code><code>float</code> <code>height) {</code>

<code>        </code><code>super</code><code>(x, y, width, height);</code>

<code>        </code><code>velocity = </code><code>new</code> <code>Vector2();</code>

<code>        </code><code>accel = </code><code>new</code> <code>Vector2();</code>

   接下來就是讓遊戲中的物體來分别根據自己的情況去繼承它們:

Bob ------&gt; 主角

               Castle -----&gt; 城堡

               Coin -----&gt; 金币

               Platform ------&gt; 平台

               Spring -------&gt; 彈簧

               Squirrel -------&gt; 空中飛行的松鼠

這裡我們先将這六個類寫出來,待會實作一下跳闆是如何顯示出來,我們就大體知道了整個遊戲的邏輯了。ok! 上代碼!

1.Bob類:

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

<code> </code><code>* 主角</code>

<code>public</code> <code>class</code> <code>Bob </code><code>extends</code> <code>DynamicGameObject {</code>

<code>    </code><code>//主角狀态</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>BOB_STATE_JUMP = </code><code>0</code><code>;  </code><code>//跳躍</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>BOB_STATE_FALL = </code><code>1</code><code>;  </code><code>//下落</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>BOB_STATE_HIT = </code><code>2</code><code>;   </code><code>//碰撞</code>

<code>    </code><code>//速度</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>BOB_JUMP_VELOCITY = </code><code>11</code><code>; </code><code>//跳躍的速度</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>BOB_MOVE_VELOCITY = </code><code>20</code><code>;  </code><code>//移動的速度</code>

<code>    </code><code>//寬和高</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>BOB_WIDTH = </code><code>0</code><code>.8f;</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>BOB_HEIGHT = </code><code>0</code><code>.8f;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                     </code> 

<code>    </code><code>int</code> <code>state;  </code><code>//狀态</code>

<code>    </code><code>float</code> <code>stateTime; </code><code>//狀态持時間</code>

<code>    </code><code>public</code> <code>Bob(</code><code>float</code> <code>x, </code><code>float</code> <code>y) {</code>

<code>        </code><code>super</code><code>(x, y, BOB_WIDTH, BOB_HEIGHT);</code>

<code>        </code><code>//初始化狀态</code>

<code>        </code><code>state = BOB_STATE_FALL;</code>

<code>        </code><code>stateTime = </code><code>0</code><code>;</code>

<code>    </code><code>/**重新整理**/</code>

<code>    </code><code>public</code> <code>void</code> <code>update (</code><code>float</code> <code>deltaTime) {</code>

<code>        </code><code>//x,y軸速度的大小</code>

<code>        </code><code>velocity.add(World.gravity.x * deltaTime, World.gravity.y * deltaTime);</code>

<code>        </code><code>//主角目前移動的位置</code>

<code>        </code><code>position.add(velocity.x * deltaTime, velocity.y * deltaTime);</code>

<code>        </code><code>bounds.x = position.x - bounds.width / </code><code>2</code><code>;</code>

<code>        </code><code>bounds.y = position.y - bounds.height / </code><code>2</code><code>;</code>

<code>        </code><code>//跳躍狀态</code>

<code>        </code><code>if</code> <code>(velocity.y &gt; </code><code>0</code> <code>&amp;&amp; state != BOB_STATE_HIT) {</code>

<code>            </code><code>if</code> <code>(state != BOB_STATE_JUMP) {</code>

<code>                </code><code>state = BOB_STATE_JUMP;</code>

<code>                </code><code>stateTime = </code><code>0</code><code>;</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>        </code><code>//下落狀态</code>

<code>        </code><code>if</code> <code>(velocity.y &lt; </code><code>0</code> <code>&amp;&amp; state != BOB_STATE_HIT) {</code>

<code>            </code><code>if</code> <code>(state != BOB_STATE_FALL) {</code>

<code>                </code><code>state = BOB_STATE_FALL;</code>

<code>        </code><code>//邊界限制</code>

<code>        </code><code>if</code> <code>(position.x &lt; </code><code>0</code><code>) position.x = World.WORLD_WIDTH;</code>

<code>        </code><code>if</code> <code>(position.x &gt; World.WORLD_WIDTH) position.x = </code><code>0</code><code>;</code>

<code>        </code><code>//狀态持續時間</code>

<code>        </code><code>stateTime += deltaTime;</code>

<code>    </code><code>/**撞到松鼠**/</code>

<code>    </code><code>public</code> <code>void</code> <code>hitSquirrel () {</code>

<code>        </code><code>velocity.set(</code><code>0</code><code>, </code><code>0</code><code>);</code>

<code>        </code><code>state = BOB_STATE_HIT;</code>

<code>    </code><code>/**撞到跳闆**/</code>

<code>    </code><code>public</code> <code>void</code> <code>hitPlatform () {</code>

<code>        </code><code>velocity.y = BOB_JUMP_VELOCITY;</code>

<code>        </code><code>state = BOB_STATE_JUMP;</code>

<code>    </code><code>/**撞到彈簧**/</code>

<code>    </code><code>public</code> <code>void</code> <code>hitSpring () {</code>

<code>        </code><code>velocity.y = BOB_JUMP_VELOCITY * </code><code>1</code><code>.5f;</code>

2.Castle類:

<code> </code><code>* 城堡</code>

<code>public</code> <code>class</code> <code>Castle </code><code>extends</code> <code>GameObject {</code>

<code>    </code><code>public</code> <code>static</code> <code>float</code> <code>CASTLE_WIDTH = </code><code>1</code><code>.7f;</code>

<code>    </code><code>public</code> <code>static</code> <code>float</code> <code>CASTLE_HEIGHT = </code><code>1</code><code>.7f;</code>

<code>    </code><code>public</code> <code>Castle(</code><code>float</code> <code>x, </code><code>float</code> <code>y) {</code>

<code>        </code><code>super</code><code>(x, y, CASTLE_WIDTH, CASTLE_HEIGHT);</code>

3.Coin類:

<code> </code><code>* 金币</code>

<code>public</code> <code>class</code> <code>Coin </code><code>extends</code> <code>GameObject {</code>

<code>    </code><code>// 寬和高</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>COIN_WIDTH = </code><code>0</code><code>.5f;</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>COIN_HEIGHT = </code><code>0</code><code>.8f;</code>

<code>    </code><code>// 金币的分值</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>COIN_SCORE = </code><code>10</code><code>;</code>

<code>    </code><code>float</code> <code>stateTime; </code><code>// 狀态持續時間</code>

<code>    </code><code>public</code> <code>Coin(</code><code>float</code> <code>x, </code><code>float</code> <code>y) {</code>

<code>        </code><code>super</code><code>(x, y, COIN_WIDTH, COIN_HEIGHT);</code>

<code>    </code><code>public</code> <code>void</code> <code>update(</code><code>float</code> <code>deltaTime) {</code>

4.Platform類:

<code> </code><code>* 跳闆</code>

<code>public</code> <code>class</code> <code>Platform </code><code>extends</code> <code>DynamicGameObject {</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float PLATFORM_WIDTH = </code><code>2</code><code>;</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float PLATFORM_HEIGHT = </code><code>0</code><code>.5f;</code>

<code>    </code><code>//跳闆的類型</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>PLATFORM_TYPE_STATIC = </code><code>0</code><code>;  </code><code>//靜止</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>PLATFORM_TYPE_MOVING = </code><code>1</code><code>;  </code><code>//運動</code>

<code>    </code><code>//跳闆的狀态</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>PLATFORM_STATE_NORMAL = </code><code>0</code><code>; </code><code>//正常</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>PLATFORM_STATE_PULVERIZING = </code><code>1</code><code>; </code><code>//破碎</code>

<code>                                                                                                                                                                                                                                                                                                              </code> 

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float PLATFORM_PULVERIZE_TIME = </code><code>0</code><code>.2f * </code><code>4</code><code>;  </code><code>//破碎所需時間</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float PLATFORM_VELOCITY = </code><code>2</code><code>;  </code><code>//跳闆移動速度</code>

<code>    </code><code>int</code> <code>type;  </code><code>//類型 :靜止、移動</code>

<code>    </code><code>int</code> <code>state;  </code><code>//狀态:正常、破碎</code>

<code>    </code><code>float stateTime;  </code><code>//狀态持續時間</code>

<code>    </code><code>public</code> <code>Platform (</code><code>int</code> <code>type, float x, float y) {</code>

<code>        </code><code>super</code><code>(x, y, PLATFORM_WIDTH, PLATFORM_HEIGHT);</code>

<code>        </code><code>this</code><code>.type = type;</code>

<code>        </code><code>this</code><code>.state = PLATFORM_STATE_NORMAL; </code><code>//正常狀态</code>

<code>        </code><code>this</code><code>.stateTime = </code><code>0</code><code>;</code>

<code>        </code><code>//若為移動類型,指派移動速度</code>

<code>        </code><code>if</code> <code>(type == PLATFORM_TYPE_MOVING) {</code>

<code>            </code><code>velocity.x = PLATFORM_VELOCITY;</code>

<code>    </code><code>public</code> <code>void</code> <code>update (float deltaTime) {</code>

<code>        </code><code>//移動跳闆</code>

<code>            </code><code>//跳闆移動位置</code>

<code>            </code><code>position.add(velocity.x * deltaTime, </code><code>0</code><code>);</code>

<code>            </code><code>bounds.x = position.x - PLATFORM_WIDTH / </code><code>2</code><code>;</code>

<code>            </code><code>bounds.y = position.y - PLATFORM_HEIGHT / </code><code>2</code><code>;</code>

<code>            </code><code>//左邊界限制</code>

<code>            </code><code>if</code> <code>(position.x &lt; PLATFORM_WIDTH / </code><code>2</code><code>) {</code>

<code>                </code><code>velocity.x = -velocity.x;</code>

<code>                </code><code>position.x = PLATFORM_WIDTH / </code><code>2</code><code>;</code>

<code>            </code><code>//右邊界限制</code>

<code>            </code><code>if</code> <code>(position.x &gt; World.WORLD_WIDTH - PLATFORM_WIDTH / </code><code>2</code><code>) {</code>

<code>                </code><code>position.x = World.WORLD_WIDTH - PLATFORM_WIDTH / </code><code>2</code><code>;</code>

<code>    </code><code>/**破碎**/</code>

<code>    </code><code>public</code> <code>void</code> <code>pulverize () {</code>

<code>        </code><code>state = PLATFORM_STATE_PULVERIZING;</code>

<code>        </code><code>velocity.x = </code><code>0</code><code>;</code>

5.Spring類:

<code> </code><code>* 彈簧</code>

<code>public</code> <code>class</code> <code>Spring </code><code>extends</code> <code>GameObject {</code>

<code>    </code><code>public</code> <code>static</code> <code>float</code> <code>SPRING_WIDTH = </code><code>0</code><code>.3f;</code>

<code>    </code><code>public</code> <code>static</code> <code>float</code> <code>SPRING_HEIGHT = </code><code>0</code><code>.3f;</code>

<code>    </code><code>public</code> <code>Spring(</code><code>float</code> <code>x, </code><code>float</code> <code>y) {</code>

<code>        </code><code>super</code><code>(x, y, SPRING_WIDTH, SPRING_HEIGHT);</code>

6.Squirrel類:

<code> </code><code>* 松鼠</code>

<code>public</code> <code>class</code> <code>Squirrel </code><code>extends</code> <code>DynamicGameObject {</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>SQUIRREL_WIDTH = </code><code>1</code><code>;</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>SQUIRREL_HEIGHT = </code><code>0</code><code>.6f;</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>SQUIRREL_VELOCITY = 3f;</code>

<code>                                                                                                                                                                                                                                                                                </code> 

<code>    </code><code>float</code> <code>stateTime = </code><code>0</code><code>;  </code><code>//狀态持續時間</code>

<code>    </code><code>public</code> <code>Squirrel (</code><code>float</code> <code>x, </code><code>float</code> <code>y) {</code>

<code>        </code><code>super</code><code>(x, y, SQUIRREL_WIDTH, SQUIRREL_HEIGHT);</code>

<code>        </code><code>//為松鼠x軸方向指派</code>

<code>        </code><code>velocity.set(SQUIRREL_VELOCITY, </code><code>0</code><code>);</code>

<code>        </code><code>//松鼠移動位置</code>

<code>        </code><code>bounds.x = position.x - SQUIRREL_WIDTH / </code><code>2</code><code>;</code>

<code>        </code><code>bounds.y = position.y - SQUIRREL_HEIGHT / </code><code>2</code><code>;</code>

<code>        </code><code>//左邊界限制</code>

<code>        </code><code>if</code> <code>(position.x &lt; SQUIRREL_WIDTH / </code><code>2</code><code>) {</code>

<code>            </code><code>position.x = SQUIRREL_WIDTH / </code><code>2</code><code>;</code>

<code>            </code><code>velocity.x = SQUIRREL_VELOCITY;</code>

<code>        </code><code>//右邊界限制</code>

<code>        </code><code>if</code> <code>(position.x &gt; World.WORLD_WIDTH - SQUIRREL_WIDTH / </code><code>2</code><code>) {</code>

<code>            </code><code>position.x = World.WORLD_WIDTH - SQUIRREL_WIDTH / </code><code>2</code><code>;</code>

<code>            </code><code>velocity.x = -SQUIRREL_VELOCITY;</code>

以上就是遊戲中六個物體類的代碼,都十分的相似,代碼裡都注釋了,這裡不再一一講解,可能有些變量沒有完全寫出,大家還是以源碼為主,接下來我們要幹的工作就是如何在遊戲界面裡顯示出跳闆?

首先,在World類中:

75

76

77

78

79

80

81

82

83

84

<code>import</code> <code>java.util.ArrayList;</code>

<code>import</code> <code>java.util.List;</code>

<code>import</code> <code>java.util.Random;</code>

<code> </code><code>* 統一管理世界中各個部分</code>

<code>public</code> <code>class</code> <code>World {</code>

<code>    </code><code>/**世界監聽器接口**/</code>

<code>    </code><code>public</code> <code>interface</code> <code>WorldListener {</code>

<code>        </code><code>//跳躍</code>

<code>        </code><code>public</code> <code>void</code> <code>jump ();</code>

<code>        </code><code>//高跳</code>

<code>        </code><code>public</code> <code>void</code> <code>highJump ();</code>

<code>        </code><code>//碰撞</code>

<code>        </code><code>public</code> <code>void</code> <code>hit ();</code>

<code>        </code><code>//收集金币</code>

<code>        </code><code>public</code> <code>void</code> <code>coin ();</code>

<code>                                                                                                                                                                                                             </code> 

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>WORLD_WIDTH = </code><code>10</code><code>;</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>float</code> <code>WORLD_HEIGHT = </code><code>15</code> <code>* </code><code>20</code><code>;</code>

<code>    </code><code>//狀态</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>WORLD_STATE_RUNNING = </code><code>0</code><code>;  </code><code>//運作</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>WORLD_STATE_NEXT_LEVEL = </code><code>1</code><code>;  </code><code>//下一關</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>int</code> <code>WORLD_STATE_GAME_OVER = </code><code>2</code><code>;  </code><code>//遊戲結束</code>

<code>    </code><code>//世界監聽器</code>

<code>    </code><code>public</code>  <code>WorldListener listener;</code>

<code>    </code><code>//重力</code>

<code>    </code><code>public</code> <code>static</code> <code>final</code> <code>Vector2 gravity = </code><code>new</code> <code>Vector2(</code><code>0</code><code>, -</code><code>12</code><code>);</code>

<code>    </code><code>//随機數</code>

<code>    </code><code>public</code> <code>Random rand;</code>

<code>    </code><code>//遊戲中物體</code>

<code>    </code><code>public</code> <code>final</code> <code>List&lt;Platform&gt; platforms;  </code><code>//跳闆</code>

<code>    </code><code>public</code> <code>World(WorldListener listener) {</code>

<code>        </code><code>this</code><code>.listener = listener;</code>

<code>        </code><code>this</code><code>.platforms = </code><code>new</code> <code>ArrayList&lt;Platform&gt;();</code>

<code>                                                                                                                                                                                                                 </code> 

<code>        </code><code>rand = </code><code>new</code> <code>Random();</code>

<code>        </code><code>generateLevel();</code>

<code>    </code><code>/**生成關卡中除了Bob外所有的物體**/</code>

<code>    </code><code>private</code> <code>void</code> <code>generateLevel() {</code>

<code>        </code><code>float</code> <code>y = Platform.PLATFORM_HEIGHT / </code><code>2</code><code>;</code>

<code>        </code><code>float</code> <code>maxJumpHeight = Bob.BOB_JUMP_VELOCITY * Bob.BOB_JUMP_VELOCITY / (</code><code>2</code> <code>* -gravity.y);</code>

<code>        </code><code>while</code> <code>(y &lt; WORLD_HEIGHT - WORLD_WIDTH / </code><code>2</code><code>) {</code>

<code>            </code><code>int</code> <code>type = rand.nextFloat() &gt; </code><code>0</code><code>.8f ? Platform.PLATFORM_TYPE_MOVING : Platform.PLATFORM_TYPE_STATIC;</code>

<code>            </code><code>float</code> <code>x = rand.nextFloat() * (WORLD_WIDTH - Platform.PLATFORM_WIDTH) + Platform.PLATFORM_WIDTH / </code><code>2</code><code>;</code>

<code>            </code><code>Platform platform = </code><code>new</code> <code>Platform(type, x, y);</code>

<code>            </code><code>platforms.add(platform);</code>

<code>                                                                                                                                                                                                                     </code> 

<code>            </code><code>y += (maxJumpHeight - </code><code>0</code><code>.5f);</code>

<code>            </code><code>y -= rand.nextFloat() * (maxJumpHeight / </code><code>3</code><code>);</code>

<code>    </code><code>/**重新整理界面**/</code>

<code>    </code><code>public</code> <code>void</code> <code>update(</code><code>float</code> <code>deltaTime, </code><code>float</code> <code>accelX) {</code>

<code>        </code><code>updatePlatforms(deltaTime);</code>

<code>    </code><code>/**重新整理跳闆**/</code>

<code>    </code><code>private</code> <code>void</code> <code>updatePlatforms(</code><code>float</code> <code>deltaTime) {</code>

<code>        </code><code>int</code> <code>len = platforms.size();</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; len; i++) {</code>

<code>            </code><code>Platform platform = platforms.get(i);</code>

<code>            </code><code>//取出集合中的跳闆對象,調用其自身的重新整理方法</code>

<code>            </code><code>platform.update(deltaTime);</code>

<code>            </code><code>//若狀态為破碎狀态,将該跳闆對象移除出去</code>

<code>            </code><code>if</code> <code>(platform.state == Platform.PLATFORM_STATE_PULVERIZING &amp;&amp; platform.stateTime &gt; Platform.PLATFORM_PULVERIZE_TIME) {</code>

<code>                </code><code>platforms.remove(platform);</code>

<code>                </code><code>len = platforms.size();</code>

分析:這裡我們還是在上一講的代碼的基礎上,增加了platform對象及其執行個體化,還有與其相關的重新整理方法。最重要的是在World的構造方法中,初始化跳闆集合,并且調用了 generateLevel()方法來生成關卡中除了Bob外所有的物體。

   遊戲中物體的建立主要是圍繞Platform來生成的。在While循環内,通過不斷增加y坐标的值,使用随機數rand 和 物體的内置屬性來生成不同的遊戲物體。比如,對于Playform 有移動和不移動兩種,同時它内置的寬度為2(每機關為32個像素),高度為0.5,結合rand就能達到随機生成Playform的效果。

其次就是WorldRenderer類:

<code>import</code> <code>com.badlogic.gdx.graphics.OrthographicCamera;</code>

<code>import</code> <code>com.badlogic.gdx.graphics.g2d.SpriteBatch;</code>

<code>import</code> <code>com.badlogic.gdx.graphics.g2d.TextureRegion;</code>

<code> </code><code>* 用來把每個對象關聯相應的圖檔資源,同時控制相機,實作動畫。</code>

<code>public</code> <code>class</code> <code>WorldRenderer {</code>

<code>    </code><code>static</code> <code>final</code> <code>float</code> <code>FRUSTUM_WIDTH = </code><code>10</code><code>;</code>

<code>    </code><code>static</code> <code>final</code> <code>float</code> <code>FRUSTUM_HEIGHT = </code><code>15</code><code>;</code>

<code>                                                                                                                                      </code> 

<code>    </code><code>World world;  </code><code>//世界</code>

<code>    </code><code>OrthographicCamera cam;  </code><code>//相機</code>

<code>    </code><code>SpriteBatch batch;  </code><code>//用于繪畫</code>

<code>    </code><code>TextureRegion background;  </code><code>//背景圖檔</code>

<code>    </code><code>public</code> <code>WorldRenderer(SpriteBatch batch, World world) {</code>

<code>        </code><code>this</code><code>.world = world;</code>

<code>        </code><code>//OrthographicCamera 被定義成 寬度為10,高度為15,同樣的也把相機對準中心點。</code>

<code>        </code><code>this</code><code>.cam = </code><code>new</code> <code>OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT);</code>

<code>        </code><code>//它指定了和螢幕一樣大小的 OrthographicCamera ,并把相機對準螢幕的中心。</code>

<code>        </code><code>this</code><code>.cam.position.set(FRUSTUM_WIDTH / </code><code>2</code><code>, FRUSTUM_HEIGHT / </code><code>2</code><code>, </code><code>0</code><code>);</code>

<code>        </code><code>this</code><code>.batch = batch;</code>

<code>    </code><code>/**渲染**/</code>

<code>    </code><code>public</code> <code>void</code> <code>render () {</code>

<code>        </code><code>cam.update();</code>

<code>        </code><code>//它的作用都是通過把映射矩陣綁定給SpritBatch,告訴SpritBatch怎麼去繪制圖形</code>

<code>        </code><code>batch.setProjectionMatrix(cam.combined);</code>

<code>        </code><code>//渲染背景</code>

<code>        </code><code>renderBackground();</code>

<code>        </code><code>//渲染遊戲中各種元素(Bob,跳闆,松鼠,彈簧。。)下一講中會具體講到</code>

<code>        </code><code>renderObjects();</code>

<code>    </code><code>/**渲染遊戲中各種物體(Bob,跳闆,松鼠,彈簧,城堡,金币)**/</code>

<code>    </code><code>private</code> <code>void</code> <code>renderObjects() {</code>

<code>        </code><code>batch.enableBlending();</code>

<code>        </code><code>batch.begin();</code>

<code>        </code><code>//繪制跳闆</code>

<code>        </code><code>renderPlatforms();</code>

<code>                                                                                                                                          </code> 

<code>        </code><code>batch.end();</code>

<code>    </code><code>/**渲染背景**/</code>

<code>    </code><code>public</code> <code>void</code> <code>renderBackground () {</code>

<code>        </code><code>batch.disableBlending();</code>

<code>        </code><code>batch.draw(Assets.backgroundRegion, cam.position.x - FRUSTUM_WIDTH / </code><code>2</code><code>, cam.position.y - FRUSTUM_HEIGHT / </code><code>2</code><code>, FRUSTUM_WIDTH,</code>

<code>            </code><code>FRUSTUM_HEIGHT);</code>

<code>    </code><code>/**渲染跳闆**/</code>

<code>    </code><code>private</code> <code>void</code> <code>renderPlatforms () {</code>

<code>        </code><code>int</code> <code>len = world.platforms.size();</code>

<code>            </code><code>Platform platform = world.platforms.get(i);</code>

<code>            </code><code>TextureRegion keyFrame = Assets.platform;</code>

<code>//          if (platform.state == Platform.PLATFORM_STATE_PULVERIZING) {</code>

<code>//              keyFrame = Assets.brakingPlatform.getKeyFrame(platform.stateTime, Animation.ANIMATION_NONLOOPING);</code>

<code>//          }</code>

<code>            </code><code>batch.draw(keyFrame, platform.position.x - </code><code>1</code><code>, platform.position.y - </code><code>0</code><code>.25f, </code><code>2</code><code>, </code><code>0</code><code>.5f);</code>

分析:

 1.在該類中,我們寫了一個方法renderObjects()用于渲染遊戲中各種物體(Bob,跳闆,松鼠,彈簧,城堡,金币)

   2.渲染跳闆renderPlatforms ()方法裡我們取出集合中的跳闆對象,對應加載資源,并将其繪制出來。

   最後,就是在Asset類中加載跳闆資源

聲明:

<code>//遊戲中各種物體</code>

<code>public</code> <code>static</code> <code>TextureRegion platform;  </code><code>//跳闆</code>

執行個體化:

<code>//遊戲中各個物體</code>

<code>    </code><code>platform = </code><code>new</code> <code>TextureRegion(items, </code><code>64</code><code>, </code><code>160</code><code>, </code><code>64</code><code>, </code><code>16</code><code>);  </code><code>//跳闆</code>

   運作一下,效果圖:(每次運作起來跳闆的位置都是随機的)

 目前遊戲還是沒有主人公哦,在下一講中,我們會加上主人公,同時顯示出其他遊戲物體,當然還有最重要的遊戲碰撞檢測,以及場景的移動。

<b>     本文轉自zhf651555765 51CTO部落格,原文連結:http://blog.51cto.com/smallwoniu/1263869</b><b>,如需轉載請自行聯系原作者</b>

繼續閱讀