无法使用 GraphicsDevice 的方法

Unable to use the methods of GraphicsDevice

我一直在尝试从他们的官方文档中学习 MonoGame。

然而,我遇到了一个障碍。

在他们的代码中,他们做了以下事情...

Vector2 playerPosition = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X,
GraphicsDevice.Viewport.TitleSafeArea.Y + GraphicsDevice.Viewport.Height / 2);

现在,我遇到的问题是这个。每当我使用代码 GraphicsDevice.Viewport 时,MonoGame 不允许它并给出以下错误:

An object reference is required for the non-static field, method or property 'GraphicsDevice.Viewport'

我该如何解决这个错误?

这并不是真正的 MonoGame 问题。这与 C# 解析属性和类型的方式有关。

如果我们看一下 Viewport property of GraphicsDevice,我们可以看到它是 GraphicsDevice [=] 的 非静态 属性 class.

public class GraphicsDevice
{
    public Viewport Viewport { get; set; }
}

这个谜题的另一部分是还有一个 GraphicsDevice property on the Game class

public class Game
{
    public GraphicsDevice GraphicsDevice { get; }
}

这意味着当您在 Game class 的上下文中使用行 GraphicsDevice.Viewport 时,它与在 class 的上下文之外使用它具有不同的含义Game class.

例如,如果您将代码放在派生自 Game 的 class 的 Update 方法中,它将起作用。

public class Game1 : Game
{
    public void Update(GameTime gameTime)
    {
        Vector2 playerPosition = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y + GraphicsDevice.Viewport.Height / 2);
    }
}

之所以可行,是因为它在此上下文中使用了基数 Game class 中的 GraphicsDevice 属性。

另一方面,如果您将相同的代码放在没有 GraphicsDevice 属性 的 class 中,您的问题就会出现错误。

public class MyClass
{
    public void Update(GameTime gameTime)
    {
        Vector2 playerPosition = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y + GraphicsDevice.Viewport.Height / 2);
    }
}

我怀疑原因与此类似,但根据您问题中的有限信息很难判断。

有多种方法可以解决这个问题。一种方法是将 GraphicsDevice 注入到自定义 class 的构造函数中并改用它。

public class MyClass
{
    private GraphicsDevice _graphicsDevice;

    public MyClass(GraphicsDevice graphicsDevice)
    {
        _graphicsDevice = graphicsDevice;
    }

    public void Update(GameTime gameTime)
    {
        Vector2 playerPosition = new Vector2(_graphicsDevice.Viewport.TitleSafeArea.X, _graphicsDevice.Viewport.TitleSafeArea.Y + _graphicsDevice.Viewport.Height / 2);
    }
}

希望对您有所帮助。