繁体   English   中英

C# 虚拟方法问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM