接着上一篇,我們完成後續的掃尾工作:遊戲中個物體建立及其碰撞檢測,分數儲存,音效處理。
1.World類:(加入所有物體,及其碰撞檢測,代碼裡有詳細注解)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
<code>package</code> <code>com.zhf.mylibgdx;</code>
<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>import</code> <code>com.badlogic.gdx.math.Vector2;</code>
<code>/**</code>
<code> </code><code>* 統一管理世界中各個部分</code>
<code> </code><code>* @author ZHF</code>
<code> </code><code>*</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> </code>
<code> </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>public</code> <code>float</code> <code>heightSoFar; </code><code>//</code>
<code> </code><code>public</code> <code>int</code> <code>score;</code>
<code> </code><code>public</code> <code>int</code> <code>state;</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>final</code> <code>Bob bob; </code><code>//主角</code>
<code> </code><code>public</code> <code>final</code> <code>List<Spring> springs; </code><code>//彈簧</code>
<code> </code><code>public</code> <code>final</code> <code>List<Squirrel> squirrels; </code><code>//會飛的松鼠</code>
<code> </code><code>public</code> <code>final</code> <code>List<Coin> coins; </code><code>//金币</code>
<code> </code><code>public</code> <code>Castle castle; </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>//初始化遊戲中的物體</code>
<code> </code><code>this</code><code>.bob = </code><code>new</code> <code>Bob(</code><code>5</code><code>, </code><code>1</code><code>);</code>
<code> </code><code>this</code><code>.platforms = </code><code>new</code> <code>ArrayList<Platform>();</code>
<code> </code><code>this</code><code>.springs = </code><code>new</code> <code>ArrayList<Spring>();</code>
<code> </code><code>this</code><code>.squirrels = </code><code>new</code> <code>ArrayList<Squirrel>();</code>
<code> </code><code>this</code><code>.coins = </code><code>new</code> <code>ArrayList<Coin>();</code>
<code> </code>
<code> </code><code>rand = </code><code>new</code> <code>Random();</code>
<code> </code><code>generateLevel(); </code><code>//生成關卡中除了Bob外所有的物體</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> </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> </code><code>if</code> <code>(rand.nextFloat() > </code><code>0</code><code>.9f && type != Platform.PLATFORM_TYPE_MOVING) {</code>
<code> </code><code>Spring spring = </code><code>new</code> <code>Spring(platform.position.x, platform.position.y + Platform.PLATFORM_HEIGHT / </code><code>2</code>
<code> </code><code>+ Spring.SPRING_HEIGHT / </code><code>2</code><code>);</code>
<code> </code><code>springs.add(spring);</code>
<code> </code><code>}</code>
<code> </code><code>//松鼠的位置</code>
<code> </code><code>if</code> <code>(y > WORLD_HEIGHT / </code><code>3</code> <code>&& rand.nextFloat() > </code><code>0</code><code>.8f) {</code>
<code> </code><code>Squirrel squirrel = </code><code>new</code> <code>Squirrel(platform.position.x + rand.nextFloat(), platform.position.y</code>
<code> </code><code>+ Squirrel.SQUIRREL_HEIGHT + rand.nextFloat() * </code><code>2</code><code>);</code>
<code> </code><code>squirrels.add(squirrel);</code>
<code> </code><code>//金币的位置</code>
<code> </code><code>if</code> <code>(rand.nextFloat() > </code><code>0</code><code>.6f) {</code>
<code> </code><code>Coin coin = </code><code>new</code> <code>Coin(platform.position.x + rand.nextFloat(), platform.position.y + Coin.COIN_HEIGHT</code>
<code> </code><code>+ rand.nextFloat() * </code><code>3</code><code>);</code>
<code> </code><code>coins.add(coin);</code>
<code> </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>//城堡的位置是确定的</code>
<code> </code><code>castle = </code><code>new</code> <code>Castle(WORLD_WIDTH / </code><code>2</code><code>, y);</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>updateBob(deltaTime, accelX); </code><code>//重新整理主角</code>
<code> </code><code>updatePlatforms(deltaTime); </code><code>//重新整理跳闆</code>
<code> </code><code>updateSquirrels(deltaTime); </code><code>//重新整理松鼠</code>
<code> </code><code>updateCoins(deltaTime); </code><code>//重新整理金币</code>
<code> </code><code>if</code> <code>(bob.state != Bob.BOB_STATE_HIT) checkCollisions();</code>
<code> </code><code>//遊戲結束判斷</code>
<code> </code><code>checkGameOver();</code>
<code> </code><code>/**碰撞檢測**/</code>
<code> </code><code>private</code> <code>void</code> <code>checkCollisions() {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>checkPlatformCollisions(); </code><code>//跳闆的碰撞</code>
<code> </code><code>checkSquirrelCollisions(); </code><code>//松鼠的碰撞</code>
<code> </code><code>checkItemCollisions(); </code><code>//金币和彈簧的碰撞</code>
<code> </code><code>checkCastleCollisions(); </code><code>//城堡的碰撞</code>
<code> </code><code>/**跳闆碰撞**/</code>
<code> </code><code>private</code> <code>void</code> <code>checkPlatformCollisions() {</code>
<code> </code><code>if</code> <code>(bob.velocity.y > </code><code>0</code><code>) </code><code>return</code><code>;</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>if</code> <code>(bob.position.y > platform.position.y) {</code>
<code> </code><code>//調用工具類中矩形塊碰撞檢測</code>
<code> </code><code>if</code> <code>(OverlapTester.overlapRectangles(bob.bounds, platform.bounds)) {</code>
<code> </code><code>bob.hitPlatform();</code>
<code> </code><code>listener.jump();</code>
<code> </code><code>if</code> <code>(rand.nextFloat() > </code><code>0</code><code>.5f) {</code>
<code> </code><code>platform.pulverize();</code>
<code> </code><code>}</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>/**松鼠碰撞**/</code>
<code> </code><code>private</code> <code>void</code> <code>checkSquirrelCollisions () {</code>
<code> </code><code>int</code> <code>len = squirrels.size();</code>
<code> </code><code>Squirrel squirrel = squirrels.get(i);</code>
<code> </code><code>if</code> <code>(OverlapTester.overlapRectangles(squirrel.bounds, bob.bounds)) {</code>
<code> </code><code>bob.hitSquirrel();</code>
<code> </code><code>listener.hit();</code>
<code> </code><code>/**金币和彈簧碰撞**/</code>
<code> </code><code>private</code> <code>void</code> <code>checkItemCollisions () {</code>
<code> </code><code>int</code> <code>len = coins.size();</code>
<code> </code><code>Coin coin = coins.get(i);</code>
<code> </code><code>if</code> <code>(OverlapTester.overlapRectangles(bob.bounds, coin.bounds)) {</code>
<code> </code><code>coins.remove(coin);</code>
<code> </code><code>len = coins.size();</code>
<code> </code><code>listener.coin();</code>
<code> </code><code>score += Coin.COIN_SCORE; </code><code>//加分</code>
<code> </code><code>if</code> <code>(bob.velocity.y > </code><code>0</code><code>) </code><code>return</code><code>; </code><code>//若是上升狀态不去考慮碰撞檢測</code>
<code> </code><code>len = springs.size();</code>
<code> </code><code>Spring spring = springs.get(i);</code>
<code> </code><code>if</code> <code>(bob.position.y > spring.position.y) {</code>
<code> </code><code>//彈簧的碰撞檢測</code>
<code> </code><code>if</code> <code>(OverlapTester.overlapRectangles(bob.bounds, spring.bounds)) {</code>
<code> </code><code>bob.hitSpring();</code>
<code> </code><code>listener.highJump();</code>
<code> </code><code>/**城堡的碰撞**/</code>
<code> </code><code>private</code> <code>void</code> <code>checkCastleCollisions () {</code>
<code> </code><code>if</code> <code>(OverlapTester.overlapRectangles(castle.bounds, bob.bounds)) {</code>
<code> </code><code>state = WORLD_STATE_NEXT_LEVEL;</code>
<code> </code><code>/**重新整理Bob**/</code>
<code> </code><code>private</code> <code>void</code> <code>updateBob(</code><code>float</code> <code>deltaTime, </code><code>float</code> <code>accelX) {</code>
<code> </code><code>//碰撞跳闆</code>
<code> </code><code>if</code> <code>(bob.state != Bob.BOB_STATE_HIT && bob.position.y <= </code><code>0</code><code>.5f) bob.hitPlatform();</code>
<code> </code><code>//主角x軸方向移動的速度</code>
<code> </code><code>if</code> <code>(bob.state != Bob.BOB_STATE_HIT) bob.velocity.x = -accelX / </code><code>10</code> <code>* Bob.BOB_MOVE_VELOCITY;</code>
<code> </code><code>bob.update(deltaTime);</code>
<code> </code><code>//豎直最大高度</code>
<code> </code><code>heightSoFar = Math.max(bob.position.y, heightSoFar);</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>//取出集合中的跳闆對象,調用其自身的重新整理方法</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>
<code> </code><code>/**重新整理松鼠**/</code>
<code> </code><code>private</code> <code>void</code> <code>updateSquirrels (</code><code>float</code> <code>deltaTime) {</code>
<code> </code><code>squirrel.update(deltaTime);</code>
<code> </code><code>/**重新整理金币**/</code>
<code> </code><code>private</code> <code>void</code> <code>updateCoins (</code><code>float</code> <code>deltaTime) {</code>
<code> </code><code>coin.update(deltaTime);</code>
<code> </code><code>/**遊戲結束判斷**/</code>
<code> </code><code>private</code> <code>void</code> <code>checkGameOver () {</code>
<code> </code><code>//目前的Bob的高度小于場景的高度</code>
<code> </code><code>if</code> <code>(heightSoFar - </code><code>7</code><code>.5f > bob.position.y) {</code>
<code> </code><code>state = WORLD_STATE_GAME_OVER;</code>
<code>}</code>
看着代碼挺多,其實就是一個update()和checkCollisions(),還有重要的generateLevel()。接下來就是渲染WorldRenderer類中繪制各個物體
<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>renderPlatforms(); </code><code>//繪制跳闆</code>
<code> </code><code>renderBob(); </code><code>//繪制主角</code>
<code> </code><code>renderItems(); </code><code>//繪制金币和彈簧</code>
<code> </code><code>renderSquirrels(); </code><code>//繪制松鼠</code>
<code> </code><code>renderCastle(); </code><code>//繪制城堡</code>
<code> </code><code>batch.end();</code>
由于代碼過多,這裡就不一一貼出來了,大家可以自行參考源碼,有注解的哦!
既然添加了遊戲中的物體,那自然又得在Asset中加載資源
聲明:
<code>//遊戲中各種物體</code>
<code> </code><code>public</code> <code>static</code> <code>TextureRegion platform; </code><code>//跳闆</code>
<code> </code><code>public</code> <code>static</code> <code>Animation brakingPlatform; </code><code>//破碎的跳闆(動畫)</code>
<code> </code><code>//主角</code>
<code> </code><code>public</code> <code>static</code> <code>Animation bobJump; </code><code>//跳躍(動畫)</code>
<code> </code><code>public</code> <code>static</code> <code>Animation bobFall; </code><code>//下落(動畫)</code>
<code> </code><code>public</code> <code>static</code> <code>TextureRegion bobHit; </code><code>//碰撞圖檔</code>
<code> </code>
<code> </code><code>public</code> <code>static</code> <code>TextureRegion spring; </code><code>//彈簧</code>
<code> </code><code>public</code> <code>static</code> <code>TextureRegion castle; </code><code>//城堡</code>
<code> </code><code>public</code> <code>static</code> <code>Animation coinAnim; </code><code>//金币 (動畫)</code>
<code> </code><code>public</code> <code>static</code> <code>Animation squirrelFly; </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>
<code> </code><code>brakingPlatform = </code><code>new</code> <code>Animation(</code><code>0</code><code>.2f, </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>new</code> <code>TextureRegion(items, </code><code>64</code><code>, </code><code>176</code><code>, </code><code>64</code><code>, </code><code>16</code><code>),</code>
<code> </code><code>new</code> <code>TextureRegion(items, </code><code>64</code><code>, </code><code>192</code><code>, </code><code>64</code><code>, </code><code>16</code><code>), </code><code>new</code> <code>TextureRegion(items, </code><code>64</code><code>, </code><code>208</code><code>, </code><code>64</code><code>, </code><code>16</code><code>));</code><code>//破碎的跳闆</code>
<code> </code><code>spring = </code><code>new</code> <code>TextureRegion(items, </code><code>128</code><code>, </code><code>0</code><code>, </code><code>32</code><code>, </code><code>32</code><code>); </code><code>//彈簧</code>
<code> </code><code>castle = </code><code>new</code> <code>TextureRegion(items, </code><code>128</code><code>, </code><code>64</code><code>, </code><code>64</code><code>, </code><code>64</code><code>); </code><code>//城堡</code>
<code> </code><code>coinAnim = </code><code>new</code> <code>Animation(</code><code>0</code><code>.2f, </code><code>new</code> <code>TextureRegion(items, </code><code>128</code><code>, </code><code>32</code><code>, </code><code>32</code><code>, </code><code>32</code><code>), </code><code>new</code> <code>TextureRegion(items, </code><code>160</code><code>, </code><code>32</code><code>, </code><code>32</code><code>, </code><code>32</code><code>),</code>
<code> </code><code>new</code> <code>TextureRegion(items, </code><code>192</code><code>, </code><code>32</code><code>, </code><code>32</code><code>, </code><code>32</code><code>), </code><code>new</code> <code>TextureRegion(items, </code><code>160</code><code>, </code><code>32</code><code>, </code><code>32</code><code>, </code><code>32</code><code>)); </code><code>//金币</code>
<code> </code><code>squirrelFly = </code><code>new</code> <code>Animation(</code><code>0</code><code>.2f, </code><code>new</code> <code>TextureRegion(items, </code><code>0</code><code>, </code><code>160</code><code>, </code><code>32</code><code>, </code><code>32</code><code>), </code><code>new</code> <code>TextureRegion(items, </code><code>32</code><code>, </code><code>160</code><code>, </code><code>32</code><code>, </code><code>32</code><code>)); </code><code>//飛着的松鼠</code>
<code> </code><code>//主角</code>
<code> </code><code>bobJump = </code><code>new</code> <code>Animation(</code><code>0</code><code>.2f, </code><code>new</code> <code>TextureRegion(items, </code><code>0</code><code>, </code><code>128</code><code>, </code><code>32</code><code>, </code><code>32</code><code>), </code><code>new</code> <code>TextureRegion(items, </code><code>32</code><code>, </code><code>128</code><code>, </code><code>32</code><code>, </code><code>32</code><code>));</code>
<code> </code><code>bobFall = </code><code>new</code> <code>Animation(</code><code>0</code><code>.2f, </code><code>new</code> <code>TextureRegion(items, </code><code>64</code><code>, </code><code>128</code><code>, </code><code>32</code><code>, </code><code>32</code><code>), </code><code>new</code> <code>TextureRegion(items, </code><code>96</code><code>, </code><code>128</code><code>, </code><code>32</code><code>, </code><code>32</code><code>));</code>
<code> </code><code>bobHit = </code><code>new</code> <code>TextureRegion(items, </code><code>128</code><code>, </code><code>128</code><code>, </code><code>32</code><code>, </code><code>32</code><code>);</code>
運作一下代碼,我們發現,我們操作者主角向上移動,會遇到彈簧,會破碎的跳闆,飛着的松鼠,金币,一切都正常的運作着! 仔細一看,加上金币後分數值沒有改變哦!當然還有死亡的判斷,音效的加入等等。
效果圖:
<a target="_blank" href="http://blog.51cto.com/attachment/201308/155214249.png"></a>
在此先做一個代碼版本,友善初學者能夠清楚的了解代碼
下面我們來完成分值的計算:
在GameScreen中:
<code>/**遊戲運作狀态**/</code>
<code> </code><code>private</code> <code>void</code> <code>updateRunning (</code><code>float</code> <code>deltaTime) {</code>
<code> </code><code>if</code> <code>(Gdx.input.justTouched()) {</code>
<code> </code><code>guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), </code><code>0</code><code>));</code>
<code> </code><code>//點選暫停</code>
<code> </code><code>if</code> <code>(OverlapTester.pointInRectangle(pauseBounds, touchPoint.x, touchPoint.y)) {</code>
<code> </code><code>Assets.playSound(Assets.clickSound);</code>
<code> </code><code>state = GAME_PAUSED;</code>
<code> </code><code>return</code><code>;</code>
<code> </code>
<code> </code><code>ApplicationType appType = Gdx.app.getType();</code>
<code> </code><code>// should work also with Gdx.input.isPeripheralAvailable(Peripheral.Accelerometer)</code>
<code> </code><code>if</code> <code>(appType == ApplicationType.Android || appType == ApplicationType.iOS) {</code>
<code> </code><code>world.update(deltaTime, Gdx.input.getAccelerometerX());</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>float</code> <code>accel = </code><code>0</code><code>;</code>
<code> </code><code>if</code> <code>(Gdx.input.isKeyPressed(Keys.DPAD_LEFT)) accel = 5f;</code>
<code> </code><code>if</code> <code>(Gdx.input.isKeyPressed(Keys.DPAD_RIGHT)) accel = -5f;</code>
<code> </code><code>world.update(deltaTime, accel);</code>
<code> </code><code>//目前分數(變化)</code>
<code> </code><code>if</code> <code>(world.score != lastScore) {</code>
<code> </code><code>lastScore = world.score;</code>
<code> </code><code>scoreString = </code><code>"SCORE: "</code> <code>+ lastScore;</code>
<code> </code><code>//本關結束</code>
<code> </code><code>if</code> <code>(world.state == World.WORLD_STATE_NEXT_LEVEL) {</code>
<code> </code><code>state = GAME_LEVEL_END;</code>
<code> </code><code>//遊戲結束,分值計算</code>
<code> </code><code>if</code> <code>(world.state == World.WORLD_STATE_GAME_OVER) {</code>
<code> </code><code>state = GAME_OVER;</code>
<code> </code><code>if</code> <code>(lastScore >= Settings.highscores[</code><code>4</code><code>])</code>
<code> </code><code>scoreString = </code><code>"NEW HIGHSCORE: "</code> <code>+ lastScore;</code>
<code> </code><code>else</code>
<code> </code><code>scoreString = </code><code>"SCORE: "</code> <code>+ lastScore;</code>
<code> </code><code>//擷取最後分數</code>
<code> </code><code>Settings.addScore(lastScore);</code>
<code> </code><code>//儲存分數</code>
<code> </code><code>Settings.save();</code>
這裡我們每次碰到金币就會加上10分,到遊戲結束後,将最終得分儲存起來,同時更新排行榜。
Settings:
<code>import</code> <code>java.io.BufferedReader;</code>
<code>import</code> <code>java.io.BufferedWriter;</code>
<code>import</code> <code>java.io.IOException;</code>
<code>import</code> <code>java.io.InputStreamReader;</code>
<code>import</code> <code>java.io.OutputStreamWriter;</code>
<code>import</code> <code>com.badlogic.gdx.Gdx;</code>
<code> </code><code>* 設定類:三個方法: 1.load()讀取聲音開關和最高分. 2.save()儲存配置 3.addScore()最高分排行榜,對數組指派。</code>
<code>public</code> <code>class</code> <code>Settings {</code>
<code> </code><code>//記錄聲音開起與關閉</code>
<code> </code><code>public</code> <code>static</code> <code>boolean</code> <code>soundEnabled = </code><code>true</code><code>;</code>
<code> </code><code>//預設分數排行榜分數</code>
<code> </code><code>public</code> <code>final</code> <code>static</code> <code>int</code><code>[] highscores = </code><code>new</code> <code>int</code><code>[] {</code><code>100</code><code>, </code><code>80</code><code>, </code><code>50</code><code>, </code><code>30</code><code>, </code><code>10</code><code>};</code>
<code> </code><code>//儲存的檔案名</code>
<code> </code><code>public</code> <code>final</code> <code>static</code> <code>String file = </code><code>".superjumper"</code><code>;</code>
<code> </code>
<code> </code><code>/**加載配置檔案**/</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>load () {</code>
<code> </code><code>BufferedReader in = </code><code>null</code><code>;</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>in = </code><code>new</code> <code>BufferedReader(</code><code>new</code> <code>InputStreamReader(Gdx.files.external(file).read()));</code>
<code> </code><code>soundEnabled = Boolean.parseBoolean(in.readLine());</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < </code><code>5</code><code>; i++) {</code>
<code> </code><code>highscores[i] = Integer.parseInt(in.readLine());</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>} </code><code>finally</code> <code>{</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>if</code> <code>(in != </code><code>null</code><code>) in.close();</code>
<code> </code><code>} </code><code>catch</code> <code>(IOException e) {</code>
<code> </code><code>/**儲存分值**/</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>save () {</code>
<code> </code><code>BufferedWriter out = </code><code>null</code><code>;</code>
<code> </code><code>//聲音的開關</code>
<code> </code><code>out = </code><code>new</code> <code>BufferedWriter(</code><code>new</code> <code>OutputStreamWriter(Gdx.files.external(file).write(</code><code>false</code><code>)));</code>
<code> </code><code>out.write(Boolean.toString(soundEnabled));</code>
<code> </code><code>//将分數寫入檔案</code>
<code> </code><code>out.write(Integer.toString(highscores[i]));</code>
<code> </code><code>if</code> <code>(out != </code><code>null</code><code>) out.close();</code>
<code> </code><code>/**将所得分數與排行榜分數比較,從高到低重新排一下**/</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>addScore (</code><code>int</code> <code>score) {</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < </code><code>5</code><code>; i++) {</code>
<code> </code><code>if</code> <code>(highscores[i] < score) {</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>j = </code><code>4</code><code>; j > i; j--)</code>
<code> </code><code>highscores[j] = highscores[j - </code><code>1</code><code>];</code>
<code> </code><code>highscores[i] = score;</code>
<code> </code><code>break</code><code>;</code>
再次運作代碼,加了幾個金币,分值發生變化了,回到主界面分數排行榜也發生變化了!(原先預設:<code>100</code><code>, </code><code>80</code><code>, </code><code>50</code><code>, </code><code>30</code><code>, </code><code>10</code>)
<a target="_blank" href="http://blog.51cto.com/attachment/201308/161927800.png"></a>
接下來就是聲音部分:
我們再次回到GameScreen中:
<code>//執行個體化場景</code>
<code> </code><code>worldListener = </code><code>new</code> <code>WorldListener() {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>jump () {</code>
<code> </code><code>Assets.playSound(Assets.jumpSound);</code>
<code> </code><code>public</code> <code>void</code> <code>highJump () {</code>
<code> </code><code>Assets.playSound(Assets.highJumpSound);</code>
<code> </code><code>public</code> <code>void</code> <code>hit () {</code>
<code> </code><code>Assets.playSound(Assets.hitSound);</code>
<code> </code><code>public</code> <code>void</code> <code>coin () {</code>
<code> </code><code>Assets.playSound(Assets.coinSound);</code>
<code> </code><code>};</code>
在監聽器中給對應方法播放對應的聲音,當然少不了在Asset中添加對聲音資源的加載:
<code>//聲音部分</code>
<code> </code><code>public</code> <code>static</code> <code>Sound clickSound; </code><code>//按下音效</code>
<code> </code><code>public</code> <code>static</code> <code>Music music; </code><code>//背景音樂</code>
<code> </code><code>public</code> <code>static</code> <code>Sound jumpSound; </code><code>//跳躍</code>
<code> </code><code>public</code> <code>static</code> <code>Sound highJumpSound; </code><code>//高跳</code>
<code> </code><code>public</code> <code>static</code> <code>Sound hitSound; </code><code>//碰撞</code>
<code> </code><code>public</code> <code>static</code> <code>Sound coinSound; </code><code>//金币</code>
<code>//背景音樂</code>
<code> </code><code>music = Gdx.audio.newMusic(Gdx.files.internal(</code><code>"data/music.mp3"</code><code>));</code>
<code> </code><code>music.setLooping(</code><code>true</code><code>); </code><code>//循環</code>
<code> </code><code>music.setVolume(</code><code>0</code><code>.5f); </code><code>//大小</code>
<code> </code><code>if</code> <code>(Settings.soundEnabled) music.play();</code>
<code> </code>
<code> </code><code>jumpSound = Gdx.audio.newSound(Gdx.files.internal(</code><code>"data/jump.ogg"</code><code>));</code>
<code> </code><code>highJumpSound = Gdx.audio.newSound(Gdx.files.internal(</code><code>"data/highjump.ogg"</code><code>));</code>
<code> </code><code>hitSound = Gdx.audio.newSound(Gdx.files.internal(</code><code>"data/hit.ogg"</code><code>));</code>
<code> </code><code>coinSound = Gdx.audio.newSound(Gdx.files.internal(</code><code>"data/coin.ogg"</code><code>));</code>
<code> </code><code>//點選音效</code>
<code> </code><code>clickSound = Gdx.audio.newSound(Gdx.files.internal(</code><code>"data/click.ogg"</code><code>));</code>
ok!運作一下!貌似沒有什麼問題,對應的聲音都播放出來了!
到此為止,libgdx中demo程式superjumper分版本的學習就結束了,由于本人也是邊學邊總結,中間肯定有許多地方講解的不完善,不妥的地方,這裡先想大家說聲抱歉哈,希望大家發現問題能及時提出來,這樣我也能進步麼!這裡還是那句話,在學習新東西的時候,我們的不求甚解也不失為一種快速掌握的好方法! 希望這一些列學習筆記能幫助到初學者!
本文轉自zhf651555765 51CTO部落格,原文連結:http://blog.51cto.com/smallwoniu/1263957
,如需轉載請自行聯系原作者