0

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

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

我想我真正的问题是如何将子列表与父列表分开,但仍然使用父列表来进行所有函数调用。例如使用actorList调用Player.Update和enemy.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;
                    }
                }
            }
        }

    }


}

}`

如果有什么我忘记了,请随时问。

4

1 回答 1

0

欢迎来到 Stack Overflow,我绝不是游戏编程方面的专家,但我会尽力为您提供一些有用的建议。

我建议阅读有关继承的一般信息(http://msdn.microsoft.com/en-us/library/ms173149.aspx是一些以 C# 为重点的 MSDN 文档的链接)。

在您的情况下,如果您的类派生自一个 common object 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方法将被调用。

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

你的currentEnemiesandcurrentPlayers似乎在初始化后没有被分配,所以你的currentActors永远是2。你最好使用enemies.Countandplayers.Count来获取你的currentEnemiesand currentPlayers,所以它们不会不同步。

你也可以删除你的UpdateCurrentActors方法,除非它会做一些更复杂的事情。您应该能够从您的 中获取当前演员的数量actorList,这是您可能最终不同步的另一个地方。

根据你最终对你的玩家/敌人所做的事情,你实际上可能最好将它们保留为单独的列表,特别是如果你最终要将它们分开很多。

如果我提出了任何愚蠢的建议,请告诉我。

于 2013-07-04T12:40:42.100 回答