1

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

提前致谢 :)

4

4 回答 4

1

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

于 2012-05-29T08:45:53.463 回答
0

您可以轻松地为视图位置设置动画。只是做类似的事情

CGPoint destination = ... ;
[UIView animateWithDuration:.3 animations:^{
  view.center = destination;
}];

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

于 2012-05-29T01:21:57.903 回答
0

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

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

例如,如果您的游戏区域边界很少,在 SetTransform 的情况下,当您的游戏对象将被放置在您的一个边缘上时,它可以被推出您的游戏区域。

于 2012-05-29T05:02:26.057 回答
0

我目前正在做类似的事情。我希望我的家伙有一个恒定的运行速度,所以我使用了SetLinearVelocity(b2Vec2)一大堆命令实现了一些东西。我不确定在 Box2D 中为update:(ccTime)dt您移动时运行的每个调用 SetLinearVelocity 是否“正确”——这有点像绕过看起来很愚蠢的物理引擎——但到目前为止它对我来说还不错。

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

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

//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;
}
于 2012-12-04T20:00:22.373 回答