Как можно ссылаться на переменные класса game1 в XNA - PullRequest
0 голосов
/ 28 марта 2012

Я пытаюсь ссылаться на массив в классе Game1, создавая объект класса Game1 с его определением Game1 gameObject;, его объявлением gameObject = new Game1(); в конструкторе и его использованием gameObject.tileArray[xInt, yInt].treed = true;.

Сам класс game1 остается неизменным в своем коде класса, кроме некоторых методов и переменных. Когда я пытаюсь использовать этот код в классе TreeRegion, он дает мне «Ссылка на объект не установлена ​​на экземпляр объекта», что наводит меня на мысль, что класс game1 каким-то образом является нулевым.

Как можно изменить класс или объект, чтобы ссылаться на переменные game1? Имейте в виду, я самоучка и все еще довольно плохо знаком с C #.

Класс, который относится к игре1: http://pastebin.com/0chEcKfq Сама игра1 http://pastebin.com/zLDVzCca

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Когда я пытаюсь использовать этот код в классе TreeRegion, он дает мне «Ссылка на объект не установлена ​​на экземпляр объекта», что наводит меня на мысль, что класс game1 каким-то образом равен нулю.

Не обязательно. Посмотрите на ваше выражение:

gameObject.tileArray[xInt, yInt].treed = true;

Это выдаст NullReferenceException, если любой из этих истинных:

  • gameObject равно нулю (маловероятно, учитывая код, который вы показали)
  • gameObject.tileArray равно нулю
  • gameObject.tileArray[xInt, yInt] равно нулю

Вы не показали нам класс Game1 - вполне вероятно, что проблема заключается во второй или третьей пуле.

Вы, вероятно, должны подумать, действительно ли это должно быть частью Game1 API, а не копать уровень ниже так:

game1.MakeTree(xInt, yInt);

... или как там может быть лучшее имя. Похоже, вам здесь не хватает инкапсуляции.

(Лично я бы не советовал изучать C # с помощью чего-то вроде XNA. Я думаю, что пока вы еще находитесь на этапе изучения языка и основных библиотек, лучше работать в простой среде, такой как консольные приложения. Я понимаю, что они могут показаться скучными, но предварительная работа может сильно измениться в долгосрочной перспективе.)

РЕДАКТИРОВАТЬ: Теперь мы можем увидеть Game1 (что может быть с новым именем - и вы должны попытаться следовать .NET именования ) Я сильно подозреваю, что createTiles вызывает проблему , Совершенно не очевидно, что это на самом деле заполнит каждый элемент tileArray - тем более, что вы даже никогда не используете a или b. Я предполагаю, что gameObject.tileArray[xInt, yInt] возвращает null в вашем TreeRegion коде.

РЕДАКТИРОВАТЬ: Глядя на то, как вы создаете массив, это еще более важно:

gridWidth = 100; gridHeight = 100;
gridScope = gridWidth * gridHeight;
tileArray = new Tile[gridScope, gridScope];

Вы действительно хотели массив 10000x10000? Вы уверены, что вам нужно это gridScope? Я бы ожидал:

tileArray = new Tile[gridWidth, gridHeight];

Обратите внимание, что в createTiles вы заполняете только максимум gridHeight * gridWidth элементов (т. Е. Десять тысяч из десяти миллионов элементов в массив).

0 голосов
/ 28 марта 2012

В Visual Studio встроен замечательный отладчик.

Хотя я не могу сказать без кода Game1, я бы предположил, что массив, к которому вы обращаетесь, нулевой.должен быть создан в конструкторе GameObject

, поэтому

Game1()
{
    tileArray = new Tile[]();

}

Предполагается, что Tile - это класс в массиве.

...