将b2Body移动到位置

时间:2012-05-29 00:01:34

标签: ios cocos2d-iphone box2d

基本上我正在构建一个带有“tap”控件的应用程序来控制侧滚动视图中的角色,用户点击他们想要移动角色的位置,然后角色应移动到该x位置。我只想到实现这个的最佳方法,我想我可以对角色应用线性速度,然后反复检查它是否已达到目标(假设每0.05秒),在这种情况下它的速度可以是设置为0,但这似乎并不特别优雅。有什么建议吗?

提前致谢:)

4 个答案:

答案 0 :(得分:1)

尝试使用线性脉冲将身体移动到所需位置。 :)

答案 1 :(得分:0)

您可以轻松地为视图位置设置动画。做一些像

这样的事情
CGPoint destination = ... ;
[UIView animateWithDuration:.3 animations:^{
  view.center = destination;
}];

您必须在父视图中捕获触摸。此外,目标坐标应位于视图的父坐标中。

答案 2 :(得分:0)

要更改b2Body位置,您可以使用SetTransform方法。它允许您在b2World中设置新位置为b2Vec和body角度。

但是如果你需要检查碰撞,你可能会遇到麻烦。如果你使用力/速度/冲动来移动身体,它将阻止两个应该碰撞的物体出现在同一位置的情况。在SetTransform的情况下,这些对象的碰撞结果可能是错误的。

例如,如果你的游戏区域边缘很少,那么在SetTransform的情况下,当你的游戏对象被放置在你的一条边上时,它就会被推出你的游戏区域。

答案 3 :(得分:0)

我正在研究类似的东西。 我想为我的家伙保持恒定的运行速度,所以我使用SetLinearVelocity(b2Vec2)命令实现了一大堆。 我不确定Box2D中的“正确”是否为你在移动时运行的每个update:(ccTime)dt调用SetLinearVelocity - 这有点像绕过看似愚蠢的物理引擎 - 但它到目前为止工作正常对我来说。

以下update:例程的效果是玩家身体不会突然停止移动。如果你很好地调整你的球员身体和环境,那么当它停止时,它会有一个很小的滑动。

我的触控回调-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 调用我的Player对象的setGoalX:(float)x函数:

//somewhere initially, I set up linear damping for some extra drag in my player class
//note: GROUND_DAMPING is defined earlier in my file, and is not a Box2d thing.
self.physicsBody->SetLinearDamping(GROUND_DAMPING);


-(void) setGoalX:(float)x
{
    goal_->x = x; //b2Vec2* goal
}

-(void) update:(ccTime)dt
{
    int dx = (goal_->x - body->GetPosition().x)*10;
    if (dx != 0) {
        xdir = (dx > 0) ? 1 : -1;
        if (abs(dx) >= 10) 
            body->SetLinearVelocity(b2Vec2(RUN_SPEED*xdir,body->GetLinearVelocity().y));
    } else xdir = 0;
}