大家好我正在开展一个项目,包括在XNA中制作一个简单的平台游戏。当他们与敌人或平台相撞时,我已经达到了让“子弹”消失的程度。如果它们与敌人发生碰撞,那么也会伤害敌人。我似乎无法找到我的代码的问题,但当“子弹”触及平台或敌人时没有任何反应。当火球与平台发生碰撞时,我也得到了ArgumentOutOfRangeException未处理的错误。
Game1.cs
protected void AddFireBall()
{
// Load fireBallSprite
fireBallSprite = Content.Load<Texture2D>("Sprites/fireball");
// Fire in the player's current moving direction
if (player.FacingRight == true)
{
FireBallsRight.Add(new FireBall(fireBallSprite, new Vector2(player.Position.X + (player.Texture.Width / 2), player.Position.Y)));
}
else if (player.FacingRight == false)
{
FireBallsLeft.Add(new FireBall(fireBallSprite, new Vector2(player.Position.X - (player.Texture.Width / 2), player.Position.Y)));
}
}
// Update fireball position
protected void UpdateFireBall()
{
// Fireballs moving to the right
for (int i = 0; i < FireBallsRight.Count; i++)
{
FireBallsRight[i].MoveRight();
// If the fireball goes outside the map,
// remove fireball from list
if (FireBallsRight[i].Position.X + FireBallsRight[i].Texture.Width > screenBound.Width)
{
FireBallsRight.RemoveAt(i);
}
}
// Fireballs moving to the left
for (int i = 0; i < FireBallsLeft.Count; i++)
{
FireBallsLeft[i].MoveLeft();
// If the fireball goes outside the map,
// remove fireball from list
if (FireBallsLeft[i].Position.X + FireBallsLeft[i].Texture.Width > screenBound.Width)
{
FireBallsLeft.RemoveAt(i);
}
}
}
protected void UpdateCollision()
{
// Check for collisions between player and platform
foreach (Platform p in Platforms)
{
player = p.CheckIfCollision(player);
}
// Use the Rectangle's built-in intersect function to
// determine if two objects are overlapping
Rectangle rectangle1;
Rectangle rectangle2;
Rectangle rectangle3;
Rectangle rectangle4;
// Create a rectrangle for player
rectangle1 = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Texture.Width, player.Texture.Height);
// Update player score and remove treasure from map when colliding
for (int i = 0; i < Treasures.Count; i++)
{
rectangle3 = Treasures[i].BoundingRectangle;
// Determine if the two objects collided with each
// other
if (rectangle1.Intersects(rectangle3))
{
// Add player score based on Treasure's score value
player.score += Treasures[i].score;
// Remove the treasure from the list
Treasures.RemoveAt(i);
}
}
// Kill the player when colliding with DemonEnemy
for (int i = 0; i < DemonEnemies.Count; i++)
{
rectangle2 = DemonEnemies[i].BoundingRectangle;
if (rectangle1.Intersects(rectangle2))
{
player.health = 0;
}
}
// Kill the player when colliding with LordRylinoth
for (int i = 0; i < LordRylinoths.Count; i++)
{
rectangle2 = LordRylinoths[i].BoundingRectangle;
if (rectangle1.Intersects(rectangle2))
{
player.health = 0;
}
}
// Check if fireball intersects with a platform
for (int i = 0; i < FireBallsRight.Count; i++)
{
for (int x = 0; x < Platforms.Count; x++)
{
rectangle4 = new Rectangle((int)FireBallsRight[i].Position.X - FireBallsRight[i].Texture.Width, (int)FireBallsRight[i].Position.Y - FireBallsRight[i].Texture.Height,
FireBallsRight[i].Texture.Width, FireBallsRight[i].Texture.Height);
rectangle2 = Platforms[x].BoundingRectangle;
if (rectangle4.Intersects(rectangle2))
{
// Remove fireball from list
FireBallsRight.RemoveAt(i);
}
}
}
// Check if fireball intersects with a platform
for (int i = 0; i < FireBallsLeft.Count; i++)
{
for (int x = 0; x < Platforms.Count; x++)
{
rectangle4 = new Rectangle((int)FireBallsLeft[i].Position.X - FireBallsLeft[i].Texture.Width, (int)FireBallsLeft[i].Position.Y - FireBallsLeft[i].Texture.Height,
FireBallsLeft[i].Texture.Width, FireBallsLeft[i].Texture.Height);
rectangle2 = Platforms[x].BoundingRectangle;
if (rectangle4.Intersects(rectangle2))
{
// Remove fireball from list
FireBallsLeft.RemoveAt(i);
}
}
}
// Check if fireball intersects with demon enemy
for (int i = 0; i < FireBallsRight.Count; i++)
{
for (int x = 0; x < DemonEnemies.Count; x++)
{
rectangle4 = new Rectangle((int)FireBallsRight[i].Position.X - FireBallsRight[i].Texture.Width, (int)FireBallsRight[i].Position.Y - FireBallsRight[i].Texture.Height,
FireBallsRight[i].Texture.Width, FireBallsRight[i].Texture.Height);
rectangle2 = DemonEnemies[x].BoundingRectangle;
if (rectangle4.Intersects(rectangle2))
{
// Subtract demon health when fireball hits
DemonEnemies[x].health -= FireBallsRight[i].damage;
// Remove fireball from list
FireBallsRight.RemoveAt(i);
/*// Kill the demon when health reaches 0
if (DemonEnemies[x].health <= 0)
{
DemonEnemies.RemoveAt(x);
}*/
}
}
}
// Check if fireball intersects with demon enemy
for (int i = 0; i < FireBallsLeft.Count; i++)
{
for (int x = 0; x < DemonEnemies.Count; x++)
{
rectangle4 = new Rectangle((int)FireBallsLeft[i].Position.X - FireBallsLeft[i].Texture.Width, (int)FireBallsLeft[i].Position.Y - FireBallsLeft[i].Texture.Height,
FireBallsLeft[i].Texture.Width, FireBallsLeft[i].Texture.Height);
rectangle2 = DemonEnemies[x].BoundingRectangle;
if (rectangle4.Intersects(rectangle2))
{
// Subtract demon health when fireball hits
DemonEnemies[x].health -= FireBallsLeft[i].damage;
// Remove fireball from list
FireBallsRight.RemoveAt(i);
// Kill the demon when health reaches 0
if (DemonEnemies[x].health <= 0)
{
DemonEnemies.RemoveAt(x);
}
}
}
}
}
FireBall.cs
class FireBall
{
public Texture2D Texture;
public Vector2 Position;
public Rectangle BoundingRectangle;
public int damage;
public float moveSpeed;
public FireBall(Texture2D Texture, Vector2 Position)
{
this.Texture = Texture;
this.Position = Position;
BoundingRectangle = new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height);
damage = 50;
moveSpeed = 10f;
}
public void MoveRight()
{
Position.X += moveSpeed;
}
public void MoveLeft()
{
Position.X -= moveSpeed;
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(Texture, new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height), Color.White);
}
}
Enemy.cs
class Enemy
{
public Texture2D Texture;
public Vector2 Position;
public Rectangle BoundingRectangle;
public int score;
public int health;
public float moveSpeed;
public Enemy(Texture2D Texture, Vector2 Position, int score, int health, float moveSpeed)
{
this.Texture = Texture;
BoundingRectangle = new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height);
this.score = score;
this.health = health;
this.moveSpeed = moveSpeed;
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(Texture, BoundingRectangle, Color.White);
}
}