【问题标题】:How do I fix "An object reference is required for the non-static field, method, or property..."如何解决“非静态字段、方法或属性需要对象引用...”
【发布时间】:2011-11-27 22:09:37
【问题描述】:

我正在尝试编写一些代码,以文本形式显示我的播放器的 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);

}

【问题讨论】:

  • 您需要在 SpriteBatch 的实例上调用 DrawString。
  • 像这样?: spriteBatch = new Microsoft.Xna.Framework.Graphics.SpriteBatch(GraphicsDevice graphicsDevice);

标签: c# xna


【解决方案1】:

如果您想在 XNA 中将坐标显示为字符串,您必须:

  1. 在您的应用程序中定义一个新的SpriteFont
  2. 在您的 Game.Draw() 方法中(而不仅仅是代码中的某处!)使用默认的 spriteBatch 实例,使用刚刚定义的 SprinteFont 绘制坐标。

Here 是 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);
}

【讨论】:

  • 我已经修改了我的代码,它可以编译。但它拒绝绘制它们。我现在拥有的是this
  • 您阅读教程了吗?你做错了。我添加了如何执行此操作的扩展代码示例——但是,请阅读教程!
【解决方案2】:

您会收到该错误,因为 SpriteBatch 不是静态类。它必须像 int i = 0; 一样被实例化。你不能做 int.i = 0;

转到 game1.cs。找到“SpriteBatch spriteBatch”声明。要么将其设为公共静态,要么将另一个全局类(或单例)设为对该变量的公共引用。 在game1.cs中你调用的Draw方法

spriteBatch.Begin();
yourClass.Draw();
spriteBatch.End();

然后在 YourClass.Draw() 中放入:

<yourGlobalClass>.SpriteBatch.DrawString(..);

因此,在 game1.cs 中将恶习分配给后,您可以输入一行:

<yourGlobalClass>.SpriteBatch = spritebatch;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多