新しい種類の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 コメント :: アステロイド追加
コメントを投稿