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