Gra 2D, część 8: Dobrze mieć wybór... poziomu

25.08.2010 - Marcin Milewski
TrudnośćTrudność

Odświeżamy grafikę

Możemy teraz odświeżyć grafikę w naszej grze. Ponieważ mamy nową teksturę, to powinniśmy uaktualnić odpowiednie definicje sprite'ów. Zapiszmy jednak zmiany, które zaszły:

  • Odświeżony został murek, po którym porusza się postać.
  • Mamy zupełnie nową postać.
  • Odświeżona została czcionka - jest teraz dwukolorowa, inny kolor dla liter, inny dla cyfr
  • Animacja pocisku składa się teraz z czterech klatek
  • Animacja przeciwnika Mush składa się z czterech klatek
Nasz nowy bohater, odświeżone literki oraz cyfry.

Na początek, w pliku PlayerBulletEntity.h dodajemy linię

1
2
        m_right->Update(dt);
  

na początku metody PlayerBulletEntity::Update. Następnie aktualizujemy parametry sprite'ów w konstruktorze klasy SpriteConfig. Zmieniona wersja wygląda następująco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SpriteConfig::SpriteConfig() {
 Insert("player_right",
   SpriteConfigData(DL::Player, 4, 0.1, 0, 4 * 32, 32, 32, true));
 Insert("player_left",
   SpriteConfigData(DL::Player, 4, 0.1, 0, 5 * 32, 32, 32, true));
 Insert("player_stop",  
   SpriteConfigData(DL::Player, 8, 0.1, 0, 6 * 32, 32, 32, true));
 
 Insert("platform_left",  
   SpriteConfigData(DL::Foreground, 1, 1, 0, 1*32, 32, 32, true));
 Insert("platform_mid",   
   SpriteConfigData(DL::Foreground, 1, 1, 0, 2*32, 32, 32, true));
 Insert("platform_right", 
   SpriteConfigData(DL::Foreground, 1, 1, 0, 3*32, 32, 32, true));
 Insert("end_of_level",   
   SpriteConfigData(DL::Foreground, 1, 1, 32, 2*32, 32, 32, true));
 
 Insert("mush_right", 
   SpriteConfigData(DL::Entity, 4, 0.3,  0, 11 * 32, 32, 32, true));
 Insert("mush_left",  
   SpriteConfigData(DL::Entity, 4, 0.3,  0, 11 * 32, 32, 32, true));
 Insert("mush_stop",  
   SpriteConfigData(DL::Entity, 1, 0.3,  0, 12 * 32, 32, 32, true));
 
 Insert("player_bullet",  
   SpriteConfigData(DL::Entity, 4, 0.3,  5*32, 11*32, 32, 32, true));
 
 Insert("twinshot_upgrade", 
   SpriteConfigData(DL::Entity, 2, 0.3,  0*32, 13*32, 32, 32, true));
}
  

Na zakończenie odświeżamy kolory w menu głównym, aby lepiej zgrywały się z zielonym kolorem napisów. W metodzie MainMenu::Draw zamieniamy

1
2
3
4
5
6
7
8
9
10
11
12
13
    if (m_selection == Sel::NewGame) {
        Engine::Get().GetRenderer()->DrawQuad(
                  0.3, 0.59, 0.72, 0.66, 0, 0.7, 0.7, 1);
    }
    else if (m_selection == Sel::HallOfFame) {
        Engine::Get().GetRenderer()->DrawQuad(
                  0.2, 0.49, 0.82, 0.56, 0, 0.7, 0.7, 1);
    }
    else if (m_selection == Sel::Quit) {
        Engine::Get().GetRenderer()->DrawQuad(
                  0.325, 0.39, 0.695, 0.46, 0, 0.7, 0.7, 1);
    }
  

na

1
2
3
4
5
6
7
8
9
10
11
12
13
    if (m_selection == Sel::NewGame) {
        Engine::Get().GetRenderer()->DrawQuad(
                  0.3, 0.59, 0.72, 0.66,  .3, 0.8, 0.2, .5);
    }
    else if (m_selection == Sel::HallOfFame) {
        Engine::Get().GetRenderer()->DrawQuad(
                  0.2, 0.49, 0.82, 0.56,  .3, 0.8, 0.2, .5);
    }
    else if (m_selection == Sel::Quit) {
        Engine::Get().GetRenderer()->DrawQuad(
                  0.325, 0.39, 0.695, 0.46,  .3, 0.8, 0.2, .5);
    }
  

Tak oto zakończyliśmy implementowanie ekranu wyboru poziomu. Teraz poziomy w naszej grze nie następują liniowo jeden po drugim, lecz wyboru dokonuje gracz. Może rozgrywać poziomy w wybranej przez siebie kolejności.

Na poniższych animacjach możemy zobaczyć wizualne zmiany w naszej grze. Było warto :)

Animacja wersji początkowej gry.
Animacja wersji końcowej gry.

Masz pytanie, uwagę? Stworzyłeś poziom, którym chcesz się podzielić? A może zauważyłeś błąd? Powiedz o tym na forum.

Poniżej możesz pobrać kod końcowy dla tego artykułu.

Zobacz też

Zadania

  1. W naszej implementacji wszystkie węzły są zawsze dostępne, więc gracz może od razu rozegrać finałowy poziom. Prostym zadaniem niech będzie dodanie funkcjonalności, która pozwoli zagrać w pewne poziomy dopiero po przejściu innych. Pozostawiamy tutaj dużą dowolność w implementowanej metodzie.
  2. W bibliotece OpenGL isnieje mechanizm powtarzania tekstur. Aby z niego skorzystać należy m.in. do wywołania funkcji glTexCoord2d przekazać wartość większą od 1. Dlaczego nie skorzystaliśmy z tego mechanizmu? To pytanie jest właśnie treścią tego zadania.
    Słow kluczowe pomocne w znalezieniu odpowiedzi: glTexParameter, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T, GL_CLAMP, GL_REPEAT.
0
Twoja ocena: Brak

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com