从NPC处理/跟踪类(C#/ XNA)中获取变量

时间:2016-03-31 06:17:40

标签: c# xna

我道歉,因为我真的不知道如何描述我的问题。

我正在制作一个包含数百个关卡的游戏,因此会包含数百个不同的NPC。由于这是一个MMO风格的游戏,需要保留所有NPC的状态,我已经决定创建一个类来跟踪每个NPC的每个实例,当玩家进入关卡时,它可以提供该区域内所有NPC的列表,他们去哪里,等等。问题是,由于这个NPC Control类存储了许多不同的类,C#将不允许我从他们那里获取我需要的信息,例如我的Game1类的Draw方法中的x / y / image,因为它不知道那些变量存在。

我当前的NPC控制类看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyWorld
{
    public class NpcsControl
    {
        public List<object> GetNPCs(string levelname)
        {
            List<object> NPCs = new List<object>();
            switch (levelname)
            {
                case "garden2":
                    NPC_TreeBreakable NPCtree = new NPC_TreeBreakable();
                    NPCtree.x = 16;
                    NPCtree.y = 16;
                    NPCs.Add(NPCtree);
                    NPCtree = new NPC_TreeBreakable();
                    NPCtree.x = 16;
                    NPCtree.y = 512;
                    NPCs.Add(NPCtree);
                    NPC_TestLamp NPCtestlamp = new NPC_TestLamp();
                    NPCtestlamp.x = 16;
                    NPCtestlamp.y = 1024;
                    NPCs.Add(NPCtestlamp);
                    break;
            }
            return NPCs;
        }
    }
}

虽然我的树NPC代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyWorld
{
    public class NPC_TreeBreakable
    {
        public string image = "tree_new";
        public int x;
        public int y;
    }
}

我需要在Game1.cs中获取这个,以便我可以向游戏展示绘制这些内容的位置。目前它正在使用此代码:

foreach (object o in npcControl.GetNPCs(players[0].level))
            {
                object ob = o.GetType(); //ob == MyWorld.NPC_TreeBreakable
                imgpos.X = ((NPC_TreeBreakable)(o)).x;
                imgpos.Y = ((NPC_TreeBreakable)(o)).y;
                SpriteTexture = Content.Load<Texture2D>(((NPC_TreeBreakable)(o)).image);
                spriteBatch.Draw(SpriteTexture, imgpos, new Rectangle(0, 0, SpriteTexture.Width, SpriteTexture.Height), Color.White);
        }

问题是我被迫手动输入“((NPC_TreeBreakable)(o))。x”或“((NPC_TestLamp)(o))。x”而不是只能使用((ob) )(o))。x因为C#知道并非每个类都有“x”,“y”或“image”变量。即使他们将在每个NPC中。

如何解决这个问题,以便在C#不知道这样的情况下我可以引用变量?

谢谢!

0 个答案:

没有答案