android遊戲開發架構libgdx的使用(九)—在libgdx中使用Box2d

來源:互聯網
上載者:User

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

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

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

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

1.JBox2d

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

2.Havok

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

3.Libgdx

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

 

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

代碼如下:

package com.cnblogs.htynkn.listener;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;

public class DemoGame implements ApplicationListener {

protected OrthographicCamera camera;
protected Box2DDebugRenderer renderer; // 測試用繪製器
private World world;

@Override
public void create() {
camera = new OrthographicCamera(48, 32);
camera.position.set(0, 15, 0);
renderer = new Box2DDebugRenderer();

world = new World(new Vector2(0, -9.8f), true); // 一般標準重力場
BodyDef bd = new BodyDef(); //聲明物體定義
bd.position.set(2f, 2f);
bd.type=BodyType.DynamicBody;
Body b = world.createBody(bd); //通過world建立一個物體
CircleShape c = new CircleShape(); //建立一個形狀(圓)
c.setRadius(1f); //設定半徑
b.createFixture(c, 1f); //將形狀和密度賦給物體
}

@Override
public void dispose() {

renderer.dispose();
world.dispose();

renderer = null;
world = null;
}

@Override
public void pause() {
// TODO Auto-generated method stub

}

@Override
public void render() {
world.step(Gdx.app.getGraphics().getDeltaTime(), 3, 3);
GL10 gl = Gdx.app.getGraphics().getGL10();
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
camera.apply(gl);
renderer.render(world, camera.combined);
}

@Override
public void resize(int width, int height) {
// TODO Auto-generated method stub

}

@Override
public void resume() {
// TODO Auto-generated method stub

}

}

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

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

然後調用進行類比

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

效果如下:

 

其實用法什麼沒有大的區別。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,可以清楚看到邊界和重心。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.