C#XNA:自定义绘图类虽然位置正确但不打印文本

时间:2014-10-17 20:09:16

标签: c# xna xna-4.0

所以我试图用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);
    }

以下是引用的Draw()实例的startScreen函数(从另一个文件中的单独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),以及调用{{ 1}}是相同的格式,文本没有显示?

如果有必要,请随时提出更多代码。

(N.B。这里对DrawString的调用也不起作用,图像没有被绘制 - 也许这是同一个问题?)

编辑:我已尝试过以下建议:从StartScreen类中删除了spriteBatch.DrawBegin(),并在游戏的End()函数中调用了startScreen.Draw() Draw()Begin()。仍然没有画出来。

1 个答案:

答案 0 :(得分:1)

而不是让你的draw方法成为一个公共bool使它成为一个公共空白并且有一个变量bool然后它应该工作,你的代码应该是这样的:

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并不像你在任何地方使用过它