精灵根本不会渲染

本文关键字:精灵 | 更新日期: 2023-09-27 18:30:44

类看起来像这样:

Game
has-a Player
Player
has-a SpriteInstance
SpriteInstance
has-a List<SpriteInstance>

每个渲染步骤,Game调用Draw() PlayerPlayer SpriteInstance上打电话draw()draw()看起来像这样:

public void draw(SpriteBatch spriteBatch, Vector2 offset = default(Vector2), float rotation = 0f)
{
    spriteBatch.Draw(texture, offset + pos, null, Color.White, rot+rotation, sprite.origin, 1f, SpriteEffects.None, z);
    foreach (var child in children)
    {
        child.draw(spriteBatch, offset + pos, rotation + rot);
    }
}

我的预期输出是能够在屏幕上看到精灵实例,以及来自精灵实例的每个子级的每个纹理,但我的实际输出只是精灵实例,没有子级。我尝试使用调试器,但它表明孩子的 draw() 函数肯定被调用了。而且由于spriteBatch是一个神奇的黑匣子,我能走多远......

传递精灵批次有什么问题吗?当它应该通过引用传递时,我是否以某种方式按值传递它?

编辑:这是所有的绘图功能

游戏

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        // TODO: Add your drawing code here
        spriteBatch.Begin();// sortMode: SpriteSortMode.FrontToBack);
        player.Draw(spriteBatch);
        spriteBatch.End();

        base.Draw(gameTime);
    }

选手

    public void Draw(SpriteBatch spriteBatch)
    {
        sprite.draw(spriteBatch);
    }

编辑2

将 spriteBatch.draw() 调用引入 foreach 循环确实可以显示它,但我不知道有什么区别......这也不是一个正确的解决方案。

精灵根本不会渲染

试试这个,让我知道它是否有效。

public void draw(SpriteBatch spriteBatch, Vector2 offset = default(Vector2), float rotation = 0f)
{
spriteBatch.Begin(); //Starts the drawing loop
spriteBatch.Draw(texture, offset + pos, null, Color.White, rot+rotation,   sprite.origin, 1f, SpriteEffects.None, z);
foreach (var child in children)
{
    child.draw(spriteBatch, offset + pos, rotation + rot);
}
spriteBatch.End();  // This is for ending the drawing loop.
}

如果这不起作用,我希望看到您的主类,以及您在运行应用程序时获得的输出的副本。还请列出发生的任何错误。