2013-04-17 41 views
0

我正在尝试为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()))); 
      } 
     }   
    } 
} 

回答

1

我猜这里是这条线可能是problem.-

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

step函数处理基于自最后一步经过时间的身体位置。你正在做一个整数除法1/60,结果是0。改为尝试1.0f/60.0f

否则,你告诉你的世界自从最后一步以来经过了0毫秒,所以身体总是保持在他们的初始位置。

但是,对您的时间步骤进行“硬编码”并不是一个好习惯。你最好通过你的世界步骤的增量时间你receiving.-

world.step(dt, 10, 10); 

此外,您还可以简化你的循环为带有附加CCSprite任何body工作,像this.-

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()))); 
    }   
} 
+0

谢谢, @ssantos。我试过了,所以时间步是0.016666668,但这并没有改变任何东西。球仍然静止。 – Eddy

+0

恩,更多的想法,你不需要手动设置'海量数据',因为'box2d'会为每个'fixture'计算出合适的质量。 'SMILE_DENSITY'的价值是什么?我假设'worldToScreen'函数正在处理像素到米转换,不是吗? – ssantos

+0

好的,我删除了massdata设置。 SMILE_DENSITY = 0.25f; SMILE_FRICTION = 0.1f; SMILE_RESTITUTION = 0.7f; – Eddy