我是XNA 4.0的新手,我正在尝试制作超级马里奥兄弟类型的游戏,其中玩家跳下敌人杀死他们。但是我遇到了杀死敌人的问题。我在我的角色(rectangleBox
)下面做了一个15px的矩形,这样如果它与敌人的矩形相交,它将导致enemy.alive = false
。如果这个enemy.alive = false
它不会吸引敌人。然而,这仅适用于矩形相交的时间。一旦敌人离开rectangleBox
的边界,它就会再次出现。如何永久删除敌人,以便在我重新开始游戏之前不再重生?
敌人类代码:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace notDMIG
{
class Enemy
{
public Texture2D texture;
public Rectangle bounds;
public Vector2 position;
public Vector2 velocity;
public float timer = 0.0f;
public int spriteNum = 1;
public int maxSpriteNum;
public bool alive;
public Enemy(Texture2D Texture, Vector2 Position, Vector2 Velocity, int maxsprites)
{
texture = Texture;
position = Position;
velocity = Velocity;
maxSpriteNum = maxsprites;
alive = false;
}
}
}
Game1.cs敌人相关代码
protected override void Update(GameTime gameTime)
{
foreach (Enemy enemy in Enemies)
{
enemy.alive = true;
Rectangle rectangleBox = new Rectangle((int)player.position.X, (int)player.position.Y + player.sprite.Height + 15, player.sprite.Width, 1);
Rectangle enemyBox = new Rectangle((int)enemy.position.X, (int)enemy.position.Y, enemy.texture.Width, enemy.texture.Height);
if (enemy.alive == true)
{
if (rectangleBox.Intersects(enemyBox))
{
enemy.alive = false;
continue;
}
}
}
}
protected override void Draw(GameTime gameTime)
{
foreach (Enemy enemy in Enemies)
{
if (enemy.alive == true)
{
spriteBatch.Draw(enemy.texture, enemy.position, Color.White);
}
}
}
答案 0 :(得分:3)
我不建议在Update方法中使用你的enemy.alive = true,而是建议将它放在initialize方法中。初始化方法仅在程序开始时调用(其中所有敌人应该在技术上是活的),而更新方法每秒调用数百次。所以你的程序正在做的是“敌人与玩家相交,敌人已经死亡,下一次更新循环,敌人再次活着”。
所以是的,我只是将它放在你的初始化方法而不是更新。
答案 1 :(得分:2)
您应该考虑根本不使用您的Alive属性,并将列表中的对象视为活着的敌人。请记住,我会将您的代码重构为以下内容:
protected override void Update(GameTime gameTime)
{
for (int i = 0; i < Enemies.Count; i++)
{
//If player intersects enemy
if ( player.Bounds.Intersects(Enemies[i].Bounds) )
{
Enemies.RemoveAt(i);
i--;
continue;
}
}
}
protected override void Draw(GameTime gameTime)
{
foreach (Enemy enemy in Enemies)
{
spriteBatch.Draw(enemy.texture, enemy.position, Color.White);
}
}
在我的代码中,我们现在遍历每个敌人检查交叉点。如果找到了一个交叉点,我们会从列表中删除该敌人。这将永远删除他,并大大简化您的代码。
通常在使用.Alive等属性时,您将使用Pool数据结构。