Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从NPC处理/跟踪类(C#/XNA)获取变量_C#_Xna - Fatal编程技术网

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

从NPC处理/跟踪类(C#/XNA)获取变量,c#,xna,C#,Xna,我道歉,因为我真的不知道如何描述我的问题 我正在开发一个包含数百个关卡的游戏,因此将包含数百个不同的NPC。因为这是一款MMO风格的游戏,所有NPC的状态都需要保留,所以我决定创建一个类,为我跟踪每个NPC的每个实例,当玩家进入某个关卡时,它可以提供该区域所有NPC的列表,它们会去哪里,等等。问题是,由于这个NPC控件类存储了大量不同的类,C#不允许我从它们那里获取所需的信息,例如Game1类的Draw方法中的x/y/图像,因为它不知道这些变量存在 我当前的NPC控件类如下所示: using S

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

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

我当前的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;
        }
    }
}
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);
        }
foreach(npcControl.GetNPCs中的对象o(玩家[0].level))
{
对象ob=o.GetType();//ob==MyWorld.NPC\u treebrakable
imgpos.X=((NPC_树可破)(o)).X;
imgpos.Y=((NPC_树可破)(o)).Y;
SpriteTexture=Content.Load(((NPC_treebrakable)(o)).image);
spriteBatch.Draw(SpriteTexture,imgpos,新矩形(0,0,SpriteTexture.Width,SpriteTexture.Height),Color.White);
}
问题是我被迫手动输入“((NPC_treebrakable)(o)).x”或“((NPC_TestLamp)(o)).x”,而不是只能使用((ob)(o)).x,因为C#知道并非每个类都可能有“x”、“y”或“image”变量。即使他们将在每个NPC中

我该如何解决这个问题,以便在C#不知道这样期望变量时可以引用它们


谢谢大家!

我的朋友,你需要学习和理解面向对象编程的坚实原则。您违反了ISP(接口隔离原则),基本上不必要地使您自己的代码复杂化。我推荐罗伯特·马丁(Robert Martin)的《干净的代码》(Clean Code)一书,但要想快速了解这本书,只需搜索OOP和SOLID——一旦你理解了编码的核心原则,你就再也不会回头了。我的朋友,你需要学习和理解面向对象编程的坚实原则。您违反了ISP(接口隔离原则),基本上不必要地使您自己的代码复杂化。我推荐罗伯特·马丁(Robert Martin)的《干净的代码》(Clean Code)一书,但要想快速了解这本书,只需搜索OOP和SOLID——一旦你理解了编码的核心原则,你就再也回不去了。