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(); } }