[POBIERZ] kod źródłowy i inne pliki potrzebne do uruchomienia gry  [POBIERZ] 

Zachęcam do komentowania :) Mile widziane sugestie i pytania, na które chętnie odpowiem

9 wrz 2010

Klasa bazowa wroga

Czas przebudować klasę wroga, pisałem o niej na początku bloga. Mam zamiar stworzyć bazową klasę wroga, z której będą dziedziczyły inne klasy. Zatem będzie można zmienić kilka wartości w klasach pochodnych aby pochodne "obiekty" różniły się poziomem wystrzymałości, strzelaniem, itp.

class Cwrog_easy
{
private:
int zycia;
public:
int pozwro_x, pozwro_y;
int pozpocwro_x, pozpocwro_y;
int czest_poc;
void poruszanie_wroga();
void strzelanie_wroga();
void odejm_zycia(int);
  Cwrog_easy::Cwrog_easy()
  {
    pozwro_x=rand()%550;
    pozwro_y=0;
    czest_poc=0;
    zycia=3;
  }
};

  void Cwrog_easy::poruszanie_wroga()
  {
    pozwro_y++;
    if( (pozwro_y>430) || (pozwro_y==0) || (zycia<=0) )
    {
    zycia=3;
    pozwro_x=rand()%740;
    pozwro_y=0;
    }
  }

  void Cwrog_easy::strzelanie_wroga()

  { 
    if ( (pozpocwro_y>460) || (pozpocwro_y==0) )
    {

       if (pozpocwro_y>460)
       {
          pozpocwro_y=800;
       }

       if (czest_poc>=200)
       {
          pozpocwro_x=pozwro_x+7;
          pozpocwro_y=pozwro_y+25;
       }
    }     

    if(czest_poc==200)
    {
      czest_poc=0;
    }

    pozpocwro_y=pozpocwro_y+3;
    czest_poc++;
  }


 void Cwrog_easy::odejm_zycia(int minus)
 {
    zycia=zycia-minus;
 }



 Dodałem:
-poziom żyć wroga
-poprawione strzelanie wroga tzn, jeżeli pocisk wystrzelony przez wroga trafi szybko w cel to następny tak szybko nie wyleci służy temu instrukcja i zmienne  
if (czest_poc>=200). 
- metoda odejm_zycia(int minus) będzie wywoływana w main() w momencie trafienia wroga pociskiem wystrzelonym z robocika. Wartość przesyłana do tej funkcji będzie zależała od rodzaju broni, którą trafiliśmy wroga.

np. dla karabinu maszynowego pocisk będzie tracił wrogowi 1 życie  
enemy.odejm_zycia(1); 

Narazie to jest kawałek kodu, który testuję, zmieniam i NAPEWNO jeszcze zmienię jak większość kodu, który trzeba przebudować. Zamieszczam go tutaj bo chcę się podzielić swoim pomysłem :P

2 komentarze:

  1. Widzę, że gierka się rozwija = Super ! :D Cieszę się, że masz spore postępy w produkcji, bo u mnie na razie wszystko ustało, tzn kończę gui... ale nie o tym :)

    Wrzucę tutaj parę swoich rad, mogą być nie do końca trafne, ale warte przemyślenia wg mnie.
    O większości pisałem już w ostatnim komentarzu (pod postem podanym w treści wpisu).

    START :P
    1.
    ---------------------------------------------------
    Po pierwsze if... ;) Co prawda jeden i już mówię, że miejscem do poprawienia powinno być :

    if ( (pozpocwro_y>460) || (pozpocwro_y==0) )
    {
    if (pozpocwro_y>460)
    {
    pozpocwro_y=800;
    }

    Na początku sprawdzasz czy pozpocwro_y>460 LUB pozpocwro_y ==0, jeśli robisz LUB, nie ma sensu pod głównym ifem jeszcze raz sprawdzać (pozpocwro_y>460)
    --------------------------------------------------


    2.
    --------------------------------------------------
    Zachęcałbym do stworzenia klasy bazowej baseWROG, a po niej utworzyć WROG_EASY : baseWROG, czemu ? :>
    - Bo niektóre metody w każdym wrogu będą się powtarzać, nieważne czy easy,hard,medium metoda OdejmijZycia(), pozycja_x, pozycja_y, Metoda StrzelanieWroga() którą dzięki słówku virual będziemy mogli modyfikować w klasach późniejszych -- naprawdę warto , poczytaj o tym :)

    - Mniejsza ilość kodu to tylko jedna z zalet, drugą wg mnie większą zaletą jest możliwość pisania metody dla wszystkich wrogów. O czym myślę ? (od razu wspomnę, że nie wiem jak u Ciebie to wygląda, ale wydaje mi się , że będzie OK)

    Przypuścmy, że mamy funkcję do obliczania kolizji, zapewne jest ona wykonywana tak, że odczytuje położenie pocisku i przelatuje pętlą przez wszystkich wrogów, sprawdza w nich pozycję i robi odpowiednią rzecz. Aby ułatwić sobie pracę i aby nie obchodziło nas czy dany obiekt to : WrogEasy, WrogMedium, WrogHard, możemy funkcję, która jako parametr przyjmie klasę bazową czyli baseWrog i wywoła odpowiednią metodę.

    Przykład :

    public void KolizjaPociskuZeStatkiem(baseWrog wrog, int silaPocisku)
    {
    wrog.OdejmiZycia(silaPocisku);
    }


    kod Main()
    ...
    sprawdzenie kolizji i wyłapanie z którym statkiem ta kolizja następuje i przekazanie statku do powyższej metody
    KolizjaPociskuZeStatkiem(MediumStatek1,3);

    --------------------------------------------------

    3. To dodawanie i odejmowanie wartości, każdy woli jak lubi i możliwe, że dla Ciebie jest tak czytelniej ale ja zdecydowanie wolę zapis :
    jakas_liczba += 5;

    niz

    jakas_liczba = jakas_liczba + 5;

    -------------------------------------------------


    To tyle w ramach pytań, pisać ;)

    OdpowiedzUsuń
  2. No faktycznie za dużo tych ifów :P
    Będę musiał poczytać o funkcjach wirtualnych i się trochę douczyć... dzięki za radę :)

    OdpowiedzUsuń