НОУ ІНТУІТ, Лекція, 2D-графіка в XNA Game Studio 2

Тепер завантажимо зображення у проект і продовжимо роботу. Як ви пам'ятаєте, ми створили шаблон ігрового компонента, який підходить для виведення на екран. Тепер доопрацюємо цей шаблон. У лістингу 6.8. ви можете бачити доопрацьований код ігрового компоненту

Розглянемо зміни, внесені до компонента .

Ми додали три змінні – sprTexture, sprRectangle, sprPosition – для зберігання текстури, прямокутника, що показує координати спрайту в текстурі, та позиції виведення спрайту на екран.

Далі, ми модифікували конструктор класу, додавши до списку параметрів, що передаються наступні змінні:

ref Texture2D NewTexture – передача текстури. Параметр передається за посиланням, тобто об'єкт отримує копію текстури, а лише посилання її – це економить системні ресурси.

Rectangle newRectangle – прямокутник , що задає координати спрайту у зображенні.

Vector2 newPosition – позиція спрайту на ігровому екрані.

У тілі конструктора ми ініціалізуємо відповідні властивості класу переданими параметрами.

Далі, ми доопрацьовуємо код методу Draw. Тут ми маємо найбільш складну частину модифікації. Справа в тому, у грі, для якої ми створюємо компонент , вже є всі засоби для виведення зображень. Тому найрозумніше скористатися вже існуючим об'єктом типу SpriteBatch для того, щоб за його допомогою вивести зображення на екран. Для того, щоб зробити створений SpriteBatch одного разу доступним для всіх компонентів гри, існує спеціальна методика. Є таке поняття, як ігрові послуги, які доступні всім компонентам. Спочатку ми додамо створений у класі Game1 об'єкт типу SpriteBatch до списку ігрових сервісів (ми розглянемо нижче), після чого зможемовийняти цей об'єкт у ігровому компоненті. Ми так і робимо – наступна команда створює новий об'єкт sprBatch, який містить посилання на вихідний об'єкт типу SpriteBatch, який раніше, у класі Game1, доданий до списку ігрових ресурсів.

SpriteBatch sprBatch = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch))

sprBatch.Draw(sprTexture, sprPosition, sprRectangle, Color.White) ;

Вище ми виводили спрайт на екран, спочатку викликавши метод Begin() об'єкта типу SpriteBatch , потім викликали метод Draw() , потім метод End() , завершальний висновок . Тут ми не викликаємо цих методів. Справа в тому, що дані методи будуть викликані в методі Draw (), який викликає основна гра (об'єкт типу Game1). До коду класу Game1 внесено деякі зміни, які ми зараз розглянемо. У лістингу 6.9. Ви можете бачити цей код.

Для початку ми додали нові змінні, одна з яких (типу spriteComp) служить для зберігання об'єкта класу spriteComp, а друга (типу Texture2D) служить для зберігання текстури. Так як текстура містить кілька спрайтів, змінна Texture2D може знадобитися при створенні декількох об'єктів, тому є сенс створити цю змінну, один раз завантажити в неї зображення і користуватися нею.

У методі LoadContent() ми, як завжди, створюємо об'єкт типу SpriteBatch і за допомогою команди Services.AddService(typeof(SpriteBatch),spriteBatch) ; додаємо об'єкт SpriteBatch до списку ігрових сервісів. Саме після цієї команди spriteBatch можна викликати в ігрових компонентах та виводити їх зображення.

Далі у цьому методі ми завантажуємо текстуру із зображеннями у змінну texture і викликаємо метод CreateNewObject();. Цей метод ми створили самостійно – ми використовуємо його для створення об'єкту gameObject.

gameObject = новий spriteComp (це, ref texture, новий Rectangle (18,9,17,88), новий Vector2 (100,150)) ;

При створенні цього об'єкта ми передаємо конструктору класу spriteComp об'єкт гри (this) , посилання на текстуру, об'єкт Rectangle – зверніть увагу, що ми створюємо новий об'єкт Rectangle , який ініціалізований значеннями координати потрібного нам спрайту у файлі текстури, обчисленими раніше. Також ми передаємо конструктору новий об'єкт типу Vector2, який містить координати спрайту для виведення на ігровий екран.

У методі CreateNewObject() ми розмістили ще одну команду - Components.Add(gameObject);. З її допомогою ми додаємо до списку компонентів гри щойно створений об'єкт. Це дуже важлива команда завдяки їй при виконанні команди base.Draw(gameTime); буде опрацьовано метод Draw нашого ігрового компонента, і зображення, які він виведе, будуть виведені на екран.

У методі Draw() класу Game1 ми використовуємо такий код: