public override void Update(GameTime gameTime)
        {
            cCollisionMap cm = PrimalDevistation.Instance.Level.CollisionMap;
            float         fpOldX, fpOldY, fpNewX, fpNewY;
            int           oldX, oldY, newX, newY;

            // Update the particles in a fountain type of way
            for (int i = 0; i < _maxParticles; i++)
            {
                cCPUParticle p = _particles[i];
                p._velX += PrimalDevistation.GRAVITY.X;
                p._velY += PrimalDevistation.GRAVITY.Y;

                fpOldX = _pointVertices[i].position.X;
                fpOldY = _pointVertices[i].position.Y;
                fpNewX = fpOldX + p._velX;
                fpNewY = fpOldY + p._velY;
                oldX   = (int)fpOldX;
                oldY   = (int)fpOldY;
                newX   = (int)fpNewX;
                newY   = (int)fpNewY;

                // If we have actually moved a pixel in the last frame (could have been less!)
                if (oldX != newX)
                {
                    // If we collide at this new X position we need to rebound
                    if (cm.CheckCollision(newX, oldY))
                    {
                        p._velX = -p._velX * 0.5f;
                        fpNewX  = fpOldX;
                    }
                }

                // If we have actually moved a pixel in the last frame (could have been less!)
                if (oldY != newY)
                {
                    // If we collide at this new X position we need to rebound
                    if (cm.CheckCollision(oldX, newY))
                    {
                        p._velY = -p._velY * 0.5f;
                        fpNewY  = fpOldY;
                    }
                }

                // Finally set the new position
                _pointVertices[i].position.X = fpNewX;
                _pointVertices[i].position.Y = fpNewY;
            }
        }
        public void SpawnNewPlayer(int player)
        {
            int           spawnSize = 128;
            Vector2       levSize = PrimalDevistation.Instance.Level.Size;
            cCollisionMap cm = PrimalDevistation.Instance.Level.CollisionMap;
            int           x, y;

            do
            {
                //x = (int)cMath.Rand(600 + (spawnSize / 2), levSize.X - (spawnSize / 2)-600);
                //y = (int)cMath.Rand(600 + (spawnSize / 2), levSize.Y - (spawnSize / 2)-600);
                x = (int)cMath.Rand((spawnSize / 2), levSize.X - (spawnSize / 2));
                //y = (int)cMath.Rand((spawnSize / 2), levSize.Y - (spawnSize / 2));
                y = (int)cMath.Rand((spawnSize / 2), 400);
            } while (cm.CheckCollisionIndestructable(x - 64, y - 64, cm.Explosions[128]._data, SpriteEffects.None));

            SpawnNewPlayer(player, x, y);
        }
        private void Respawn(cPlayer p)
        {
            int           spawnSize = 128;
            Vector2       levSize = PrimalDevistation.Instance.Level.Size;
            cCollisionMap cm = PrimalDevistation.Instance.Level.CollisionMap;
            int           x, y;

            do
            {
                //x = (int)cMath.Rand(600 + (spawnSize / 2), levSize.X - (spawnSize / 2)-600);
                //y = (int)cMath.Rand(600 + (spawnSize / 2), levSize.Y - (spawnSize / 2)-600);
                x = (int)cMath.Rand((spawnSize / 2), levSize.X - (spawnSize / 2));
                //y = (int)cMath.Rand((spawnSize / 2), levSize.Y - (spawnSize / 2));
                y = (int)cMath.Rand((spawnSize / 2), 400);
            } while (cm.CheckCollisionIndestructable(x - 64, y - 64, cm.Explosions[128]._data, SpriteEffects.None));
            PrimalDevistation.Instance.Level.AddExplosion(128, new Vector2(x, y), Vector2.Zero);
            p.Position  = new Vector2(x, y);
            p.HitPoints = p.MaxHitPoints;
        }
        public void UpdatePhysics(GameTime gameTime, byte[,] pixelPerfectCollisionData)
        {
            // If this object sticks on collision and is still stuck then dont bother with the rest of this
            if (_stickOnCollision && Chk((int)_position.X, (int)_position.Y, pixelPerfectCollisionData))
            {
                _velocity = Vector2.Zero; return;
            }

            float         frameDelta = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
            cCollisionMap cm         = PrimalDevistation.Instance.CurrentLevel.CollisionMap;

            // Work out new velocity
            if (_gravityAffected)
            {
                _velocity += PrimalDevistation.GRAVITY;
            }

            // First get the ineger (pixel locations) of the old and new positions
            float fpNewX = (_position.X + _velocity.X);

            if (_walkDir != 0)
            {
                fpNewX = _position.X + _walkDir;
            }
            float fpNewY    = (_position.Y + _velocity.Y);
            float fpOldX    = _position.X;
            float fpOldY    = _position.Y;
            int   oldX      = (int)fpOldX;
            int   oldY      = (int)fpOldY;
            int   newX      = (int)fpNewX;
            int   newY      = (int)fpNewY;
            bool  collision = false;

            if (_canWalk && _onGround)
            {
                if (oldX != newX)
                {
                    for (int i = -4; i < 4; i++)
                    {
                        if (!Chk(newX, oldY - i, pixelPerfectCollisionData))
                        {
                            fpNewY    = fpOldY - i;
                            _velocity = Vector2.Zero;
                            collision = true;
                            break;
                        }
                    }

                    if (!collision)
                    {
                        fpNewY = fpOldY; fpNewX = fpOldX;
                    }
                }
                else
                {
                    _velocity = Vector2.Zero;
                    fpNewY    = fpOldY;
                }
            }
            else
            {
                // If there is a collision at the new location we need to split the axis to see where
                if (Chk(newX, newY, pixelPerfectCollisionData))
                {
                    collision = true;
                    if (_stickOnCollision)
                    {
                        fpNewX = newX;
                        fpNewY = newY;
                    }
                    else
                    {
                        // If we collide at this new X position we need to rebound
                        if (Chk(newX, oldY, pixelPerfectCollisionData))
                        {
                            _velocity.X = -_velocity.X * _friction;
                            fpNewX      = fpOldX + _velocity.X;
                        }

                        // If we collide at this new Y position we need to rebound
                        if (Chk(oldX, newY, pixelPerfectCollisionData))
                        {
                            _velocity.Y = -_velocity.Y * _friction;
                            fpNewY      = fpOldY + _velocity.Y;
                        }
                    }
                }
            }

            // Finally set the new position
            _position.X = fpNewX;
            _position.Y = fpNewY;
            Position    = _position;

            if (Chk((int)_position.X, (int)_position.Y + 1, pixelPerfectCollisionData) && Math.Abs(_velocity.X) < 3f)
            {
                _onGround = true;
            }
            else
            {
                _onGround = false;
            }

            if (_collideWithPlayers)
            {
                List <cPlayer> activePlayer = PrimalDevistation.Instance.PlayerManager.ActivePlayers;

                for (int i = 0; i < activePlayer.Count; i++)
                {
                    cPlayer p = activePlayer[i];
                    if (p.CollisionBounds.Contains((int)(_position.X - p.Position.X), (int)(_position.Y - p.Position.Y)))
                    {
                        collision = true;
                    }
                }
            }

            if (collision)
            {
                OnCollision();
            }
        }