C#XNA:自定义绘图类不是';t打印文本,尽管它有正确的位置

本文关键字:文本 位置 打印 绘图 自定义 C#XNA | 更新日期: 2023-09-27 18:26:59

所以我试图用C#和XNA绘制一些文本。我已经很好地加载了SpriteFont,代码中没有错误,也没有编译时警告或错误。在执行过程中不会引发任何错误。

当我从主游戏类中绘制文本时,效果很好。然而,我有一个单独的课,我正试图借鉴它。我已经创建了它的一个实例,称为构造函数和它的Draw()函数,但它仍然不起作用。

以下是主要的游戏类(无论如何都是相关的部分):

protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Turquoise);
        if (!startScreen.hasRun)
        {
            // Works fine
            spriteBatch.Begin();
            spriteBatch.DrawString(spaceAge, "Score 0", new Vector2(50, 50), Color.Black);
            spriteBatch.End();
            // Fails to draw
            startScreen.Draw(spriteBatch);
        }
        else
        {
        }
        base.Draw(gameTime);
    }

以下是startScreen实例的Draw()函数,它引用(从另一个文件中的单独StartScreen类创建):

public Boolean Draw(SpriteBatch spriteBatch)
    {
        if (this.hasRun == false)
        {
            spriteBatch.Begin();
            spriteBatch.Draw(this.background, new Rectangle(0, 0, this.screenWidth, this.screenHeight), Color.White);
            spriteBatch.DrawString(this.font, "DevBuild: 001", new Vector2(this.textStart, 50), Color.Black);
            spriteBatch.End();
            /* Console.WriteLine("hasRun: " + hasRun);
            Console.WriteLine("screenWidth: " + Convert.ToString(screenWidth));
            Console.WriteLine("screenHeight: " + Convert.ToString(screenHeight));
            Console.WriteLine("dimensions.X: " + Convert.ToString(stringDimensions.X));
            Console.WriteLine("dimensions.Y: " + Convert.ToString(stringDimensions.Y));
            Console.WriteLine("textStart: " + Convert.ToString(textStart)); */
            // All the logs above give the right output
            this.hasRun = true;
            Console.WriteLine("hasRun: " + hasRun);
            return true;
        }
        else return false;
    }

那么,当这个函数有正确的屏幕坐标来绘制文本时((textStart, 50),其中textStart在800宽的屏幕上计算为312),并且对DrawString的调用是相同的格式,为什么文本不会显示呢?

如果有必要,可以随时要求提供更多代码。

(注意:这里对spriteBatch.Draw的调用也不起作用,图像无法绘制——也许这是同一个问题?)

编辑:我尝试了以下建议:从StartScreen类中删除Begin()End(),并在调用Begin()End()之间调用游戏的Draw()函数中的startScreen.Draw()。仍然没有画出任何东西。

C#XNA:自定义绘图类不是';t打印文本,尽管它有正确的位置

与其让你的绘制方法成为公共布尔,不如让它成为公共void并有一个变量布尔,然后它应该可以工作,你的代码应该是这样的:

bool drawn = false;
// defined at the top of your class so that the draw method doesn't need to be a bool
public Void Draw(SpriteBatch spriteBatch)
{
    if (this.hasRun == false)
    {
        spriteBatch.Begin();
        spriteBatch.Draw(this.background, new Rectangle(0, 0, this.screenWidth,this.screenHeight), Color.White);
        spriteBatch.DrawString(this.font, "DevBuild: 001", new Vector2(this.textStart, 50), Color.Black);
        spriteBatch.End();
        /* Console.WriteLine("hasRun: " + hasRun);
        Console.WriteLine("screenWidth: " + Convert.ToString(screenWidth));
        Console.WriteLine("screenHeight: " + Convert.ToString(screenHeight));
        Console.WriteLine("dimensions.X: " + Convert.ToString(stringDimensions.X));
        Console.WriteLine("dimensions.Y: " + Convert.ToString(stringDimensions.Y));
        Console.WriteLine("textStart: " + Convert.ToString(textStart)); */
        // All the logs above give the right output
        this.hasRun = true;
        Console.WriteLine("hasRun: " + hasRun);
        drawn = true;
    }
    else 
    {
        drawn = false;
    }
}

还有为什么Draw方法需要有一个bool,从你给出的代码来看,它看起来不像你在任何地方使用过