我一直在尝试从他们的官方文档中学习MonoGame。
然而,我遇到了麻烦。
在他们的代码中,他们已经完成了以下操作......
Vector2 playerPosition = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X,
GraphicsDevice.Viewport.TitleSafeArea.Y + GraphicsDevice.Viewport.Height / 2);
现在,我遇到的问题是这个。每当我使用代码GraphicsDevice.Viewport
时,MonoGame都不允许它并给出以下错误:
非静态字段,方法或属性'GraphicsDevice.Viewport'
需要对象引用
我该怎么做才能解决此错误?
答案 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);
}
}
我希望有所帮助。