我道歉,因为我真的不知道如何描述我的问题。
我正在制作一个包含数百个关卡的游戏,因此会包含数百个不同的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#不知道这样的情况下我可以引用变量?
谢谢!