如何修复“非静态字段、方法或属性需要对象引用”?
本文关键字:属性 对象引用 方法 何修复 静态 非静态字段 字段 | 更新日期: 2023-09-27 18:15:45
我试图写一些代码,显示我的球员的X值在文本中。它告诉我Microsoft.Xna.Framework.Graphics.SpriteBatch.DrawString
行需要一个对象引用。什么好主意吗?下面是我的代码:
public void Effects(Player player)
{
string compassString = "";
int playerY = (int) (((player.position.X + player.width) * 2f) / 16f);
if (playerY > 0)
{
compassString = "Distance: " + playerY + " feet left";
if (playerY == 1)
{
compassString = "Distance: " + playerY + " foot left";
}
}
else if (playerY < 0)
{
playerY *= -1;
compassString = "Distance: " + playerY + " feet right";
if (playerY == 1)
{
compassString = "Distance: " + playerY + " foot right";
}
}
else
{
compassString = "Distance: Level";
}
Color black;
black.R = (byte)((0xff + black.R) / 2);
black.G = (byte)((0xff + black.R) / 2);
black.B = (byte)((0xff + black.R) / 2);
Microsoft.Xna.Framework.Graphics.SpriteBatch.DrawString(Main.fontMouseText, compassString, new Vector2((float) (0x16), (float) ((0x4a + (0x16)) + 0x30)), black, 0f, new Vector2(), (float) 1f, SpriteEffects.None, 0f);
}
如果你想在XNA中将坐标显示为字符串,你必须:
- 在应用程序中定义一个新的
SpriteFont
。 - 在你的
Game.Draw()
方法(而不仅仅是在你的代码的某个地方!)使用默认的spriteBatch
实例来绘制坐标使用刚刚定义的SprinteFont
。
以下是MSDN网页上关于这些步骤的一个很好的教程。
这是上面链接页面的引用:
protected override void Draw(GameTime gameTime) // <- do it here, not somewhere else!
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(); // <-- before you start to draw
spriteBatch.DrawString(Font1, output, FontPos, Color.LightGreen,
0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
spriteBatch.End(); // <-- after you draw
base.Draw(gameTime);
}
你得到这个错误,因为SpriteBatch不是一个静态类。它必须像int i = 0一样被实例化;你不能做整数。I = 0;
进入game1.cs。找到"SpriteBatch SpriteBatch"声明。要么将此变量设置为公共静态,要么创建另一个全局类(或单例类),该类具有对该变量的公共引用。in game1.cs in Draw方法你调用
spriteBatch.Begin();
yourClass.Draw();
spriteBatch.End();
然后在YourClass.Draw()中放:
<yourGlobalClass>.SpriteBatch.DrawString(..);
所以在game1.cs中分配spitebatch之后,你可以添加一行:
<yourGlobalClass>.SpriteBatch = spritebatch;