Actorとの当たり判定と壁との当たり判定を分けているだけだった。
壁は線で定義されているので当たり判定をするとき、後で出てくる弾(Projectile)は動きがはやいので突き抜けてしまったりするのでLineLineIntersect()で、それ以外はCircleLineCollide()で計算する。
当たり判定が起きた時に何かしたいときは、Touch()が呼ばれるように書く。
その後、Touch()を継承する。当たった相手を引数にしてもよいが特に今は何にも使われていない。
private void MoveWorld(float elapsedTime) {
Vector2 point = Vector2.Zero;
for(int i = 0; i < actors.Count; ++i) {
if(actors[i].Dead) {
continue;
}
Vector2 movement = actors[i].Velocity * elapsedTime;
if(actors[i].CollidedThisFrame == false) {
//Actorと
movement = MoveAndCollide(actors[i], movement);
}
actors[i].Position += movement;
//壁と
for(int w = 0; w < walls.Length / 2; ++w) {
if(actors[i] is Projectile) {
if(Collision.LineLineIntersect(actors[i].Position,
actors[i].Position - movement, walls[w * 2],walls[w * 2 + 1], out point)) {
actors[i].Touch(actors[0]);
}
} else {
Collision.CircleLineCollisionResult result = new Collision.CircleLineCollisionResult();
if(Collision.CircleLineCollide(actors[i].Position,actors[i].Radius, walls[w * 2], walls[w * 2 + 1],ref result)) {
float vn = Vector2.Dot(actors[i].Velocity, result.Normal);
actors[i].Velocity -= (2.0f * vn) * result.Normal;
actors[i].Position += result.Normal * result.Distance;
}
}
}
}
}
0 コメント :: 壁との当たり判定2
コメントを投稿