天天看点

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>

继续阅读