Libgdx Box2D實戰---放開那小球(三:規則常用的body和精靈結合)

今天介紹規則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和精靈相結合呢?答案我會在下一篇博客揭曉!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章