Почти идентичный код вызывает ошибки?

#c# #xna #xna-4.0

#c# #xna #xna-4.0

Вопрос:

Итак, у меня есть 2 строки очень похожего кода. Вот первая строка (в которой нет проблем):

 Player.Tex = Content.Load<Texture2D>(@"Texturesd");
 

И вот вторая строка (в которой есть исключение TypeInitializationException)

 HealthPickup.Tex = Content.Load<Texture2D>(@"TextureshealthPickup");
 

В классе Player и классе HealthPickup сразу после открытого класса есть строка с этим:

 public static Texture2D Tex;
 

Итак, почему мой класс HealthPickup вызывает эту ошибку? Я пропустил что-то очевидное? Я пробовал искать исключение, но ничего не помогает.

РЕДАКТИРОВАТЬ: как и было запрошено, мой класс HealthPickup выглядит следующим образом:

http://pastebin.com/RXZ2xh1e

Кроме того, мой класс Player:

http://pastebin.com/XKuVXPk3

Обратите внимание, что мой класс HealthPickup идентичен моему классу Player, за исключением 4 переменных (Tex, Dir, Pos и speed в Player и Tex, randX, randY, Pos в HealthPickup)

Комментарии:

1. Какое сообщение об исключении?

2. @48klocs ‘Инициализатор типа для ‘TestGame. HealthPickup «выдал исключение». Это все, что это мне дает.

3. Покажите код для вашего TestGame.HealthPickup класса — он явно генерирует исключение в конструкторе или инициализаторе поля.

4. @DavidHaney Хорошо, я отредактировал вопрос, чтобы удовлетворить ваш запрос.

5. Хорошо, я нашел проблему. Это была моя попытка случайного размещения карты. Я хотел, чтобы он каждый раз появлялся в случайном месте на карте, но, очевидно, это не сработало. Мне все же нужна помощь в том, как это сделать 🙂

Ответ №1:

Вы пытаетесь преобразовать объект типа Random в целое число. Это недопустимо. Вы можете получить случайное число из Random объекта, используя одну из Next перегрузок метода. Вот так :

 (new Random (Guid.NewGuid().GetHashCode())).Next()
 

использование Guid.NewGuid()... не обязательно, но гарантирует, что вы получите 2 Random объекта с разными начальными значениями

Комментарии:

1. Я думал, что генерация случайных чисел, а затем преобразование их в Int32 будут работать. Очевидно, что нет.

2. Random.Next метод возвращает случайное целое число, поэтому преобразование не требуется. Random конструктор инициализирует новый экземпляр Random класса, который не может быть преобразован в целое число. смотрите Random в MSDN

Ответ №2:

Оказывается, это были эти строки в моем классе HealthPickup:

 public static int randX = Convert.ToInt32(new Random(1));
public static int randY = Convert.ToInt32(new Random(1));
public static Point Pos = new Point(randX, randY);
 

По-видимому, Point() не любит случайные числа, поэтому я изменил его на это:

 public static Point Pos = new Point(50, 50);
 

Проблема решена

Комментарии:

1. На самом деле, преобразование нового Random класса в целое число было вашей проблемой. Convert.ToInt32(object) сбой, когда объект не является целым числом.

2. Вам нужно сделать Random r = new Random , а затем Point Pos = new Point(r. Next(0, 50)), randY. Next(0,50)); в настоящее время вы используете одно и то же начальное значение для обоих чисел и не создаете их правильно.