实体管理,具有继承方法调用

时间:2015-07-17 15:33:51

标签: c# xna entity monogame

所以,我正在创建一个带有实体系统的游戏。

公共类Bullet:实体

公共类Npc:实体

公共类坦克:实体

公共类实体

一个实体只是有一些功能: 更新(),渲染()

我创建了一个如下列表:

List<Entity> entities = new List<Entity>();

我循环浏览所有这些并调用更新() / 渲染()

但是存储的项目符号 Npcs 将不会使用其更新或渲染功能进行调用。

TL; DR

如何使用Update / Render函数存储不同的类,并在循环中为所有类调用它。

实体

class Entity
{
    public void Update(GameTime gameTime, GraphicsDevice gd, Player p, Tilemap tm, EntityManager em)
    {

    }
    public void Draw(SpriteBatch sb)
    {

    }
}

子弹

class Bullet : Entity
{
    public new void Update(GameTime gameTime, GraphicsDevice gd, Player p, Tilemap tm, EntityManager em)
    {
    }

    public new void Render(SpriteBatch spriteBatch)
    {
    }

}

实体经理

class EntityManager
{
    public List<Entity> entityList = new List<Entity>();

    public void Update(GameTime gameTime, GraphicsDevice graphics, Player p, Tilemap tm, EntityManager em)
    {
        int i = 0;
        while (i < entityList.Count)
        {
            entityList[i].Update(gameTime, graphics, p, tm, em);
            i++;
        }
    }
    public void Render(SpriteBatch sb)
    {
        foreach (Bullet entity in entityList)
        {
            entity.Draw(sb);
        }
    }

}

1 个答案:

答案 0 :(得分:2)

更改Entity方法以使用virtual关键字:

public virtual void Update(...

public virtual void Draw(...

在您的子课程中,您希望 覆盖 基类&#39;使用override关键字的方法,而不是new关键字:

public override void Update(...

public override void Draw(...

通过在继承树中使用virtual/override组合,您将启用多态,这将允许子类&#39;即使从List<Entity>执行此操作也会被调用的方法。

链接到polymorphism in C#上的更多信息。