2010-10-09 3 views
0

Я использую инфраструктуру 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 

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

Справка приветствуется, спасибо.

+0

Являются ли два класса в одном пространстве имен? – npinti

+0

Да, они оба находятся в пространстве имен Breakout. – Wen

+0

Это может быть глупый вопрос, но вы получаете доступ к 'screenWidth' через экземпляр основного игрового класса? –

ответ

2

Я не знаком с 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; 
    } 
} 
+1

Извините, я использую 'this.screenWidth' и' this.screenHeight' в своем основном игровом классе, и в моем классе paddle я пытаюсь получить к ним доступ просто с помощью 'screenWidth' и' screenHeight'. Я также попытался использовать 'Breakout.screenWidth' и' Breakout.screenHeight', но я получаю ту же ошибку. – Wen

+0

@Wen, 'this' не будет работать, потому что' this' относится к 'Paddle', а не' Breakout', так как этот код находится внутри 'Paddle'. Вы должны передать ему ссылку на «Breakout», как я объясню в своем ответе. –

+0

Нет, я использую 'this', когда устанавливаю значения в моем основном классе игры, где объявляются эти переменные. Когда я пытаюсь получить к ним доступ из другого класса, я не использую 'this'. – Wen

2

I always thought that setting a variable to public would make it accessible anywhere?

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

0

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

Breakout breakout = new Breakout(); 

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

int height = breakout.screenHeight; 
+0

Я подозреваю, что OP не хочет создавать новый экземпляр своей игры каждый раз, когда ему нужен «screenHeight» ... –

+0

А, это имеет смысл. Но мой класс paddle является экземпляром моего класса breakout, так что не так ли отправить экземпляр обратно? – Wen

+0

@ Вэнь, я немного не понимаю, что вы имеете в виду, когда говорите, что ваш класс Paddle является примером Breakout. –

0

сделать это публичный статический

тааак ...

общественный статический Int screenWidth;

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