2012-05-29 78 views
1

本质上,我正在构建一个带有“轻击”控件的应用程序来控制侧滚动视图中的角色,用户点击他们想移动角色的位置,然后角色移动到该位置。我只是想着实现这一点的最佳方式,我认为我可以对角色施加线速度,然后反复检查是否已达到目标(可以说每0.05秒),在这种情况下,其速度可以是设置为0,但看起来并不特别优雅。有什么建议么?将b2Body移动到位置

在此先感谢:)

+0

应该是罚款 - 你可以检查每一个时间步长的位置。如果沿途存在障碍物,您可以通过施加力量或脉冲而不是直接设置速度来获得更逼真的模拟。 – iforce2d

回答

1

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

0

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

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

你将不得不捕捉父视图中的触摸。另外,目标的坐标应该在视图的父坐标中。

+0

问题是它是一个b2Body,我也想记下物理景观:) – IApp

0

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

但是如果你需要检查碰撞,你可能会遇到麻烦。如果你使用力/速度/冲动来移动身体,当例如两个应该碰撞的物体可能出现在相同的位置时,它将防止出现这种情况。在SetTransform的情况下,这些对象的碰撞结果可能是错误的。例如,如果你的游戏区域边界很少,那么在SetTransform的情况下,当你的游戏对象放置在你的某个边缘时,它可以被推出你的游戏区域。

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; 
}