2012-05-29 72 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; 
}