【发布时间】:2017-03-08 05:44:28
【问题描述】:
我目前正在使用 GDI+ 在 C# 中编写 2D 游戏引擎,目前我正在尝试实现基于组件的结构。
这个想法是我的 GameObject 类有一个组件列表。每个组件都可以与下一个完全不同。
我通过创建一个 Component 类来表示组件,如下所示:
public class Component : BaseObject
{
/// <summary>
/// The game object this component is attached too.
/// </summary>
private GameObject gameObject = null;
/*
* Below I called the protected virtual methods from the "BaseObject" class.
* The base object class only contains these 4 protected virtual methods. Nothing else.
*/
public void Load()
{
OnLoad(this, EventArgs.Empty);
}
public void Unload()
{
OnUnload(this, EventArgs.Empty);
}
public void Update(GameTime gameTime)
{
OnUpdate(this, new UpdateEventArgs(gameTime));
}
public void Render(GraphicsEngine graphicsEngine)
{
OnRender(this, new RenderEventArgs(graphicsEngine));
}
public GameObject GameObject
{
get { return gameObject; }
set { gameObject = value; }
}
}
在我的游戏对象类中,组件列表中的每个组件都会更新并呈现如下:
internal void Update(GameTime gameTime)
{
OnUpdate(this, new UpdateEventArgs(gameTime));
// All components being updated
components.ForEach(c => c.Update(gameTime));
}
话虽如此,我已经创建了一个 SpriteComponent 类,它旨在根据游戏对象的位置渲染一个简单的 2D 精灵,它被覆盖的渲染方法如下所示:
protected override void OnRender(object sender, RenderEventArgs e)
{
e.GraphicsEngine.DrawBitmap(bitmap, GameObject.Transform.Position);
base.OnRender(sender, e);
}
但是由于某种原因会发生这种情况(这是 GameObject 类的渲染方法):
internal void Render(GraphicsEngine graphicsEngine)
{
if (Enabled)
{
// Rendering a sprite component like this works fine
// Here I've created created a SpriteComponent inside the game object class to test it
if(sprite != null)
graphicsEngine.DrawBitmap(sprite.Bitmap, transform.Position);
OnRender(this, new RenderEventArgs(graphicsEngine));
// But rendering it using it's own method doesn't work
//sprite.Render(graphicsEngine);
// and this doesn't work properly either
// components.ForEach(c => c.Render(graphicsEngine));
}
}
这是我遍历组件列表并渲染它或通过它自己渲染精灵组件时的结果图片:
【问题讨论】:
-
代码对我来说看起来不错。当您在 GameObject 的 Render 方法中调用 sprite.Render(graphicsEngine) 时,究竟会发生什么?它会抛出异常吗?如果在 Sprite 的 OnRender 中设置断点,执行会中断吗?
-
@rs232 帖子底部的屏幕截图显示了当我在游戏对象渲染方法中调用 sprite.Render 时会发生什么。这与我遍历组件列表并呈现它的结果相同。
-
嗯,那么预期的结果是什么?直接从 GameObject 的 Render 方法调用 graphicsEngine.DrawBitmap 会得到什么?
-
直接从 render 方法调用 graphicsEngine.DrawBitmap,正确绘制所有精灵,最终得到一张完整的地图。
-
不幸的是,我不知道什么被认为是“正确的”以及完整的地图在您的情况下应该是什么样子。它是否包含相同的精灵集但位置不同?那些精灵会重复/平铺吗?能否请您更具体一点?
标签: c# game-engine gdi+