Ejemplo n.º 1
0
        // Physics Stage
        private void ResolvePhysics(GameState s, float dt)
        {
            RTSTeam team;

            // Initialize hash grid
            var hashGrid = s.CGrid;

            hashGrid.ClearDynamic();

            // Move Geometry To The Unit's Location and hash into the grid
            for (int ti = 0; ti < s.activeTeams.Length; ti++)
            {
                team = s.activeTeams[ti].Team;
                foreach (RTSUnit unit in team.Units)
                {
                    unit.CollisionGeometry.Center = unit.GridPosition;
                    hashGrid.Add(unit);
                }
            }

            // Use hash grid to perform collision using 3 by 3 grid around the geometry
            for (int i = 0; i < hashGrid.ActiveGrids.Count; i++)
            {
                Point p = hashGrid.ActiveGrids[i];
                hashGrid.HandleGridCollision(p.X, p.Y);
                hashGrid.HandleGridCollision(p.X, p.Y, -1, -1);
                hashGrid.HandleGridCollision(p.X, p.Y, -1, 0);
                hashGrid.HandleGridCollision(p.X, p.Y, -1, 1);
                hashGrid.HandleGridCollision(p.X, p.Y, 0, -1);
                hashGrid.HandleGridCollision(p.X, p.Y, 0, 1);
                hashGrid.HandleGridCollision(p.X, p.Y, 1, -1);
                hashGrid.HandleGridCollision(p.X, p.Y, 1, 0);
                hashGrid.HandleGridCollision(p.X, p.Y, 1, 1);
            }

            // Move Unit's Location To The Geometry After Heightmap Collision
            for (int ti = 0; ti < s.activeTeams.Length; ti++)
            {
                team = s.activeTeams[ti].Team;
                foreach (RTSUnit unit in team.Units)
                {
                    CollisionController.CollideHeightmap(unit.CollisionGeometry, s.CGrid);
                    unit.GridPosition = unit.CollisionGeometry.Center;
                    unit.Height       = unit.CollisionGeometry.Height;

                    // Check To Make Sure Unit Is Inside The Map
                    if (unit.GridPosition.X < 0 || unit.GridPosition.X > s.CGrid.size.X ||
                        unit.GridPosition.Y < 0 || unit.GridPosition.Y > s.CGrid.size.Y
                        )
                    {
                        // Damage The Unit If It Is Outside
                        unit.Damage(1);
                    }
                }
            }
        }