アステロイド追加


アステロイドActorを追加。
新しい種類のActorの追加のやり方がわかる。これで、敵の種類が増えても大丈夫。
追加の際に、重ならないように出現場所をWorldクラスのFindSpawnPoint()であいてる場所を探す。
衝突判定後、AdjustVelocities()でActorの速度を調整する。
しかしこれが難しくてわからない。
円の衝突をモデル化すると、衝突時、ぶつかり合う円の中心同士を結んだベクトルがあり、衝突面は、このベクトルに直行したものになる。衝突面に対して、入射角度と反射角度は同じになるので、衝突面方向、中心同士を結んだ方向に速度の成分を分けて考える。というぐらいまでで、どうしてこういう計算になるんだろうか?

ここはとりあえずわからないので飛ばす。やっぱりわからんとこ出てきたなあ。

ここまでのプロジェクト(205KB

private static void AdjustVelocities(Actor actor1, Actor actor2) {
 if(actor1.Mass <= 0f || actor2.Mass <= 0f) {
  return;
 }
 Vector2 collisionNormal = Vector2.Normalize(actor2.Position - actor1.Position);
 Vector2 collisionTangent = new Vector2(-collisionNormal.Y, collisionNormal.X);

 float velocityNormal1 = Vector2.Dot(actor1.Velocity, collisionNormal);
 float velocityTangent1 = Vector2.Dot(actor1.Velocity, collisionNormal);
 float velocityNormal2 = Vector2.Dot(actor2.Velocity, collisionNormal);
 float velocityTangent2 = Vector2.Dot(actor2.Velocity, collisionTangent);

 float velocityNormal1New = ((velocityNormal1 * (actor1.Mass - actor2.Mass))
  + (2f * actor2.Mass * velocityNormal2)) / (actor1.Mass + actor2.Mass);
 float velocityNormal2New = ((velocityNormal2 * (actor2.Mass - actor1.Mass))
  + (2f * actor1.Mass * velocityNormal1)) / (actor1.Mass + actor2.Mass);
 actor1.Velocity = (velocityNormal1New * collisionNormal) +(velocityTangent1 * collisionTangent);
 actor2.Velocity = (velocityNormal2New * collisionNormal) +(velocityTangent2 * collisionTangent);
}

0 コメント :: アステロイド追加

コメントを投稿