如何在其他类中使用Screen Width?

时间:2012-09-22 21:31:43

标签: c# xna

这是我用来获取包含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的班级,我还需要使用有关screenWidthscreenHeight的信息。

当我尝试使用相同的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?我该怎么做才能解决问题?

3 个答案:

答案 0 :(得分: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);

然后,您可以在Ball.cs中单独执行viewport.Height

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

答案 1 :(得分:0)

我不是100%熟悉C#,但我认为你错过了顶部的导入声明。

尝试包含以下行:

using Microsoft.Xna.Framework.Graphics

...位于Ball.cs的顶部。

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

如果您检查GraphicsDevice的{​​{3}},则会看到它位于Microsoft.Xna.Framework.Graphics命名空间中。

答案 2 :(得分: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;
    }
}