[英]C# Virtual Method Issue
我目前正在使用 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));
}
}
这是我遍历组件列表并渲染它时的结果图片,或者由它自己渲染 sprite 组件时的结果:
我会调查你调用OnRender
。 调用这些事件处理程序不是最佳做法。 必须是您需要调用的其他一些方法,这些方法将调用OnRender
。
类似于OnDraw
(事件处理程序)和Update
(调用方法)
我认为您确实override
错误的方法,正如我所见,您覆盖了OnRender
而您可能调用了Render
方法。
尝试使Render
方法virtual
并在子类中override
它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.