Gra 2D, część 14: Lepszy respawn i kilka szczegółów

01.10.2012 - Marcin Milewski
TrudnośćTrudność

Strzelaj roztropnie

Kolejną drobną zmianą będzie wprowadzanie opłat za wystrzelone pociski. Po modyfikacji gracz wciąż będzie mógł wystrzelić nieograniczoną liczbę pocisków, jednak tym razem każdy będzie go kosztował kilka ciężko zdobytych punktów.

Moglibyśmy odejmować punkty za wystrzelone pociski od tych już zdobytych, jednak lepszym podejściem wydaje się być zrobienie osobnego licznika. Dzięki takiemu rozwiązaniu, będziemy mogli dodać w przyszłości np. ekran podsumowujący rozgrywkę.
Zmiany zaczynamy od dodania do klasy Player zmiennej m_bullet_pay będącej wspomnianym licznikiem:

1
2
// Plik: Player.h
            int m_bullet_pay;         // opłata za wystrzelenie pocisków

Warto pamiętać, aby nadać polom klasy początkową wartość. W przeciwnym razie należy spodziewać się nieoczekiwanego działania programu, co zwykle jest niepożądane oraz trudne do zdiagnozowania (gdyż program po każdym uruchomieniu zachowuje się inaczej).
Na listę inicjalizacyjną klasy Player dopisujemy pole m_bullet_pay z wartością początkową równą zero:

1
2
3
4
5
6
7
8
// Plik: Player.cpp
Player::Player(double x, double y, (...) )
    : // (...)
      m_level_width(level_width),
      m_total_scores(score),
      m_bullet_pay(0),                            // NOWE
      m_is_immortal(false),
      m_lifes(lifes),  

Następnie dodajemy metodę PayForBullet, która będzie aktualizowała licznik wraz z każdym wystrzelonym pociskiem:

1
2
3
4
5
// Plik: Player.h
private:
    void PayForBullet() {
        m_bullet_pay += 15;   // Liczbę 15 można zmienić wedle uznania
    }  

Tę metodę wywołujemy w momencie wystrzelenia pocisku, czyli w FireBullet. Powinniśmy pamiętać, że gracz po wzięciu odpowiedniego bonusu może wystrzelić nawet dwa pociski jednocześnie. Od naszej woli zależy czy udzielimy mu zniżki na drugi pocisk, czy każemy zapłacić 100%. Obsługę naliczania kosztów zapisujemy na początku metody FireBullet klasy Player:

1
2
3
4
5
6
7
8
9
10
11
// Plik: Player.cpp
void Player::FireBullet() {
    // nalicz opłatę za wystrzelenie pocisków
    PayForBullet();
    if (IsTwinShotEnabled()) {
        // Tutaj moglibyśmy dać rabat na drugi pocisk. Można dodać domyślny
        // argument do metody PayForBullet odpowiadający za wielkość rabatu.
        // Na razie przyjmijmy niech gracz płaci pełną kwotę.
        PayForBullet();
    }
    // (...)  

Na koniec aktulizujemy sposób wyliczania punktów gracza. Dodajemy do niego składnik odpowiedzialny za koszt wystrzelenia pocisków:

1
2
3
4
5
// Plik: Player.h
 // przed
    int  GetScores() const     { return m_total_scores; }
 // po
    int  GetScores() const     { return m_total_scores - m_bullet_pay; } 

Implementacja opłaty za wystrzelone pociski nie zajęła dużo czasu. Dzięki niej gracz zastanowi się dwa razy zanim naciśnie spust, przez co rozgrywka stanie się jeszcze ciekawsza.

0
Twoja ocena: Brak

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com