2

这是我用来获取包含以下变量的代码screenHeight

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Ball pall;
    MinuPad playerPad;
    public int screenWidth;
    public int screenHeight;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

    }

    protected override void Initialize()
    {
        screenWidth = GraphicsDevice.Viewport.Width;
        screenHeight = GraphicsDevice.Viewport.Height;

但是我不能在不同的类中使用该变量。例如,我有一个名为的类Ball.cs,我还需要使用关于screenWidth和的信息screenHeight

当我尝试使用GraphicsDevice.Viewport.Width它时,它给了我:

An object reference is required for the non-static field, method, or property 
'Microsoft.Xna.Framework.Graphics.GraphicsDevice.Viewport.get'

我的问题:为什么我不能GraphicsDevice.Viewport在其他课程中使用?我应该怎么做才能解决问题?

4

3 回答 3

3

您无法访问它的原因是因为 Ball 类的实例根本不知道 Viewport。您可以通过一些选项来解决此问题,主要是将 传递Viewport给您的球的构造函数,例如:

public class Ball
{

    Viewport viewport;

    // ... 

    public Ball(int stuff, Viewport viewport)
    {
         this.viewport = viewport;

         // ...
    }
}

在类中创建球的实例,其Game1内容如下:

Ball ball = new Ball(42, GraphicsDevice.Viewport);

然后,您可以简单地viewport.Height在 Ball.cs 中进行操作。

如果您想要更全局的东西以便您可以在任何地方使用高度/宽度,那么您可以在 Game1 ( public static Viewport) 中创建一个静态视口并ViewportInitialise()/LoadContent()方法中进行设置;您可以使用Game1.Viewport. 就我个人而言,我不喜欢这种方式,因为它看起来像“hacker-ish”,但它可以完成工作..虽然这么说,我通常在我的游戏类中有一个静态随机类:)!

于 2012-09-22T23:26:12.010 回答
0

我对 XNA 不熟悉,但我的猜测是它GraphicsDevice是基类的成员Microsoft.Xna.Framework.Game。您将无法从非派生的类访问它Game

同样,不熟悉 XNA,但如果您的Ball类可以访问您的类的实例Game1,那么它应该能够访问该screenWidth字段:

public class Ball
{
    Game1 _game;
    public Ball(Game1 game){_game = game;}
    private void UseScreenWidth(){
        // Do something with _game.screenWidth;
    }
}
于 2012-09-22T23:16:39.767 回答
0

我不是 100% 熟悉 C#,但我认为您在顶部缺少导入语句。

尝试包括以下行:

using Microsoft.Xna.Framework.Graphics

...在顶部Ball.cs

我猜如果您检查主文件,您会在文件顶部看到该行(和类似行)。

如果您查看 的文档GraphicsDevice您会看到它位于Microsoft.Xna.Framework.Graphics命名空间中。

于 2012-09-22T22:32:26.843 回答