0

Box2d、Cocos2d、および Android の簡単なテストを作成しようとしています。必要なのは、1 つの物体を画面に配置して、重力に反応させることだけです。私はどこでも見ましたが、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()))); 
            }
        }           
    }
}
4

1 に答える 1

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()))); 
    }           
}
于 2013-04-17T09:53:41.650 に答える