【问题标题】:C# Virtual Method IssueC# 虚拟方法问题
【发布时间】: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+


【解决方案1】:

我会调查您是否致电OnRender。调用这些事件处理程序不是最佳实践。必须是您需要调用的其他一些方法,它将调用OnRender

类似于OnDraw(事件处理程序)和Update(调用方法)

【讨论】:

  • 我不明白……你知道这些方法是我自己的吗?
【解决方案2】:

我认为你做了override 错误的方法,我看到你已经覆盖了OnRender 虽然您可能调用了Render 方法。

尝试在子类中创建Render 方法virtualoverride

【讨论】:

  • Render方法执行OnRender方法
猜你喜欢
  • 1970-01-01
  • 2012-11-30
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2015-09-09
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多