Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android游戲 >> Android游戲開發 >> Android游戲引擎libgdx使用教程9:libgdx中Box2d的用法

Android游戲引擎libgdx使用教程9:libgdx中Box2d的用法

編輯:Android游戲開發

  在游戲開發中難免會需要模擬現實情況,一般常見的就是模擬物理世界。

       比如物體碰撞,車輛前進,物體下落等。也許有人會覺得原來有實現過一些效果沒有看到用什麼物理知識呢。

       在我看來引入物理引擎並不是必須的,但是這樣可以讓游戲更逼真。物理引擎的話首選Box2d,但是它是C++寫的,直接用不方便。

       在Android游戲開發中使用物理引擎一般有三個比較好的選擇:

       1.JBox2d

       Box2d的Java移植版本,速度有點慢。不過對於不熟悉C++的朋友而言這個可以拿來看看原理。

    2.Havok

       這個就不多說了,我怎麼沒有用過。

       3.Libgdx

        libgdx用了jni封裝了box2d,速度和易用性都不錯。

        下面我們來看看一個示例,原來沒有接觸過box2d的朋友最好先找資料看看。

        代碼如下:

Java代碼
  1. package com.cnblogs.htynkn.listener;  
  2.   
  3. import com.badlogic.gdx.ApplicationListener;   
  4. import com.badlogic.gdx.Gdx;   
  5. import com.badlogic.gdx.graphics.GL10;   
  6. import com.badlogic.gdx.graphics.OrthographicCamera;   
  7. import com.badlogic.gdx.math.Vector2;   
  8. import com.badlogic.gdx.physics.box2d.Body;   
  9. import com.badlogic.gdx.physics.box2d.BodyDef;   
  10. import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;   
  11. import com.badlogic.gdx.physics.box2d.CircleShape;   
  12. import com.badlogic.gdx.physics.box2d.World;   
  13. import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;  
  14.   
  15. public class DemoGame implements ApplicationListener {  
  16.   
  17. protected OrthographicCamera camera;   
  18. protected Box2DDebugRenderer renderer; // 測試用繪制器   
  19. private World world;  
  20.   
  21. @Override   
  22. public void create() {   
  23. camera = new OrthographicCamera(48, 32);   
  24. camera.position.set(0, 15, 0);   
  25. renderer = new Box2DDebugRenderer();   
  26.   
  27. world = new World(new Vector2(0, -9.8f), true); // 一般標准重力場   
  28. BodyDef bd = new BodyDef(); //聲明物體定義   
  29. bd.position.set(2f, 2f);   
  30. bd.type=BodyType.DynamicBody;   
  31. Body b = world.createBody(bd); //通過world創建一個物體   
  32. CircleShape c = new CircleShape(); //創建一個形狀(圓)   
  33. c.setRadius(1f); //設置半徑   
  34. b.createFixture(c, 1f); //將形狀和密度賦給物體   
  35. }  
  36.   
  37. @Override   
  38. public void dispose() {   
  39.   
  40. renderer.dispose();   
  41. world.dispose();  
  42.   
  43. renderer = null;   
  44. world = null;   
  45. }  
  46.   
  47. @Override   
  48. public void pause() {   
  49. // TODO Auto-generated method stub  
  50.   
  51. }  
  52.   
  53. @Override   
  54. public void render() {   
  55. world.step(Gdx.app.getGraphics().getDeltaTime(), 3, 3);   
  56. GL10 gl = Gdx.app.getGraphics().getGL10();   
  57. gl.glClear(GL10.GL_COLOR_BUFFER_BIT);   
  58. camera.update();   
  59. camera.apply(gl);   
  60. renderer.render(world, camera.combined);   
  61. }  
  62.   
  63. @Override   
  64. public void resize(int width, int height) {   
  65. // TODO Auto-generated method stub  
  66.   
  67. }  
  68.   
  69. @Override   
  70. public void resume() {   
  71. // TODO Auto-generated method stub  
  72.   
  73. }  
  74.   
  75. }  

  我們先創建了一個世界,重力為9.8,方向朝下。

        然後聲明了一個物體定義,物體為動態物體(就是可以動那種),如果創建一個圓形,將形狀賦給物體。

        然後調用進行模擬

        world.step(Gdx.app.getGraphics().getDeltaTime(),3,3);

       效果如下:

 Android游戲引擎libgdx使用教程9:libgdx中Box2d的用法


       其實用法什麼沒有大的區別。libgdx並沒有AABB那個類,要這只邊界的話用

       world.QueryAABB(callback,lowerX,lowerY,upperX,upperY)

       就行了。

       形狀的話其實有很多,圓形,方形,矩形,多邊形,可以具體參考Box2d的幫助文件。

       有人覺得使用box2d很復雜,很難和現有的東西聯系起來。其實我覺得box2d用著很方便,特別是和Stage聯系起來很方便。

       用

       Body.setUserData(userData)

       將Actor的名字賦給Body,然後在繪制時用

       Stage.findActor(name)

       改變actor的位置和狀體就行了。

       寫在最後

       這裡想說幾個問題:

       1.Box2d是一個物理引擎,不是一個游戲引擎。它模擬物理世界和法則,但是你的圖像繪制什麼的都是自己處理。

       2.Box2d的單位是米,秒。注意單位換算,不推薦直接用1像素=1米,這樣有些東西會很奇怪的,比例看情況,用個30,,50就行了。

       3.Stage的坐標是左下角,Box2d一般是重心,注意變化。

       4.調試的時候可以用Box2DDebugRenderer,可以清楚看到邊界和重心。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved