本质上,我正在构建一个带有“点击”控件的应用程序来控制侧面滚动视图中的角色,用户点击他们想要移动角色的位置,然后角色应该移动到那个 x 位置。我只是在考虑实现这一点的最佳方法,我想我可以对角色应用线速度,然后反复检查它是否已达到目标(假设每 0.05 秒),在这种情况下,它的速度可以是设置为 0 但这似乎不是特别优雅。有什么建议么?
提前致谢 :)
本质上,我正在构建一个带有“点击”控件的应用程序来控制侧面滚动视图中的角色,用户点击他们想要移动角色的位置,然后角色应该移动到那个 x 位置。我只是在考虑实现这一点的最佳方法,我想我可以对角色应用线速度,然后反复检查它是否已达到目标(假设每 0.05 秒),在这种情况下,它的速度可以是设置为 0 但这似乎不是特别优雅。有什么建议么?
提前致谢 :)
尝试使用线性脉冲,它将身体移动到所需的位置。:)
您可以轻松地为视图位置设置动画。只是做类似的事情
CGPoint destination = ... ;
[UIView animateWithDuration:.3 animations:^{
view.center = destination;
}];
您必须在父视图中捕获触摸。此外,目的地的坐标应该在视图的父坐标中。
要更改 b2Body 位置,您可以使用 SetTransform 方法。它允许您将 b2World 中的新位置设置为 b2Vec 和身体角度。
但是如果你需要检查碰撞,你可能会遇到麻烦。如果您使用力/速度/脉冲移动身体,它将防止出现例如两个应该碰撞的物体出现在同一位置的情况。在 SetTransform 的情况下,此类对象的碰撞结果可能是错误的。
例如,如果您的游戏区域边界很少,在 SetTransform 的情况下,当您的游戏对象将被放置在您的一个边缘上时,它可以被推出您的游戏区域。
我目前正在做类似的事情。我希望我的家伙有一个恒定的运行速度,所以我使用了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;
}