Ios 将车身移动到指定位置

Ios 将车身移动到指定位置,ios,cocos2d-iphone,box2d,Ios,Cocos2d Iphone,Box2d,基本上,我正在构建一个带有“点击”控件的应用程序,以控制侧面滚动视图中的角色,用户点击他们想要移动角色的位置,然后角色应该移动到x位置。我正在考虑实现这一点的最佳方法,我想我可以对角色应用线性速度,然后反复检查它是否达到了目标(假设每0.05秒一次),在这种情况下,它的速度可以设置为0,但这似乎不是特别优雅。有什么建议吗 提前感谢:)您可以轻松设置视图位置的动画。做点像 CGPoint destination = ... ; [UIView animateWithDuration:.3 anim

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


提前感谢:)

您可以轻松设置视图位置的动画。做点像

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

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

您可以轻松地设置视图位置的动画。做点像

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

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

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

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


例如,如果游戏区域边界上有几条边,在使用SetTransform的情况下,当游戏对象放置在其中一条边上时,可以将其推出游戏区域。

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

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


例如,如果游戏区域边界上有几条边,在SetTransform的情况下,当游戏对象放置在其中一条边上时,可以将其推出游戏区域。

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

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

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

下面的
更新:
例程的效果是,玩家身体不会突然停止移动。它有一个甜蜜的小幻灯片,因为它停止,如果你调整你的球员身体和环境好

My touch callback
-(BOOL)CCTouchStart:(UITouch*)TouchWithEvent:(UIEvent*)event
调用下面我的播放器对象的
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;
}

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

下面的
更新:
例程的效果是,玩家身体不会突然停止移动。它有一个甜蜜的小幻灯片,因为它停止,如果你调整你的球员身体和环境好

My touch callback
-(BOOL)CCTouchStart:(UITouch*)TouchWithEvent:(UIEvent*)event
调用下面我的播放器对象的
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;
}

问题是这是一个b2Body,我也要注意物理景观:)问题是这是一个b2Body,我也要注意物理景观:)应该很好-你可以每一步检查位置。如果沿途有障碍物,你可以通过施加一个力或冲量而不是直接设置速度来获得更真实的模拟。应该可以-你可以每一步检查位置。如果沿途有障碍物,通过施加力或脉冲,而不是直接设置速度,可以获得更真实的模拟。