【问题标题】:Public variable not accessible in my classes在我的课程中无法访问公共变量
【发布时间】:2011-04-23 07:17:45
【问题描述】:

我正在使用 XNA 框架来制作我的第一款游戏。在它的主要游戏类(Breakout.cs)中,我放了这个:

public int screenHeight;
public int screenWidth;

而在Initialize 方法中:

this.screenHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
this.screenWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;

但是当我尝试从我的Paddle 类访问它时,我得到了这个错误:

The name 'screenWidth' does not exist in the current context

我一直认为将变量设置为 public 可以让它在任何地方都可以访问?

非常感谢您的帮助,谢谢。

【问题讨论】:

  • 这两个类是否在同一个命名空间中?
  • 是的,它们都在 Breakout 命名空间中。
  • 这可能是个愚蠢的问题,但是您是否通过主游戏类的实例访问screenWidth

标签: c# oop xna public


【解决方案1】:

我一直认为将变量设置为 public 可以让它在任何地方都可以访问?

public 使该字段可以从其他类访问,但您仍然需要对实例的引用。在Paddle 类的某个地方应该存在对Breakout 的引用,因为您需要它。例如,通过在实例化Paddle 时分配一个名为“breakout”的类型为Breakout 的字段。然后,从Paddle,您可以致电breakout.screenHeight

另一种选择是让Breakout 成为单身人士(你还会有更多吗?)。声明一个静态字段并将您的 Breakout 实例存储在其中。然后公开一个Instance 属性:

private static Breakout instance = new Breakout();

public static Breakout Instance 
{
    get { return instance; }
}

然后来自Paddle

Breakout.Instance.screenHeight

不确定您是否希望 instance 在初始化程序中实例化 Breakout,因为我不确定您的游戏类当前是如何被实例化的。

【讨论】:

    【解决方案2】:

    我不熟悉 XNA(尽管我一直想研究它),但听起来您正试图从另一个类中引用一个类的成员。为此,您必须实际参考第一类。你说 screenHeight 和 screenWidth 是在主游戏类中声明的,但是你说你试图在 Paddle 类中访问它们。但是如果你使用“this”,你只能访问 Paddle 的成员,而不是“主游戏”类的成员,不管它叫什么。如果你想查看它的成员,你需要参考一些对主游戏类的引用(而不是“this”)。

    例子:

    错误:

    class MyGame
    {
      public int screenWidth;
      public int screenHeight;
      void MainLoop()
      {
         Paddle p = new Paddle();
      }
    }
    
    class Paddle
    {
      void Initialize()
      {
         int w = screenWidth;
         int h = screenHeight;
      }
    }
    

    更好:

    class MyGame
    {
      public int screenWidth;
      public int screenHeight;
      void MainLoop()
      {
         Paddle p = new Paddle(this);
      }
    }
    
    class Paddle
    {
      MyGame game;
    
      public Paddle(MyGame game)
      {
         this.game = game;
      }
    
      void Initialize()
      {
         int w = game.screenWidth;
         int h = game.screenHeight;
      }
    }
    

    【讨论】:

    • 抱歉,我在我的主游戏类中使用了this.screenWidththis.screenHeight,而在我的桨类中我试图通过使用screenWidthscreenHeight 来访问它们。我也尝试使用Breakout.screenWidthBreakout.screenHeight,但我得到了同样的错误。
    • @Wen, this 不起作用,因为this 指的是Paddle 而不是Breakout,因为此代码在Paddle 中。正如我在回答中解释的那样,您需要将引用传递给Breakout
    • 不,我只在声明这些变量的主游戏类中设置值时使用this。当我尝试从另一个类访问它们时,我没有使用this
    • 你不能简单地使用“screenWidth”...你需要引用主游戏类的一些实例。或者您需要将主游戏类的两个成员设置为“静态”,然后您可以在“.screenWidth”之前使用主游戏类名称来访问它。静态意味着您不需要按实例独立跟踪成员(所有实例只有一个版本的成员)。
    【解决方案3】:

    您需要创建一个 Breakout 类的实例。

    Breakout breakout = new Breakout();
    

    然后您可以访问该对象的公共字段。

    int height = breakout.screenHeight;
    

    【讨论】:

    • 我怀疑 OP 不想在每次需要 screenHeight 时都创建他的游戏的新实例...
    • 啊,有道理。但是我的 paddle 类是我的 breakout 类的一个实例,所以发回一个实例不是错误的吗?
    • @Wen,当你说你的 Paddle 类是 Breakout 的一个实例时,我有点不清楚你的意思。
    • 在我的Breakout 课程中,我这样做:paddle = new Paddle();。所以突破类正在创建Paddle 的实例。我希望我打算添加的每个类都可以访问这些变量,而无需传递它们。
    • @Wen,那么也许这些变量应该是静态的?
    【解决方案4】:

    将其设为公共静态

    呜呜呜……

    public static int screenWidth;

    然后只写 paddle.maxY = Breakout.screenWidth;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2023-03-29
      相关资源
      最近更新 更多