ID #59398

android中使用Box2D的Rokon

    我们要想实现上面效果图的效果,其实也不是很难的。主要用到了三个类。这三个类都有不同的用处。第一个类是RokonActivity.Java ,入口类,负责创建引擎加载图片资源。然后是Textures.java,加载资源的具体实现类。第三个类DonateScene.java,场景类,主要是往世界里添加精灵。只要实现这三个类的话,你就能实现和效果图一样的效果了。那么我们就来看看具体的代码吧。
java代码
  1. import com.stickycoding.rokon.DrawPriority;  
  2. import com.stickycoding.rokon.RokonActivity;  
  3.   
  4. public class Donate extends RokonActivity {  
  5.   
  6. public static final float GAME_WIDTH = 8f;  
  7.   
  8. public static final float GAME_HEIGHT = 4.8f;  
  9.   
  10. private DonateScene scene;  
  11.   
  12. public void onCreate() {  
  13.   
  14. // 调试模式  
  15. debugMode();  
  16.   
  17. // 强制全屏  
  18. forceFullscreen();  
  19.   
  20. // 强制横屏  
  21. forceLandscape();  
  22.   
  23. // 设置游戏尺寸  
  24. setGameSize(GAME_WIDTH, GAME_HEIGHT);  
  25.   
  26. // 使用VBO‘S渲染方式   
  27. setDrawPriority(DrawPriority.PRIORITY_VBO);  
  28.   
  29. // 设置图片路径  
  30. setGraphicsPath("textures/");  
  31.   
  32. // 创建引擎  
  33. createEngine();  
  34.   
  35. }  
  36.   
  37. // 引擎创建完成时调用  
  38. public void onLoadComplete() {  
  39.   
  40. // 加载贴图资源  
  41. Textures.load();  
  42.   
  43. // 设置场景  
  44. setScene(scene = new DonateScene());  
  45.   
  46. }  
  47.   
  48. }  

加载资源的具体实现类Textures.java
java代码
  1. import com.stickycoding.rokon.Texture;  
  2.   
  3. import com.stickycoding.rokon.TextureAtlas;  
  4.   
  5. public class Textures {  
  6.   
  7. // 静态的资源管理类  
  8. public static TextureAtlas atlas;  
  9.   
  10. // 资源类  
  11. public static Texture background, box;  
  12.   
  13. public static void load() {  
  14.   
  15. atlas = new TextureAtlas();  
  16.   
  17. atlas.insert(background = new Texture("background.png"));  
  18.   
  19. atlas.insert(box = new Texture("box.png"));  
  20.   
  21. // 资源管理类调用complete()方法之后无法再添加其他资源类。  
  22. atlas.complete();  
  23.   
  24. }  
  25.   
  26. }  

场景类DonateScene.java
java代码
  1. import android.util.Log;  
  2. import android.view.MotionEvent;  
  3. import com.badlogic.gdx.math.Vector2;  
  4. import com.badlogic.gdx.physics.box2d.World;  
  5. import com.stickycoding.rokon.PhysicalSprite;  
  6. import com.stickycoding.rokon.Scene;  
  7. import com.stickycoding.rokon.background.FixedBackground;  
  8.   
  9. public class DonateScene extends Scene {  
  10.   
  11.   
  12. // 小方块的个数,数量加大,卡的明显(骨头测试手机G2)  
  13. private static final int BOX_COUNT = 6;  
  14.   
  15. // Box2D的世界类,  
  16. private  World world;  
  17.   
  18. // 静态的背景  
  19. private FixedBackground background;  
  20.   
  21. // 向量类  
  22. private Vector2 gravity;  
  23.   
  24. // 精灵类  
  25. private PhysicalSprite[] wall, box;   
  26.   
  27. public DonateScene() {  
  28.   
  29. // 创建场景(层的个数,精灵饿个数)  
  30. super(3, new int[] { 1, BOX_COUNT, 1 });  
  31.   
  32. setBackground(background = new FixedBackground(Textures.background));  
  33.   
  34. // gravity参数,经测试,是设置原点坐标,重力方向。  
  35. setWorld(world = new World(gravity = new Vector2(0, 0), false));  
  36.   
  37. createWalls();  
  38.   
  39. createBoxes();  
  40.   
  41. }  
  42.   
  43. // 由于要Box2d效果,所以需要建四面墙。  
  44. private void createWalls() {  
  45.   
  46. wall = new PhysicalSprite[4];  
  47.   
  48. wall[0] = new  PhysicalSprite(0, -1, Donate.GAME_WIDTH, 1);  
  49.   
  50. wall[0].createStaticBox();  
  51.   
  52. add(0, wall[0]);  
  53.   
  54. wall[1] = new PhysicalSprite(Donate.GAME_WIDTH, 0, 1,  
  55.   
  56. Donate.GAME_HEIGHT);  
  57.   
  58. wall[1].createStaticBox();  
  59.   
  60. add(0, wall[1]);  
  61.   
  62. wall[2] = new PhysicalSprite(0, Donate.GAME_HEIGHT, Donate.GAME_WIDTH, 1);  
  63.   
  64. wall[2].createStaticBox();  
  65.   
  66. add(0, wall[2]);  
  67.   
  68. wall[3] = new PhysicalSprite(-1, 0, 1, Donate.GAME_HEIGHT);  
  69.   
  70. wall[3].createStaticBox();  
  71.   
  72. add(0, wall[3]);  
  73.   
  74.   
  75. }  
  76.   
  77. // 建立BOX_COUNT个精灵。  
  78. private void createBoxes() {  
  79.   
  80. box = new PhysicalSprite[BOX_COUNT];  
  81.   
  82. for (int i = 0; i < BOX_COUNT; i++) {  
  83.   
  84. box = new PhysicalSprite((float) Math.random()  
  85.   
  86. * Donate.GAME_WIDTH, (float) Math.random()  
  87.   
  88. * Donate.GAME_HEIGHT, 0.2f + (float) Math.random() * 0.5f,  
  89.   
  90. 0.2f + (float) Math.random() * 0.5f);  
  91.   
  92.   
  93. box.setTexture(Textures.box);  
  94.   
  95. box.setRGBA((float) Math.random(), (float) Math.random(),(float) Math.random(), 1);  
  96.   
  97. box.createDynamicBox();  
  98.   
  99. // 给没有贴图的精灵加边框  
  100. box.setBorder(0, 0, 0, 1);  
  101.   
  102. // 添加到第2层  
  103. add(1, box);  
  104.   
  105. }  
  106.   
  107. }  
  108.   
  109. int x = 0, y = 0;  
  110.   
  111. @Override  
  112. public void onGameLoop() {  
  113.   
  114. }  
  115.   
  116. @Override  
  117. public void onPause() {  
  118.   
  119. }  
  120.   
  121. @Override  
  122. public void onResume() {  
  123.   
  124. }  
  125.   
  126.   
  127. @Override  
  128. public void onReady() {  
  129.   
  130. }  
  131.   
  132.   
  133. @Override  
  134. public void onTouchDown(float x, float y, MotionEvent event,  
  135.   
  136. int pointerCount, int pointerId) {  
  137.   
  138. // 测试gravity参数方法:作用为设置重力方向。  
  139. gravity.set(8 - (float) Math.random() * 16,8 - (float) Math.random() * 16);  
  140.   
  141. world.setGravity(gravity);  
  142.   
  143. Log.i("""xx=" + world.getGravity().x + " yy=" + world.getGravity().y);  
  144.   
  145. }  
  146.   
  147. }