遊戲中物體比較多,這裡源碼裡用了兩個類封裝了遊戲中物體的主要屬性,友善遊戲中物體的封裝。
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 ------> 主角
Castle -----> 城堡
Coin -----> 金币
Platform ------> 平台
Spring -------> 彈簧
Squirrel -------> 空中飛行的松鼠
這裡我們先将這六個類寫出來,待會實作一下跳闆是如何顯示出來,我們就大體知道了整個遊戲的邏輯了。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 > </code><code>0</code> <code>&& 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 < </code><code>0</code> <code>&& 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 < </code><code>0</code><code>) position.x = World.WORLD_WIDTH;</code>
<code> </code><code>if</code> <code>(position.x > 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 < 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 > 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 < 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 > 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<Platform> 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<Platform>();</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 < WORLD_HEIGHT - WORLD_WIDTH / </code><code>2</code><code>) {</code>
<code> </code><code>int</code> <code>type = rand.nextFloat() > </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 < 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 && platform.stateTime > 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>