Box2d Cocos2d Android重力无法正常工作

时间:2013-04-17 09:50:08

标签: android box2d cocos2d-android

我正在尝试为Box2d,Cocos2d和Android创建一个简单的测试。我只需要在屏幕上放一个身体,让它对重力做出反应。我到处寻找,有非Android应用程序的很好的教程,但没有一个在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()))); 
            }
        }           
    }
}

1 个答案:

答案 0 :(得分:1)

我的猜测是这一行可能是问题.-

world.step(1/60, 10, 10);

step函数根据自上一步以来经过的时间处理主体位置。您正在进行整数除法1/60,结果为0。请尝试使用1.0f / 60.0f

否则,你告诉你的世界自上一步以来经过了0毫秒,所以身体将始终保持在初始位置。

然而,对您的时间步骤进行“硬编码”并不是一个好习惯。您最好将接收的增量时间传递给您的世界.-

world.step(dt, 10, 10);

此外,您可以简化循环以适用于附加body的任何CCSprite,如下所示.-

for (Body b = world.getBodyList(); b != null; b = b.getNext()) {
    CCSprite sprite = (CCSprite)b.getUserData();
    if(sprite != null) {
        sprite.setPosition(worldToScreen(b.getPosition())));     
        sprite.setRotation(-1.0f * (float)Math.toDegrees((b.getAngle()))); 
    }           
}