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()
。仍然没有画出任何东西。
与其让你的绘制方法成为公共布尔,不如让它成为公共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,从你给出的代码来看,它看起来不像你在任何地方使用过