无法使用 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);
}
}
希望对您有所帮助。
我一直在尝试从他们的官方文档中学习 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);
}
}
希望对您有所帮助。