今天介绍规则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和精灵相结合呢?答案我会在下一篇博客揭晓!