Ejemplo n.º 1
0
        public static bool HandleCollisions(TankState state, TankAppliance appliance, VectorGroup oppos, float elapsed)
        {
            var selfBounds = appliance.Bounds
                             .Rotate(appliance.Origin, state.Rotation)
                             .Move(state.Position);

            var intersected = false;

            var interections = selfBounds.FindIntersections(oppos);

            foreach (var((c, d), (a, b)) in interections)
            {
                intersected = true;

                var dir = state.Position.X * (a.Y - b.Y) * state.Position.Y * (b.X - a.X) + (a.X * b.Y - a.Y * b.X);

                var v = b - a;

                if (dir == 0) // sorry, that's magic
                {
                    continue;
                }

                var n = new Vector(v.Y, -v.X) * -(dir / MathF.Abs(dir)); // direction to throw body away

                state.Speed     = 0;
                state.Position += n * 0.05f * elapsed;
            }


            return(intersected);
        }