如何修复“非静态字段、方法或属性需要对象引用”?

本文关键字:属性 对象引用 方法 何修复 静态 非静态字段 字段 | 更新日期: 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中将坐标显示为字符串,你必须:

  1. 在应用程序中定义一个新的SpriteFont
  2. 在你的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;
相关文章: