如何保留自定义基类的子自定义类<;列表>;C#XNA

本文关键字:自定义 C#XNA gt lt 列表 何保留 保留 基类 | 更新日期: 2023-09-27 18:20:55

这是我第一次发帖,但我在这个网站上发现了很多对我的编程有很大帮助的东西。

我正试图写一个简单的游戏函数来帮助更好地学习编程的来龙去脉,但我遇到了困难。当我试图制作一个函数,让我的玩家和敌人可以轻松地绘制、更新和检查碰撞时,我制作了一个他们的父类。然后我列出了每个子类(玩家和敌人,所以我可以随意添加多个)的列表,添加到父类列表中。我希望我可以使用父列表,让子类只需一个列表调用就可以完成相应的功能,但每当我运行代码时,就会发生奇怪的事情。例如,如果currentPlayers超过1,则不会抽取任何敌人,并与敌人对抗。我也不能(正确地)运行我的碰撞函数,因为它是从子列表而不是父列表中运行的。

我想我真正的问题是如何将子列表与父列表分开,但仍然使用父列表进行所有函数调用。例如,使用actorList调用Player.Update和敌人。更新,但仍然使用actorList调用我的碰撞检测,并确定actorList[i]是玩家还是敌人。再次感谢您抽出时间。`

class ActorManager
{
    static ActorManager instance;
    List<Enemy> enemies = new List<Enemy>();
    List<Player> players = new List<Player>();
    int currentActors;
    int currentEnemies =1;
    int currentPlayers = 1;
    List<Actor> actorList = new List<Actor>();
    public static ActorManager Instance
    {
        get
        {
            if (instance == null)
                instance = new ActorManager();
            return instance;
        }
    }
    public void Init()
    {
        for (int i = 0; i < currentPlayers; i++)
        {
            players.Add(new Player());
        }
        for (int i = 0; i < currentEnemies; i++)
        {
            enemies.Add(new Enemy());
        }

        // updates how many actors are currently in game
        this.UpdateCurrentActors();
        for (int i = 0; i < currentPlayers; i++)
        {  
            actorList.AddRange(players);
        }
        for (int i = 0; i < currentEnemies; i++)
        {
            actorList.AddRange(enemies);
        }

    }
    public void LoadContent(ContentManager Content)
    {
        this.UpdateCurrentActors();
        for (int i = 0; i < currentActors; i++)
        {
            actorList[i].LoadContent(Content);
        }
    }
    public void Update(GameTime gameTime)
    {
        for (int i = 0; i < currentActors; i++)
        {
            actorList[i].Update(gameTime);
        }
        CheckPlayerHit();
        this.UpdateCurrentActors();
    }
    public void Draw(SpriteBatch spriteBatch)
    {
        for (int i = 0; i < currentActors; i++)
        {
            actorList[i].Draw(spriteBatch);
        }
    }
    void UpdateCurrentActors()
    {
        currentActors = (currentEnemies + currentPlayers);
    }
    void CheckPlayerHit()
    {
        for (int i = 0; i < currentPlayers; i++)
        {
            Rectangle thePlayer = new Rectangle((int)players[i].AttackBox.X, (int)players[i].AttackBox.Y, players[i].AttackBox.Width, players[i].AttackBox.Height);
            for (int j = 0; j < currentEnemies; j++)
            {
                Rectangle theEnemy = new Rectangle((int)enemies[j].HitBox.X, (int)enemies[j].HitBox.Y, enemies[j].HitBox.Width, enemies[j].HitBox.Height);
                if (thePlayer.Intersects(theEnemy))
                {
                    if (players[i].IsAttacking == true)
                    {
                        enemies[j].CurrentHealth -= players[i].Strength;
                    }
                }
            }
        }
    }

}

}`

如果有什么事情我忘了,请随时询问。

如何保留自定义基类的子自定义类<;列表>;C#XNA

欢迎来到Stack Overflow,我绝非游戏编程专家,但我会尽力给你一些有用的建议。

我建议阅读有关继承的一般内容(http://msdn.microsoft.com/en-us/library/ms173149.aspx是指向一些以C#为中心的MSDN文档的链接)。

在您的情况下,如果您的类派生自一个公共对象Actor,则可以将您的子对象存储在Actors的列表中,并根据需要调用您重写的任何方法。

例如,作为一个简单的例子运行这个:

class Program
{
    static void Main(string[] args)
    {
        List<Actor> MyActors = new List<Actor>();
        MyActors.Add(new Player());        
        MyActors.Add(new Enemy());        
        MyActors.Add(new Player());
        foreach (var Actor in MyActors)
        {
            Actor.DoSomething();
        }
    }
}
public abstract class Actor
{
    public string Name;
    public virtual void DoSomething()
    {
        Console.WriteLine("Actor does something");
    }
}
public class Player : Actor
{
    public override void DoSomething()
    {
        Console.WriteLine("Player does something");
    }        
}
public class Enemy : Actor
{
    public override void DoSomething()
    {
        Console.WriteLine("Enemy does something");
    }       
}

将产生以下输出:

Player does something
Enemy does something
Player does something

因此,通过模拟,您的子类特定的Update方法将被调用。

就你的程序而言,我可以发现一些可能有帮助的奇怪之处。

你的currentEnemiescurrentPlayers在初始化后似乎永远不会被分配给,所以你的currentActors永远是2。您最好使用enemies.Countplayers.Count来获得currentEnemiescurrentPlayers,这样它们就不会不同步。

您可能也可以删除UpdateCurrentActors方法,除非它要做更复杂的事情。你应该能够从你的actorList中获得当前参与者的数量,这是另一个你可能会失去同步的地方。

根据你最终会对你的玩家/敌人做什么,实际上你最好把它们作为单独的列表,尤其是如果你最终会把它们分成很多的话。

如果我有什么愚蠢的建议,请告诉我。