1

基本的に、横スクロール ビューでキャラクターを制御する「タップ」コントロールを備えたアプリを構築しています。ユーザーは、キャラクターを移動したい場所をタップすると、キャラクターはその x 位置に移動する必要があります。これを実装する最善の方法を考えているところです。キャラクターに線形速度を適用し、ターゲットに到達したかどうかを繰り返し確認することができると考えました (たとえば、0.05 秒ごとに)。 0 に設定しますが、特にエレガントには見えません。助言がありますか?

前もって感謝します :)

4

4 に答える 4

0

b2Body の位置を変更するには、SetTransform メソッドを使用できます。b2Vec と体の角度として、b2World の新しい位置を設定できます。

しかし、衝突をチェックする必要がある場合、問題に直面する可能性があります。力/速度/衝動を使用して体を動かすと、たとえば、衝突する必要がある 2 つのオブジェクトが同じ場所に表示されるような状況を防ぐことができます。SetTransform の場合、そのようなオブジェクトの衝突の結果が間違っている可能性があります。

たとえば、SetTransform の場合、ゲーム エリアをいくつかのエッジで囲んだ場合、ゲーム オブジェクトがエッジの 1 つに配置されると、ゲーム エリアから押し出される可能性があります。

于 2012-05-29T05:02:26.057 に答える
0

私は現在、似たようなものに取り組んでいます。私は私の男のために一定の実行速度が欲しかったので、SetLinearVelocity(b2Vec2)コマンドをたくさん使って何かを実装しました。Box2D で、移動中に実行されるすべての関数に対して SetLinearVelocity を呼び出すことが「適切」であるかどうかはわかりupdate:(ccTime)dtません。これは、ばかげているように見える物理エンジンを回避するようなものですが、これまでのところ問題なく機能しています。

以下のルーチンの効果はupdate:、プレーヤーの体が突然動きを止めないようにすることです。プレイヤーの体と環境をうまく微調整すれば、止まるときに小さなスライドがあります。

私のタッチ コールバックは、以下の Player オブジェクト-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(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;
}
于 2012-12-04T20:00:22.373 に答える