1

1 つのスプライトの「重力」をシミュレートしたいと考えています。

重力値を保持する CGPoint を定義しました。そして、私は tick メソッドを持っています。

//in my init I defined this: gravity = ccp(0.0f, -1.0f);
-(void)tick:(ccTime) dt {
if (enableGravity_) {
    //simulate gravity
    velocity_.x += gravity_.x;
    velocity_.y += gravity_.y;
    self.position = CGPointMake(position_.x + velocity_.x, position_.y + velocity_.y);
}    
if (isAcceleratingEnabled_) { //I move my sprite here
    float angle = self.rotation;
    float vx = cos(angle * M_PI / 180) * acceleratingSpeed_;
    float vy = sin(angle * M_PI / 180) * -acceleratingSpeed_;
    CGPoint direction = ccp(vx, vy);

    [self setPosition:ccpAdd(self.position, direction)];
}

}

編集:問題は..「isAccelerationEnabled」がYESの場合、スプライトを移動しています。そして、スプライトをそのように動かすと滑らかではありません。スプライトを上に移動してから「isAcceleration」を無効にすると、スプライトは上に移動しなくなりますが、重力によってスプライトが即座に引き下げられます。このコードで速度を使用する方法がわかりません:

[self setPosition:ccpAdd(self.position, direction)];

これは、重力をシミュレートするための本当にスムーズなソリューションではありません。

これにより、スプライトに重力が即座に適用されます。

でも、スプライトがスムーズに落ちる効果が欲しいです。本物の物体が地球に落ちたように。

ところで: スプライトに上向きの力も適用します。

4

2 に答える 2

1

問題は、重力を加速度ではなく速度として適用していることです。スプライトに速度を与えてから、次のようにする必要があります...

sprite.velocity = ccp(self.velocity.x+gravity.x, self.velocity.y+gravity.y);
sprite.position = ccp(sprite.position.x+sprite.velocity.x, sprite.position.y+sprite.velocity.y);

また、重力を下向きに引っ張るだけの場合は、2D である必要はなく、常に負の Y 方向に適用されるスカラーにすることができます。

于 2011-08-23T14:34:12.940 に答える
0

速度変数を導入したので、コントロールvxvyを位置ではなく速度にも適用する必要があります。これは、オブジェクトに一定の力を適用することに相当します。これは非常に現実的ですが、必要な種類の制御ではない可能性があります。

もう 1 つの方法は、単純にブランチ内でvxtovelocity_.xおよびvytoに割り当てることです。これは、オブジェクトをアクティブに制御するたびに、必要なだけ大きな力を適用することに相当します。非現実的に見える場合は、速度の変化を最大値に制限することをお勧めします。velocity_.yisAccelerationEnabled_

于 2011-08-25T16:29:58.873 に答える