我正在尝试为Box2d,Cocos2d和Android创建一个简单的测试。我需要的只是将一个物体放在屏幕上,并对重力做出反应。我到处寻找,非Android应用程序有很好的教程,但是它们都没有在Android上运行。谁能帮忙?Box2d Cocos2d Android重力不起作用
这是我正在使用的代码。我接过来,从这里轻易修改:http://www.expobrain.net/2012/05/12/box2d-physics-simulation-on-android/
创造世界:
World world = new World(new Vec2(2.0f, 8.0f), false);
而且这是我创建的身体:
public void setupBallBody() {
CGSize size = CCDirector.sharedDirector().winSize();
CGPoint pos = CGPoint.make(size.width/1.2f, size.height/1.2f);
// Create Dynamic Body
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DYNAMIC;
bodyDef.position.set(screenToWorld(pos));
ballBody = world.createBody(bodyDef);
MassData md = new MassData();
md.mass = 5;
ballBody.setMassData(md);
// Create Shape
CircleShape ballShape = new CircleShape();
ballShape.m_radius = SMILE_RADIUS;
// Create fixture
FixtureDef ballFixture = new FixtureDef();
ballFixture.shape = ballShape;
ballFixture.density = SMILE_DENSITY;
ballFixture.friction = SMILE_FRICTION;
ballFixture.restitution = SMILE_RESTITUTION;
// Assign fixture to Body
ballBody.createFixture(ballFixture);
// Set sprite
final CCSprite ballSprite = CCSprite.sprite("ball.jpg");
ballSprite.setPosition(pos);
addChild(ballSprite, 0);
ballBody.setUserData(ballSprite);
}
这是我的“嘀”的方法(我不知道是什么使重力工作的一部分,但为了完整性我将它包括在内)。
public void tick(float dt) {
synchronized (world) {
world.step(1/60, 10, 10);
}
// Update sprites
for (Body b = world.getBodyList(); b != null; b = b.getNext()) {
if(b == ballBody) {
CCSprite ballSprite = (CCSprite)ballBody.getUserData();
if(ballSprite != null) {
ballSprite.setPosition(worldToScreen(ballBody.getPosition())));
ballSprite.setRotation(-1.0f * (float)Math.toDegrees((ballBody.getAngle())));
}
}
}
}
谢谢, @ssantos。我试过了,所以时间步是0.016666668,但这并没有改变任何东西。球仍然静止。 – Eddy
恩,更多的想法,你不需要手动设置'海量数据',因为'box2d'会为每个'fixture'计算出合适的质量。 'SMILE_DENSITY'的价值是什么?我假设'worldToScreen'函数正在处理像素到米转换,不是吗? – ssantos
好的,我删除了massdata设置。 SMILE_DENSITY = 0.25f; SMILE_FRICTION = 0.1f; SMILE_RESTITUTION = 0.7f; – Eddy