如何永久删除XNA中的敌人精灵

时间:2013-06-04 10:02:49

标签: c# xna sprite

我是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);
        }
    }
}

2 个答案:

答案 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数据结构。