今天介紹規則body如何和圖片結合。上一篇文章我介紹了box2D的基本知識,如果你用心的話,你會搜索網上相關簡單demo吧。那些我就不寫了。那麼如果我用圖片表示我的那個body,而不是簡單線條,那該怎麼辦?
下面,我以我的項目中小球對象生成爲例,介紹精靈和body如何結合:
下面是創建一個小球類,重要的都註釋了:
public class Ball {
private static final float BALL_RADIUS = 0.15f;// 球半徑
private final Random rand = new Random();
public Body ballModels; //小球body
public Sprite ballSprite;//精靈
public int type; //小球的類型
public Ball(World world,int type) {
BodyDef ballBodyDef = new BodyDef(); //生成一個def
ballBodyDef.type = BodyType.DynamicBody; //定義成小球是不受控制的動態物體
CircleShape shape = new CircleShape(); //定義小球的形狀
shape.setRadius(BALL_RADIUS);
FixtureDef fd = new FixtureDef(); //生成一個Fixture
fd.density = 1; //密度
fd.friction = 0f; //摩擦力
fd.restitution = 0.5f; //彈力
fd.shape = shape;
ballModels = GameScreen.world.createBody(ballBodyDef); //爲body加載def
ballModels.createFixture(fd);//爲body創建fixture
shape.dispose();
reset( type);
}
public void reset(int type){
this.type=type;
float tx = rand.nextFloat() * 1.0f - 0.4f;
float ty = GameScreen.camera.position.y + GameScreen.camera.viewportHeight/2 + BALL_RADIUS;
float angle = rand.nextFloat() * MathUtils.PI * 2;
Vector2 vec = new Vector2();
ballModels.setActive(true);
ballModels.setAwake(true);
ballModels.setLinearVelocity(vec.set(0, 0));
ballModels.setAngularVelocity(0);
ballModels.setTransform(vec.set(0.3f, 10), angle); //小球創建的初始位置
ballSprite = new Sprite(GameCenter.balls[type]); //生成一個精靈
ballSprite.setSize(BALL_RADIUS*2, BALL_RADIUS*2);
ballSprite.setOrigin(BALL_RADIUS, BALL_RADIUS);
}
}
那麼我們可以通過 在遊戲界面中調用Ball ball=new Ball(world,0)產生小球,但是你會發現當你寫好以後並不會產生小球,爲什麼呢?不是它沒產生,而是因爲它是不可見的,所以我們要給他披上一件“外衣”讓我們可以看到它,也就是繪製精靈,並讓精靈和小球這個body同步,這樣不就可以了嘛!
這裏,我寫了一個函數用來同步body和精靈,當我們把這個函數放到Render中不停地刷新:
public ArrayList<Ball> balls = new ArrayList<Ball>();
public ArrayList<Sprite> ballSprites = new ArrayList<Sprite>();
public void ballsRender() {
for (int i = 0; i < balls.size(); i++) {
Vector2 ballPos = balls.get(i).ballModels.getPosition(); <span style="color:#33ff33;">//首先獲得body位置</span>
ballSprites.get(i).setPosition(
ballPos.x - ballSprites.get(i).getWidth() / 2,
ballPos.y - ballSprites.get(i).getHeight() / 2); <span style="color:#33cc00;">//這裏更新精靈位置</span>
ballSprites.get(i).setRotation(
balls.get(i).ballModels.getAngle()
* MathUtils.radiansToDegrees); <span style="color:#33cc00;">//旋轉角度</span>
ballSprites.get(i).draw(batch); <span style="color:#33cc00;"> //繪製精靈</span>
}
}
我想看到這你可以自己去嘗試的寫寫試試吧,沒必要整我這麼多參數,看看能不能實現。如果有什麼問題,可以在下方留言,我會很快答覆的!
好了,以上便是簡單有規則的圖形的實現,目前box2D支持的形狀並不是特別的多,只是一些簡單常用的,你可以去官網上把那些demo仔細研習一下。那麼問題來了,如果遇到不規則的圖形,那麼我們如何將body和精靈相結合呢?答案我會在下一篇博客揭曉!