KNOW INTUIT, Лекция, 2D графики в XNA Game Studio 2

Сега нека заредим изображението в проекта и да продължим работата си. Както си спомняте, по-горе създадохме шаблон за компонент на играта, който е подходящ за показване. Сега нека прецизираме този шаблон. Списък 6.8. можете да видите модифицирания код на компонента на играта

Помислете за промените, направени в компонента.

Добавихме три променливи - sprTexture, sprRectangle, sprPosition - за задържане на текстурата, правоъгълникът, показващ координатите на спрайта в текстурата, и позицията, на която спрайтът се показва на екрана.

След това модифицирахме конструктора на класа, като добавихме следните променливи към списъка с подадени параметри:

ref Texture2D newTexture - трансфер на текстура. Параметърът се предава по препратка, тоест обектът не получава копие на текстурата, а само препратка към нея - това спестява системни ресурси.

Rectangle newRectangle е правоъгълник, който указва координатите на спрайта в изображението.

Vector2 newPosition - позицията на спрайта на екрана на играта.

В тялото на конструктора инициализираме съответните свойства на класа с предадените параметри.

След това финализираме кода на метода Draw. Тук имаме най-трудната част от модификацията. Факт е, че играта, за която създаваме компонента, вече разполага с всички средства за показване на изображения. Следователно най-разумно е да използвате вече съществуващ обект от тип SpriteBatch, за да го използвате за показване на изображението на екрана. За да направите SpriteBatch, веднъж създаден, достъпен за всички компоненти на играта, има специална техника. Има такова нещо като услуги за игри, които са достъпни за всички компоненти. Първо ще добавим обекта SpriteBatch, създаден в класа Game1, към списъка с услуги за игри (ще разгледаме това по-долу), след което можемизвлечете този обект в компонента на играта. Правим точно това – следната команда създава нов обект 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 може да бъде извикан в компонентите на играта и да показва техните изображения.

След това в този метод зареждаме текстурата с изображения в текстурната променлива и извикваме метода CreateNewObject();. Създадохме този метод сами - използваме го, за да създадем gameObject.

gameObject = нов spriteComp (това, реф текстура, нов правоъгълник (18,9,17,88), нов Vector2 (100,150));

Когато създаваме този обект, ние предаваме обекта на играта (this) , препратка към текстурата, обект Rectangle към конструктора на класа spriteComp - имайте предвид, че създаваме нов обект Rectangle, който се инициализира с координатните стойности на спрайта, от който се нуждаем в текстурния файл, изчислен по-рано. Също така подаваме нов обект от тип Vector2 към конструктора, който съдържа координатите на спрайта за показване на екрана на играта.

В метода CreateNewObject() поставихме още една команда - Components.Add(gameObject) ;. С негова помощ добавяме новосъздадения обект към списъка с компоненти на играта. Това е много важна команда - благодарение на нея при изпълнение на командата base.Draw(gameTime); Методът Draw на нашия компонент на играта ще бъде обработен и изображенията, които рисува, ще бъдат показани на екрана.

В метода Draw() на класа Game1 използваме следния код: