0

私はかなり頭のいい人ですが、ある種の数学を見ると、巨大なモロンになるかもしれません。私は本当にここでいくつかの助けを使うことができました。

iOSゲームの開発を学びながら、たくさんのことを研究してきました。検索をしているときに数式に出くわしました。式は次のとおりです。

x(t)= x(0)+ v(0)* t + .5(F / m)* t ^ 2

また、xとyを解くことも述べられています。

Fx =(x(t)-x(0)-vx(0)* t)* 2m / t ^ 2

Fy =(y(t)-y(0)-vy(0)* t)* 2m / t ^ 2

出典: Box2D.orgフォーラム

さて、私の実際の質問ですが、それはどういう意味ですか?この状況では私はばかだということを覚えておいてください。誰かが変数を簡単な言葉で説明し、それらがbox2dとどのように関連しているかを説明できれば素晴らしいと思います。この式をどのように適用しますか?これが私のコードの例です(発射物を発射します):

- (void)spawnProjectile:(CGPoint)from direction:(CGPoint)direction inParent:(CCNode*)parentNode
{
    double curTime = CACurrentMediaTime();
    
    double timeTillShotDies = curTime + SHOT_TYPE1_EXIST_TIME;
    
    b2Body *shotBody = projectileBodyTracker[nextShot];
    
    b2Vec2 moveToPosition = b2Vec2(from.x/PTM_RATIO, from.y/PTM_RATIO);
    shotBody->SetTransform(moveToPosition, 0.0);
    shotBody->SetActive(true);
    
    CCSprite *shot = [projectiles objectAtIndex:nextShot];
    shot.position = ccp(from.x/PTM_RATIO, from.y/PTM_RATIO);

    shot.visible = YES;
    [projectilesTracker replaceObjectAtIndex:nextShot withObject:[NSNumber numberWithDouble:timeTillShotDies]];
    CCParticleSystemQuad *particle = [projectileParticleTracker objectAtIndex:nextShot];
    [particle resetSystem];
    nextShot++;
    if(nextShot >= projectiles.count) nextShot = 0;
    
    // dx2 and dy2 are analog stick values (see below code)
    b2Vec2 force = b2Vec2(dx2, dy2);
    shotBody->SetLinearVelocity(force);
     
    [AudioController playLaserShot];
}

この特定のコードのチャンクでは、アナログが向いている角度でプレーヤーから発砲しています。また、敵からプレイヤーに向かって発砲するために式を使用する必要があります。これはトップダウンのスペースシューティングゲームです。

要約すると、box2dコードの観点から、xとyの一定の力を経時的に解決するにはどうすればよいですか?

追加情報:

dx2 = (float)joypadBG2.position.x - (float)convertedPoint.x;
dy2 = (float)joypadBG2.position.y - (float)convertedPoint.y;

すべてのオブジェクトはプリロードされ、そのように保持されます。ボディは非アクティブに設定され、スプライトは非表示に設定されます。パーティクルシステムが停止します。発射物を再び使用する場合は、逆になります。

あなたが提供することができるかもしれないどんな助けにも感謝します。私は何も忘れていないことを願っています。

4

2 に答える 2

1

最初の方程式は、一定の力を受けるオブジェクトの動きを表しています。オブジェクトは位置x(0)から始まり、速度はv(0)です。xとvはどちらもベクトルであるため、2Dシューティングゲームでは、x(0)は(x0、y0)、つまりxy位置になり、v(0)は(vx0、vy0)になります。

重力がない場合、推進されていない発射体(スラスターのない発射体)ではF = 0であるため、速度は一定になります。

x(t1)= x(t0)+ vx *(t1-t0)y(t1)= y(t0)+ vy *(t1-t0)

t1-t0またはdt(delta-t)は、発射物の位置を最後に更新してから経過した時間です。

サッターまたは重力が物体に力を加えている場合、速度は時間とともに変化します。

vx(t1)= vx(t0)+ ax *(t1-t0)vy(t1)= vy(t0)+ ay *(t1-t0)

aは加速度です。ゲームでは、通常、質量や力は気にせず、加速だけを気にします。物理学では、a = F/mです。

編集1:コンピュータゲームでは、オブジェクトの位置を非常に頻繁に更新します(通常、1秒間に約60回)。前回の更新時のオブジェクトの位置と速度があり、新しい位置を計算したいとします。

速度が一定であると仮定して、位置を更新します。

positionVectorAt(newTime) = positionVector(lastTime) + velocityVector*(newTime - lastTime);

オブジェクトの速度が変更された場合は、速度も更新します。

velocityVectorAt(newTime) = velocityVector(lastTime) + accelerationVector*(newTime - lastTime);

にスプライトがあるとしましょう

positionVector.x=100; 
positionVector.y=10;

初速度は

velocityVector.x = 3;
velocityVector.y = -10;

スプライトは、1秒あたりの水平加速度を与えるスラスターを使用しています。

thrusterVector.x= 5; 

また、重力の影響を受け、1秒あたりの垂直加速度が

gravityVector.y = -10;

スプライトの位置を更新するコードは次のとおりです。

deltaTime = now - lastTime; // Time elapsed since last position update

// Update the position
positionVector.x = positionVector.x + velocityVector.x * deltaTime;
positionVector.y = positionVector.y + velocityVector.y * deltaTime;

// Update the velocity
velocityVector.x = velocityVector.x + (thrusterVector.x + gravityVector.x) * deltaTime;
velocityVector.y = velocityVector.y + (thrusterVector.y + gravityVector.y) * deltaTime;

// Done! The sprite now has a new position and a new velocity!
于 2011-06-14T13:49:19.993 に答える
1

ここに簡単な説明があります:

x(t) = x(0) + v(0)*t + .5 (F/m) * t^2
Fx = (x(t) - x(0) - vx(0)*t) * 2m/t^2
Fy = (y(t) - y(0) - vy(0)*t) * 2m/t^2

これらの3つの方程式は、標準的な動きの方程式です。

  • t: 時間
  • x(t):時間での位置t
  • v(t):時間での速度t
  • vx(t):時間における速度の水平成分t
  • vy(t):時間における速度の垂直成分t
  • m: 質量
  • F: 力
  • Fx:力の水平成分
  • Fy:力の垂直成分

x(0)したがって、もちろん、またはを表示するたびにvy(0)、これらの値は時間tで取得されます。つまり、これらの値は初期値です。これらの方程式は、基本的な映画の変数(位置、速度、力、質量)を持つ基本的な映画の方程式です。

于 2011-06-14T14:18:17.770 に答える