Primul proiect. Desenare 2D și preluare input 29/12/2009
Era timpul să începem și cu un mic proiect. Propun să intrăm deja în temă și să creăm un mic proiect 2d în care controlăm un avion cu ajutorul tastaturii.
Pentru partea de grafică vom folosi unul din avioanele librăriei lui Ari Feldman. www.flyingyogi.com/fun/spritelib.html. Din moment ce partea care ne interesează pe noi momentan este programarea, pentru grafică vom folosi ceea ce putem găsi la îndemână și SpriteLib este o librărie grozavă.
Porniți Visual C# 2008 și creați un proiect nou de tip XNA Game Studio 3.1 și ca template alegeți Windows Game (3.1). Alegeți un nume pentru proiect și dați OK.
Odată creat proiectul, în Solution Explorer o să aveți listată structura proiectului (Proprietăți, Referințe și Conținut; vezi imaginea 2). Texturile, fonturile, Modelele 3d și celelalte asset-uri se adaugă în zona de Content, deoarece sunt prelucrate de Content Processor. E greu să folosești traduceri pentru unele denumiri, așa că mă voi limita la denumirea lor în engleză.
În general când scrii un framework sau engine pentru un joc, va trebui sa te ocupi și cu prelucrarea conținutului. Cu asta se ocupă Content Pipeline, în care tot conținutul este încărcat și procesat în funcție de necesități. Pentru asta, Content Pipeline are nevoie de Content Importers și Content Writers, dar cred că deja ne întrecem în detalii.
Ideea de bază este că tot conținutul pe care aveți de gând să îl folosiți (Texturi, Modele, etc) va trebui să fie încărcat în zona de Content. Pentru a adăuga imaginea avionului pe care o vom folosi în acest articol am creat un director "Texturi" ca și copil al zonei Content (click Dreapta pe Content, apoi Add > New Folder).
Vom adăuga acum avionul nostru la proiectul curent. Click dreapta pe directorul Texturi și alegeți Add > Existing Item. Selectați fișierul avion.tga de unde l-ați descărcat. Acest fișier va fi adăugat la proiect și în plus, VA FI COPIAT și în directorul Texturi al proiectului. (puteți descărca avion.tga de aici)
Dacă veți face click pe avion.tga, veți observa că s-au întamplat 2 lucruri importante.
- Assetul a fost adăugat la proiect și i s-a dat deja un nume, avion.
- Assetului i-a fost atribuit un Content Importer și un Content Processor, ceea ce indică faptul că assetul va fi importat și procesat ca și textură pentru frameworkul XNA. Este important deoarece asta ne spune că assetul va fi tratat la fel și pe Windows și pe XBOX și pe Zune și ca astfel poate fi procesat de XNA.
Dacă extindem Content Processor o să vedem 2 valori, Color Key Color folosită ca și valoare pentru culoarea transparentă și Color Key Enabled care ne spune dacă acea culoare e folosită pentru transparență sau nu. În cazul nostru Color Key e pornit și culoarea transparentă e exact cea setată în avion.tga, magenta (R: 255, G:0, B:255).
Ok, avem assetul încărcat, să trecem la adăugarea codului. Sper ca viitorul articol să fie despre elementele generale ale unui joc și elementele de bază ale frameworkului XNA. Până atunci însă va trebui să mă credeți pe cuvânt și să faceți cum zic eu.
Fișierul Game1.cs ar trebui să fie deja deschis, dacă nu, deschideți-l acum. În zona de declarare a variabilelor clasei Game1 adăugați următoarele variabile.
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//variabilele noastre
/// <summary>
/// pozitia avionului nostru
/// </summary>
Vector2 pozitie = new Vector2(100f, 100f);
/// <summary>
/// aici stocam textura avionului
/// </summary>
Texture2D texturaAvion = null;
/// <summary>
/// starea tastaturii, preluam tastele apasate
/// </summary>
KeyboardState stareTastatura;
/// <summary>
/// viteza navei
/// </summary>
float viteza = 80f;
Am adăugat o variabilă în care stocăm poziția avionului (un Vector2), textura avionului, starea tastaturii (să putem prelua ce taste sunt apăsate) și viteza de deplasare a avionului. Ca și exercițiu pentru acasă încercați să adăugați și accelerație acestei deplasări.
Primul lucra pe care trebuie să îl facem va fi să încărcăm textura în managerul de conținut al jocului.
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
texturaAvion = Content.Load<Texture2D>("Texturi\\avion");
Calea specificată e spre cea din Solution Explorer. Numele folosit e cel de la câmpul Asset Name (vezi imaginea 3) și nu cel al fișierului (adica avion.tga)
Odată încărcate asseturile necesare, jocul va intra în loopul specific, în care va prelua tastele apăsate, va executa logica jocului și apoi va desena totul pe ecran. Pe scurt, va apela metodele Update și Draw până când vom ieși din joc.
O să avem nevoie să mișcăm avionul la apăsarea unor taste (noi vom folosi săgețile) așa că urmează să adăugăm codul necesar în metoda Update.
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
float elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
stareTastatura = Keyboard.GetState();
if (stareTastatura.IsKeyDown(Keys.Left))
pozitie.X -= elapsedTime * viteza;
if (stareTastatura.IsKeyDown(Keys.Right))
pozitie.X += elapsedTime * viteza;
if (stareTastatura.IsKeyDown(Keys.Up))
pozitie.Y -= elapsedTime * viteza;
if (stareTastatura.IsKeyDown(Keys.Down))
pozitie.Y += elapsedTime * viteza;
base.Update(gameTime);
}
În funcție de săgeata apăsată, deplasăm avionul la stânga (scădem/creștem valoarea X a poziției) sau deplasăm avionul sus-jos (scădem/creștem valoarea Y a poziției). Variabila elapsedTime va garanta deplasarea consistentă pe orice tip de calculator, fie că are o placă video mai bună sau mai rea. Mai multe despre asta într-un articol viitor.
Va trebui să desenăm și avionul, în funcție de poziția sa și folosind textura noastră, iar asta se întâmplă în metoda Draw.
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
// TODO: Add your drawing code here
spriteBatch.Begin();
spriteBatch.Draw(texturaAvion, pozitie, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
Rulați proiectul și asta e ce veți obține.
Penibil, știu, sper însă ca pe viitor articolele să iasă mai bune. Și să nu uităm că în viitoarele articole vom construi de fapt pe acest articol, adăugând clase separate pentru avioane, scrolling backgrounds, gloanțe, coliziuni, sunet, etc.
Nu uitați să downloadați codul sursă de mai jos.
Toate cele bune...
- Fişiere:
Tutorial1_01.zip




Adaugă comentariu