天天看点

libgdx游戏引擎开发笔记(十三)SuperJumper游戏例子的讲解(篇七)----各个物体的创建及其碰撞检测

   接着上一篇,我们完成后续的扫尾工作:游戏中个物体创建及其碰撞检测,分数保存,音效处理。

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&lt;Platform&gt; 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&lt;Spring&gt; springs;  </code><code>//弹簧</code>

<code>    </code><code>public</code> <code>final</code> <code>List&lt;Squirrel&gt; squirrels; </code><code>//会飞的松鼠</code>

<code>    </code><code>public</code> <code>final</code> <code>List&lt;Coin&gt; 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&lt;Platform&gt;();</code>

<code>        </code><code>this</code><code>.springs = </code><code>new</code> <code>ArrayList&lt;Spring&gt;();</code>

<code>        </code><code>this</code><code>.squirrels = </code><code>new</code> <code>ArrayList&lt;Squirrel&gt;();</code>

<code>        </code><code>this</code><code>.coins = </code><code>new</code> <code>ArrayList&lt;Coin&gt;();</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 &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>            </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() &gt; </code><code>0</code><code>.9f &amp;&amp; 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 &gt; WORLD_HEIGHT / </code><code>3</code> <code>&amp;&amp; rand.nextFloat() &gt; </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() &gt; </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 &gt; </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 &lt; len; i++) {</code>

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

<code>            </code><code>if</code> <code>(bob.position.y &gt; 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() &gt; </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 &gt; </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 &gt; 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 &amp;&amp; bob.position.y &lt;= </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 &amp;&amp; platform.stateTime &gt; 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 &gt; 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 &gt;= 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 &lt; </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 &lt; </code><code>5</code><code>; i++) {</code>

<code>            </code><code>if</code> <code>(highscores[i] &lt; score) {</code>

<code>                </code><code>for</code> <code>(</code><code>int</code> <code>j = </code><code>4</code><code>; j &gt; 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

,如需转载请自行联系原作者