无法使用GraphicsDevice的方法

时间:2016-12-02 08:51:54

标签: c# xna monogame

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

然而,我遇到了麻烦。

在他们的代码中,他们已经完成了以下操作......

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

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

  

非静态字段,方法或属性'GraphicsDevice.Viewport'

需要对象引用

我该怎么做才能解决此错误?

1 个答案:

答案 0 :(得分:1)

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

如果我们查看Viewport property of GraphicsDevice,我们可以看到它是GraphicsDevice类的非静态属性

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

这个难题的另一个方面是,还有一个GraphicsDevice property on the Game class

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

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

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

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

这样做的原因是因为它在此上下文中使用了基类GraphicsDevice类的Game属性。

另一方面,如果您将相同的代码放在没有GraphicsDevice属性的类中,您将在问题中收到错误。

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注入自定义类的构造函数中,然后使用它。

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

我希望有所帮助。