Открытая переменная не доступна в моих классах - PullRequest
0 голосов
/ 10 октября 2010

Я использую платформу 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 сделает ее доступной где угодно?

Помощь приветствуется, спасибо.

Ответы [ 4 ]

2 голосов
/ 10 октября 2010

Я всегда думал, что установка переменной в public сделает ее доступной где-нибудь?

public делает поле доступным из других классов, но вам все еще нужна ссылка на экземпляр. Где-то в классе Paddle должна существовать ссылка на Breakout, поскольку она вам нужна. Например, имея поле типа Breakout, называемое «прорыв», которое вы назначаете при создании экземпляра Paddle. Затем с 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 в intiailizer, поскольку я не уверен, как создается экземпляр вашего игрового класса.

2 голосов
/ 10 октября 2010

Я не знаком с XNA (хотя я собирался разобраться с ним), но, похоже, вы пытаетесь ссылаться на членов одного класса из другого класса. Чтобы сделать это, вы должны обратиться к первому классу. Вы сказали, что screenHeight и screenWidth объявлены в основном игровом классе, но затем вы сказали, что пытаетесь получить к ним доступ в классе Paddle. Но если вы используете «это», вы можете получить доступ только к членам 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;
  }
}
0 голосов
/ 13 октября 2010

сделать его общедоступным

тааак ...

public static int screenWidth;

, а затем просто напишите paddle.maxY = Breakout.screenWidth;

0 голосов
/ 10 октября 2010

Вам необходимо создать экземпляр класса Breakout.

Breakout breakout = new Breakout();

Затем вы можете получить доступ к открытым полям этого объекта.

int height = breakout.screenHeight;
...