C# 游戏引擎组件问题

C# 游戏引擎组件问题,c#,game-engine,gdi+,C#,Game Engine,Gdi+,我目前正在使用C#中的GDI+开发一个游戏引擎。目前我正在实现组件。组件可以附加到游戏对象。游戏对象渲染到屏幕上,屏幕显示在窗口/窗体上 在继续之前,请看一下GameObject类中的以下几行: private List<Component> components = new List<Component>(); public GameObject() { AddComponent(new Transform()); }

我目前正在使用C#中的GDI+开发一个游戏引擎。目前我正在实现组件。组件可以附加到游戏对象。游戏对象渲染到屏幕上,屏幕显示在窗口/窗体上

在继续之前,请看一下GameObject类中的以下几行:

    private List<Component> components = new List<Component>();

    public GameObject()
    {
        AddComponent(new Transform());
    }

    public void Update(GameTime gameTime)
    {
        components.ForEach(c => c.OnUpdate(gameTime));
    }

    public void Render(GraphicsEngine graphicsEngine)
    {
        components.ForEach(c => c.OnRender(graphicsEngine));
    }

    public void AddComponent(Component component)
    {
        component.gameObject = this;
        components.Add(component);
    }

    public T GetComponentOfType<T>() where T : Component
    {
        return (T)GetComponentOfType(typeof(T));
    }

    private Component GetComponentOfType(Type type)
    {
        for (int i = 0; i < components.Count; i++)
            if (components[i].GetType() == type)
                return components[i];

        return null;
    }

    public Transform Transform
    {
        get { return GetComponentOfType<Transform>(); }
    }
private List components=new List();
公共游戏对象()
{
AddComponent(新转换());
}
公开作废更新(游戏时间游戏时间)
{
ForEach(c=>c.OnUpdate(gameTime));
}
公共无效渲染(GraphicsEngine GraphicsEngine)
{
ForEach(c=>c.OnRender(graphicsEngine));
}
公共void AddComponent(组件组件)
{
component.gameObject=这个;
组件。添加(组件);
}
public T GetComponentOfType(),其中T:Component
{
返回(T)GetComponentOfType(typeof(T));
}
私有组件GetComponentOfType(类型类型)
{
对于(int i=0;i
现在,当我向您展示下一段代码时,希望您能更清楚一点

基本上,我有一个方法可以从XML文件加载一堆游戏对象。但由于某些原因,根据我将精灵组件添加到游戏对象的方式,有时它无法正常工作,只有一些游戏对象精灵渲染到屏幕上

下面是加载游戏对象的方法的部分代码:

 // Creates the object and sets the position
 GameObject obj = new GameObject();
 obj.Transform.Position = new Maths.Vector2(x * map.TileWidth, y * map.TileHeight);

 // This works and renders all sprites to the screen
// obj.AddComponent(new SpriteComponent(sprs[sprID].Bitmap));

// This works and renders all sprites to the screen
// obj.AddComponent(new SpriteComponent());
// obj.GetComponentOfType<SpriteComponent>().Bitmap = sprs[sprID].Bitmap;

 // This doesn't work and only renders some sprites to the screen
 obj.AddComponent(sprs[sprID]);

 // Adds the game object to the screen
 screen.AddGameObject(obj);
//创建对象并设置位置
GameObject obj=新GameObject();
obj.Transform.Position=new math.Vector2(x*map.TileWidth,y*map.TileHeight);
//这将工作并将所有精灵渲染到屏幕上
//AddComponent(新的SpriteComponent(sprs[sprID].Bitmap));
//这将工作并将所有精灵渲染到屏幕上
//obj.AddComponent(新的SpriteComponent());
//obj.GetComponentOfType().Bitmap=sprs[sprID].Bitmap;
//这不起作用,只会将一些精灵渲染到屏幕上
对象添加组件(sprs[sprID]);
//将游戏对象添加到屏幕
screen.AddGameObject(obj);
为了澄清,sprs是一个sprite组件列表


任何帮助都会很棒

好的-最有可能的解释是AddComponent在将游戏对象添加到列表之前将其引用放入组件中,但我猜您的sprs[]数组构造不会-在没有所有代码的情况下很难判断。

不清楚您所说的“有时它工作不正常”是什么意思。忽略应用程序的功能,您是说行“obj.AddComponent()”不会导致将组件添加到组件列表中吗?这似乎不太可能。我认为更可能的情况是您没有正确处理GDI+位图对象,因为这些对象需要仔细的生命周期管理。我们这里没有完整的代码图片-我们看不到SPR[]是如何创建的,因此如果我将您的代码示例输入到VS.net中,它将不会编译。我们需要一个可验证的例子来帮助。如果你阅读我代码中的注释,我会说“这不起作用,只会将一些精灵渲染到屏幕上”。sprs[]是SpriteComponents的列表,正在使用new关键字(sprs=new list();)创建。精灵组件都被添加到屏幕上,但由于某种原因,当我将精灵组件从sprs列表传递到AddComponent方法时,并非所有的精灵组件都被渲染。-你是说行“obj.AddComponent()”不会导致组件被添加到组件列表中吗?或者只是因为它们渲染不正确?@PhillipH obj.AddComponent()方法确实会将一个组件添加到列表中,但是当我写这行“obj.AddComponent(sprs[sprID]);”而不是其他两个选项时,并不是所有的精灵都渲染到屏幕上。总而言之,所有组件都被添加到列表中,但当我使用行“obj.AddComponent(sprs[sprID]);”时,并不是所有组件都会呈现到屏幕上。事实证明,并不是每个组件都会被分配一个游戏对象。。。我不确定这是为什么,但我通过遍历组件列表发现了这一点,并查看了对游戏对象的组件引用是否为null,然后对其进行了更正。对不起,我会自己更正,游戏对象引用不是null,它只是不等于这个。。。这很奇怪