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