2010-10-08 3 views
5

Обычно я обращаюсь за помощью к форумам XNA, но они сейчас не работают, поэтому я пришел сюда.Класс игрока с моей игрой C# XNA

Я делаю новую игру XNA, и я хочу иметь класс игрока. На данный момент у меня есть основной класс игры под названием Dots. Это основная игра. Это как мой Player класс выложен на данный момент:

namespace Dots 
{ 
    class Player : Microsoft.Xna.Framework.Game 
    { 
     Texture2D PlayerTexture; 
     Vector2 PlayerPosition; 

     public Player() 
     { 
      Content.RootDirectory = "Content"; 
      PlayerTexture = Content.Load<Texture2D>("Player"); 
      PlayerPosition = Vector2.Zero; 
     } 

     public void Update() 
     { 

     } 

     public void Draw(SpriteBatch SpriteBatch) 
     { 

     } 
    } 
} 

Но я получаю сообщение об ошибке, которую я не могу работать, как решить. Ошибка:

Ошибка при загрузке «Player». GraphicsDevice Компонент не найден.

Это метание по этой линии: PlayerTexture = Content.Load<Texture2D>("Player");.

Я вижу, что в главном классе игры есть эта строка: Graphics = new GraphicsDeviceManager(this);, но я понятия не имею, что с этим делать. Передаю ли я его классу Player, или что?

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

+0

Не знаком с XNA, но [этот пост] (http://social.msdn.microsoft.com/forums/en-US/xnagamestudioexpress/thread/c2f6b8be-845d-4701-b383-7a0e3cde69f8) подразумевает, что вы должны " t загружать содержимое в конструктор. –

+0

Arg. Я не знаю, как правильно делать то, что я хочу делать. Мне нужно подождать, пока форумы XNA не будут открыты снова, и посмотрите, как они рекомендуют это делать. – Wen

+0

Почему бы не спросить здесь? Программисты XNA ... программисты ... это то, что для StackOverflow. – WernerCD

ответ

2

ОБНОВЛЕНИЕ: Этот ответ, по-видимому, правильный для более старых версий XNA. См. Andrew Russell's answer для того, что используется в настоящее время.

Попробуйте переопределить метод LoadGraphicsContent для загрузки вашего контента. Как показано в this tutorial.

protected override void LoadGraphicsContent(bool loadAllContent) 
    { 
     if (loadAllContent) 
     { 
      spriteBatch = new SpriteBatch(graphics.GraphicsDevice); 
      // TODO: Load any ResourceManagementMode.Automatic content 
      t2dMap = content.Load<Texture2D>(@"content\textures\map_display"); 
      t2dColorKey = content.Load<Texture2D>(@"content\textures\map_colorkey"); 
     } 
     // TODO: Load any ResourceManagementMode.Manual content 
    } 
+0

'LoadGraphicsContent' устарел в течение очень долгого времени. –

+1

@ Андрю Рассел: Спасибо, Андрей. Я пытался помочь OP, хотя я не знаком с XNA. Я оставлю этот ответ здесь, если кто-то другой наткнется на него. Это, наряду с вашим комментарием и ответом на этот вопрос, должно помочь управлять людьми в правильном направлении в будущем. –

-2

Думаю, что у меня была аналогичная ошибка.

Щелкните правой кнопкой мыши Решение в Обозревателе решений.

Перейти к категории «Свойства».

Если игровой профиль «Привет Def», перейдите на «Reach».

Перекомпилировать и запустить.

+1

Этот ответ неверен. –

6

Прежде всего вам не хватает понимания того, как работают классы (и пространства имен). Я бы предложил (как я также сделал в комментарии к вашему другому вопросу) работу над простой игрой, которая сначала не требует занятий.

Теперь, чтобы говорить о проблемах в коде:

Прежде всего, для того, чтобы загрузить контент, графика нуждается устройство инициализированы. Он не инициализируется до тех пор, пока LoadContent не будет вызван в Microsoft.Xna.Framework.Game. Это explained in the documentation:

Этот метод вызывается Initialize. Кроме того, он вызывается в любое время, когда игровое содержимое необходимо перезагрузить, например, когда происходит событие DeviceReset. Вы не должны обращаться к GraphicsDevice до тех пор, пока не вызывается LoadContent.

Так переместить код загрузки:

protected override void LoadContent() 
{ 
    PlayerTexture = Content.Load<Texture2D>("Player"); 
    PlayerPosition = Vector2.Zero; 
    base.LoadContent(); 
} 

Обратите внимание, как он является переопределение (защищенного метода).Я действительно не хочу объяснять, что это значит здесь, но я предлагаю вам узнать.

Кроме того, вы обнаружите, что Draw и Update должны быть аналогичным образом переопределены, так как они будут вызываться из XNA.

Теперь, вот важный бит: Что я только что сказал вам относится, если вы унаследовать ваш игры класса из класса XNA Game. Называя это «Player», вы указываете на непонимание того, как работают классы.

Если вы делаете класс «Player», взгляните на то, что вам сказали в ответ на вопрос your other question.

Вы также можете найти this recent question.

1

Недавно в XNA вы можете щелкнуть правой кнопкой мыши по определенным параметрам и исправить это для Intellisense. Итак, щелкнув правой кнопкой мыши на Texture2D и Rectangle, когда вы объявляете, вы должны иметь возможность выбрать «Resolve», и он попросит вас выбрать «использование» какой-либо другой библиотеки, чтобы затем ее компилировать. Посмотрите, исправляет ли это вашу проблему. Но, как правило, с классами я использую это, и он работает хорошо.

0

Контрольный список того, что работал для меня:

  • Попробуйте поместить шрифт в корневой папке вашего проекта содержимого
  • Убедитесь, что Build Action установлен в Compile
  • Проверьте содержимое поля .spritefont file (используйте этот вопрос в качестве ссылки)
  • Убедитесь, что вы находитесь в LoadContent или более позднем этапе жизненного цикла
Смежные вопросы