我目前正在使用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>(); }
}
现在希望当我向您展示下一段代码时,事情可能会更加清晰。
基本上,我有一个从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);
只是澄清一下,sprs是一个精灵组件列表
任何帮助都会很棒!
答案 0 :(得分:0)
好的 - 最可能的解释是AddComponent在将游戏对象添加到列表之前将对游戏对象的引用放入组件中,但是我猜测你的sprs []数组构造没有 - 很难说没有所有的代码。