vineri, 18 mai 2012

Tutorialul 3: Inamici și Coliziuni

    Astăzi voi lămuri cum să adăugați încă un lucru pe ecran și cum să detectăm dacă există între aceste 2 lucruri coliziune. Pentru tutorialul de azi veți avea nevoie de această imagine. Puteți adăuga altă imagine dacă doriți, eu voi lămuri după această imagine. Vom folosi Proiectul precedent pentru acest tutorial.
Inamic

     După ce ați scos acea imagine sau ați ales alta, faceți același lucru ca și în tutorialul precedent. La Content click drept/Add/Existing Item și gata imaginea e aruncată în proiectul nostru.






    Acum adăugăm următoarele rînduri de cod:

1. În clasa Game1.cs scrim din nou:
      Texture2D enemyTexture;
       Vector2 enemyPosition;

2. În metoda LoadContent() scrim:
       enemyTexture = Content.Load<Texture2D>("Enemy1Animation_faza2");
       enemyPosition = new Vector2(200, 200);

După cum ați observat noi adăugăm inamicul nostru la fel cum am adăugat și pe eroul nostru din tutorialul precedent. Acum noi îl vom desena., pentru aceasta facem la fel ca și în tutorialul precedent.
Ne ducem la metoda Draw() și adăugăm următorul cod mai sus decât spriteBatch.Draw(textura, pozitie, Color.White):

       spriteBatch.Draw(enemyTexture, enemyPosition, Color.White);

Acum apăsăm F5 și vedem ce s-a primit.

Observăm că inamicul nostru s-a desenat și că se află în spatele jucătorului nostru. Voi deja vă întrebați de ce așa să primit. Pentru ca să înțelegeți mai bine, făceți următorul lucru:

spriteBatch.Draw(enemyTexture, enemyPosition, Color.White);
Acest cod mutați să fie după  spriteBatch.Draw(textura, pozitie, Color.White); și apăsați F5.


Observăm deja că inamicul nostru se află deasupra eroului nostru. Asta înseamnă că atunci când vă apucați să desenați trebuie să gândiți în felul următor, că ceea ce se apelează mai sus se află în urmă la ceea ce se apelează în jos.

    Ok, noi putem mișca eroul nostru și putem trece prin inamic, dar asta e tot, mai mult nimic nu se întîmplă și ce fel de joc este ăsta, dacă nu se întîmplă nimic dacă trece prin inamic. Haideți să facem să fie puțin mai înteresant. Vom face ca ecranul nostru albastru să-și schimbe culoarea dacă eroul nostru se va atinge de inamic. Pentru aceasta vom face următoarele lucruri:

 - Vom crea o variabilă globală de tip bool:
               bool isCollision;
    După aceea în metoda Initialize() vom scrie ca variabila noastră să fie falsă.
               isCollision = false;
 - Acum noi vom trebui să creăm 2 dreptunghiuri folosind clasa Rectangle, care vor folosi pozițiile eroului și inamicului nostru și vom verifica dacă ele se interesectează. Și dacă ele se vor intersecta noi vom da variabile noastre boolene true și ecranul se va colora în culoarea roșie, iar atunci când dreptunghiurile nu se vor intersecta, ecranul nostru va fi de culoare albastru deschis.
Pentru a face toate astea noi ne vom duce mai întâi la metoda Update() și vom scrie următoarele rânduri de cod:

            Rectangle playerRect = new Rectangle((int)pozitie.X,
                                                                            (int)pozitie.Y,
                                                                            textura.Width,
                                                                            textura.Height);

            Rectangle enemyRect = new Rectangle((int)enemyPosition.X,

                                                                            (int)enemyPosition.Y,
                                                                            enemyTexture.Width, 
                                                                            enemyTexture.Height);

            if (playerRect.Intersects(enemyRect))
            {
                isCollision = true;
            }
            else
            {
                isCollision = false;
            } 
       

Și ne ducem acum la metoda Draw(), găsim:

GraphicsDevice.Clear(Color.CornflowerBlue);

Și modificăm cum asta:

            if (!isCollision)
                GraphicsDevice.Clear(Color.CornflowerBlue);
            else
                GraphicsDevice.Clear(Color.Red);

Acum apăsăm F5 și vedem ce se va întîmpla.

     Observăm că atunci când ajungem să ne atingem de inamic, ecranul nostru se schimbă în culoarea roșie.

Tutorialul a luat sfârșit. Pentru a înțelege mai bine ce-i cu clasa Rectangle și cu   GraphicsDevice.Clear(), vă recomand următoarele link-uri:
 
Clasa Rectangle
GraphicsDevice.Clear()

Link-ul la proiectul modificat cu tutorialul acesta se află în acest link