Space Destroyer ku mojemu zaskoczeniu przeszedł przez I-szy etap eliminacji i dostał się do finału. Informacja o finale i jego uczestnikach II etap i jego końcowa klasyfikacja zależy od Was głosujących... Wystarczy wejść na stronę http://dajsiepoznac.devmedia.pl/ -Głosowanie - Etap II i przyporządkować miejscom 1-3 wybrane projekty. Należy także wskazać najbardziej wartościowy wpis na blogu.
Oto instrukcja głosowania podana przez organizatora konkursu:
w przeciągu kolejnych 7 dni wejdź na stronę http://dajsiepoznac.devmedia.pl/ (w razie niesłabnącego zainteresowania termin ten może ulec nieznacznemu wydłużeniu)
kliknij link "Głosowanie - Etap II"
z trzech list wybierz projekty, które Twoim zdaniem zasługują na największe wyróżnienie
do rozdania masz 6 punków: 3 za pierwsze miejsce, 2 za drugie i 1 za trzecie
obsadzenie dwóch pierwszych miejsc jest obowiązkowe; trzecie miejsce można zostawić puste
pod każdą z pozycji należy podać link do najbardziej wartościowego wg Ciebie posta z bloga, na który oddajesz głos (pokaż za co cenisz dany projekt!)
na podany adres email zostanie wysłana wiadomość z linkiem aktywującym głos - odbierz maila i kliknij (jeśli wiadomość nie dojdzie w ciągu kilku godzin - sprawdź SPAM, jeśli i tam jej nie ma - zgłoś się do mnie)
każdy może zagłosować tylko raz
Osobiście polecam także zagłosowanie na mojego dobrego kolegę, także finalistę w/w konkursu. Link do jego bloga: http://poznaj-tomkos.blogspot.com/ jego projekt to GPS Biker
Dziekuję za Wasze głosy na mój projekt Space Destroyer
Przyszedł czas na podsumowanie tych 15 tygodni pracy nad moim projektem.
Jak wiadomo od pierwszego posta blog powstał w ramach uczestnictwa w konkursie Maćka Aniserowicza "daj się poznać".
Moja gra spełnia wymagania konkursu tj. minimum 10 tyg. pracy nad projektem, w sumie uzbierało się ponad 13 tygodni blogowania na temat gierki.
To tyle na temat konkursu...
Co udało mi się przez ten czas osiągnąć?
Zaczynając projekt moja wiedza kończyła się na napisaniu prostego programu w stylu rozbudowany kalkulator itp. Po tych trzech miesiącach mogę z czystym sumieniem powiedzieć sobie, że dużo się nauczyłem. Zaczynając kodowanie tak naprawdę nie do końca wiedziałem co to jest klasa...
Pisząc bloga równorzędnie czytałem Symfonię c++ i Thinking in c++ poznając cały czas nowe możliwości języka, przez co kod co chwilę się zmieniał.
Powolnymi krokami, praktycznie co posta optymalizowałem kod zmieniając niekiedy całość moich wypocin. Dzięki konkursowi, który w jakiś sposób motywował mnie do dalszej pracy i komentarzom niektórych użytkowników np: http://forum.gamedev.pl/pomyślnie zakończyłem projekt.
Poznałem także bibliotekę allegro, która jak na pierwszy projekt według mnie jest łatwa w opanowaniu.
Za główny cel tworzenia projektu uważam naukę czyli poznanie języka c++.
Kilka słów o grze
Na początku bloga założyłem sobie jak ma wyglądać gierka i swoje swoje przemyślenia przelałem na kompilator :p.W trakcie pisania cały czas miałem nowe pomysły, które wcielałem do projektu.
Do tej pory udało mi się napisać prawie 2000 linii kodu. Czy to dużo- Tak, za dużo. Gdybym napisał grę czysto obiektowo wyszło by o połowę mniej. Gra jest napisana pół obiektowo -pół funkcyjnie przez co nie jestem do końca zadowolony. Dostałem kilka pomocnych komentarzy co do zmiany kodu; niektóre wykorzystałem, a te wpisy, z których nie skorzystałem poprostu nie do końca zrozumiałem. Dziękuję każdemu za chęć pomocy :)
Gra jest już grywalna i nie ma większych bugów.
Podsumowanie
Projekt uważam za zakończony(chyba, że znajdziecie błędy to je naprawię), choć nie wykluczam napisania Space Destroyera w wersji multiplayer...
Obserwując blogi innych uczestników konkursu nie mam wielkich szans na zajęcie wysokiego miejsca, chociaż nadzieja umiera ostania :p. Niektóre Wasze blogi i opisywany w nich materiał być może pomogą mi w poszerzaniu swojej wiedzy :) Samo uczestnictwo w konkursie przyniosło mi wiele frajdy i motywacji do pisania, pisania i pisania. Przez cały czas trwania konkursu było 2500 wyświetleń stron i ponad 800 unikalnych wejść co napawa mnie optymizmem i radością, że nie piszę tego tylko dla siebie. Najpopularniejszy post to :biblioteka allegro i poczatki gry space destroyerzapewne przez najczęściej Wyszukiwane słowa kluczowe w stylu: allegro c++ gra strzelanie.
Mimo wszystko, jeżeli mój projekt przypadł Wam do gustu proszę o Wasze głosy w konkursie.
Dla mnie i tak jestem w nim zwycięzcą bo "wygrałem" wiedzę :)
Możliwość pobrania i przetestowania gotowej 20-etapowej gry (Uwagi co do gry i błędów zawsze mile widziane )
Próbowałem dwoma innymi programami nagrać trailer z gry i tylko tym (AviScreen Pro) udało mi się to osiągnąć. Filmik nie powala jakością i (cichym, opóźnionym) dźwiękiem ale zapewniam, że w grze jest o wiele lepiej. Oczywiście gra działa płynnie i jest fullscreen, a na filmiku wyszło w okienku.
Tak, nie pomyliliście się... to jest blog o grze Space destroyer ;p Wiem wiem menu, jak i interfejs gry w porównaniu do poprzednich postów, a nawet tego ostatniego diametralnie się zmienił na lepsze. Gra odstraszała(-ła mam nadzieję :p) grafiką juz od jej samego uruchomienia i ukazania się menu. Teraz GUI w grze przeszło rewolucję i ładniej i czytelniej wygląda dzięki mojemu koledze Lopezowi za co serdeczne dzięki :) Poprzedniego posta nazwałem "menu- wersja finalna" i niestety wychodzi na to, że jestem niesłowny... Tak bywa przy pracy nad grą, kiedy to 1 element będzie -n razy modyfikowany. Jeżeli ktoś śledzi mojego bloga od początku to wie, ile razy było wszystko zmieniane począwszy na kodzie, a skończywszy na elementach graficznych. No dobra już pokazuję nowe GUI :)
Główne menu:
Menu pomoc:
Wrzucam także screena z nowym, o wiele lepszym interfejsem, wpadającym w klimat tej gry. Screen ukazuje także wybuch czyli moment zestrzelenia wroga.
Teraz przejdźmy do kodu... Najpierw pokażę funkcję, która wyświetla wybuch
funkcje.h void animacjawybuchu(int x, int y) { if( (frame2>=0) && (frame2<=13) ) { draw_sprite(bufor, wybuch0, x, y); } // frame od 14 do 65 else if( (frame2>=66) && (frame2<=80) ) { draw_sprite(bufor, wybuch5, x, y); } frame2--; } Funkcja przyjmuje 2 parametry-współrzędne x i y i na ich podstawie wyświetla poszczególne bitmapy wybuchu. Poszczególne, bo wybuch złożony jest z 6 bitmap, które są wyświetlane w zależności od wartości frame2. Już tłumaczę po co ta zmienna skoro istnieje frame. Podczas wywołanie tej funkcji frame może mieć różną wartość np. 35 czyli animacja wybuchu zaczęła się od wybuch3.BMP, a nie od początku czyli wybuch0.BMP. zmienną frame2 możemy sobie manipulować jak chcemy bo nie ma większych powiązań z grą i: frame2 ustawiane jest na 80 czyli nasz wybuch zostanie wyświetlony w wymiarze 80 klatek(1 sekunda w grze) po czym jego wartość będzie równa 0, bo po każdym obiegu pętli jest dekrementacja.
W pliku wrog.h class Cwrog { //kod... void Cwrog::poruszanie_wroga() { //kod... animacjawybuchu(x, y); //wywołanie funkcji if(zycia<=0) { punktacja++; play_sample(wybuch, 255,255,1000,0); //odglos wybuchu } if( (pozwro_y>430) || (zycia<=0) ) { frame2=80; //ustawienie frame na 80 x=pozwro_x; //przypisanie x-owi współrzędnej x wroga y=pozwro_y; //przypisanie y-kowi współrzędnej y wroga zycia=3*mnoznik; //opiszę to niżej pozwro_x=rand()%740; pozwro_y=-70; } } };
Przy każdej klasie wrogów dopisałem kilka linijek. Przy każdym obiegu pętli jest wywoływana funkcja animacjawybuchu(x, y); , jak pamiętamy aby wybuch się wyświetlił to frame2 musi być większe od 0. Jeżeli zestrzelimy wroga to: frame2 ustawia się na 80 i przypisane zostają x-owi i y-kowi współrzędne zestrzelonego wroga. Te współrzędne przyjmuje funkcja animacjawybuchu(x, y); i na ich podstawie wyświetla w danym miejscu wybuch, aż frame2>0. Czemu nie dałem togo do warunku if(zycia<=0)? dlatego, że brzydko to wygląda jak wróg wychodzi za planszę i momentalnie znika, a tak będzie wybuchał. Oczywiście za to nie dostajemy punktów... Odgłos wybuchu usłyszymy po zestrzeleniu wroga.
Zmodyfikowałem także funkcję wyświetlająca tło w grze, która przyjmuje wskaźnik do bitmapy zawierającej tło. Zrobiłem to, ponieważ w grze będą 3 tła zmieniane naprzemiennie co etap(nowe tło pokazane w screenie z gry).
if(etap%3==0) //jeżeli reszta z dzielenia wartości zmiennej etap wynosi 0
{
menu.wyswietl_tlo(tlo);
} else if(etap%3==1) //jeżeli reszta z dzielenia wartości zmiennej etap wynosi 1
{
menu.wyswietl_tlo(tlo2);
} else if(etap%3==2) //jeżeli reszta z dzielenia wartości zmiennej etap wynosi 2
{
menu.wyswietl_tlo(tlo3);
}
Zrobiłem także 20 etapów w grze. W 10-ciu pierwszych wartość mnożnik=1; w następnych mnożnik=2; czyli wartość żyć wrogów zostaje zwiększona dwukrotnie. Odpowiada za to linijka (zaznaczone na niebiesko plik wrog.h ) np: zycia=6*mnoznik; Grę wrzucę w niedzielę. Wtedy zrobię podsumowanie całej swojej pracy nad projektem :)
Menu uważam za ukończone. Wiem wiem graficznie pozostawia wiele do życzenia ale nie jestem grafikiem... "buttony" w Menu->pomoc działają na zasadzie kolizji myszki z "buttonem" czyli jeżeli najedziemy myszką na "button" to wyświetla nam się odpowiednia informacja Przez ten czas dodałem także lepsze bitmapy, które w jakimś stopniu oddają efekt animacji.
Postaram się ukończyć grę do 15 listopada tj. dzień zakończenia konkursu Daj się poznać.
Do zrobienia pozostało:
wybuch po zestrzeleniu wroga i jakiś dźwięk
ustawienie żyć dla różnych wrogów
ustawienie mocy pocisków wrogich statków tzn ile żyć będą nam traciły poszczególne pociski
ustawienie mocy naszych broni
ustawienie odpowiednich szans (%-towo) na wypadnięcie broni (im lepsza broń tym rzadniej wypadnie)
a także inne małe niedociągnięcia w tym minimalne zmiany graficzne... Kod wraz z wszystkimi plikami wrzucę do końca tygodnia.
Główne menu już działa... W międzyczasie szukam bitmap dla wrogów (już na stałe) i meszę znaleźć jeszcze 1 bitmapę dla wroga_vhard. Pozostałe "poruszają się". Także popracowałem nad menu pomocy. Owe menu będzie działało na zasadzie najechania myszką na poszczególne pole. Otóż jeżeli najedziemy myszką na pole sterowanie to obok wyświetli się nam informacja dotycząca sterowania w grze itd. Pole powrót oczywiście trzeba będzie kliknąć aby powrócić do głównego menu. Hmmm pole "o autorze" zmienię na pole "o grze" (komu by się chciało je kliknąć :P) i w nim opiszę rozgrywkę w grze...
Kod jest prawie identyczny jak w poprzednich 2-óch postach, tyle że w pętli głównej wyświetlana jest funkcjagmenu_pomoc();dla wartościgra==3; , a także małe zabiegi kosmetyczne związane z graficznym położeniem "buttonów"
case 3:
gmenu_pomoc();
break;
W miejscu oznaczonym czerwonym prostokątem będą wyświetlane poszczególne informacje...
Wczoraj trochę się głowiłem jak usunąć ten błąd i niestety nic nie wymyśliłem. Dzisiaj przebudowałem trochę program (dzięki pomysłowi tomkosa) i zamiast kilku pętli while ( lol) menu gry będzie na switchu. 0- oznacza wyświetlanie głównego menu 1- gra 2- wyjście z gry
while( gra!=2 ) //jezeli gra==2 to wychodzi z programu
{
while(( speed > 0) && ( zycia>0) )
{
switch(gra)
{
case 0:
gmenu(); //wyswietlanie menu
break;
case 1: //kod gry break; }
speed--; // ta dekrementacja zmiennej nie może zawierać się w pętli switch, więc jest poza nią(speed odpowiada za prawidłowy podział ilości klatek na sek)
}
blit( bufor, screen, 0,0,0,0, 800,600);
}
Ten sposób jest oczywiście lepszy dla dalszej rozbudowy programu, a także dla oka :) W międzyczasie znajdę innąmuzyczkę dla menu. Pod case 3 wyświetlana pomoc w menu ale o tym w następnym poście.
Niestety menu nie do końca działa w taki sposób jakbym chciał tzn. "buttony" działają prawidłowo, lecz gdy podczas grania w grę naciśniemy ESC (wyjście do menu) to gra działa dalej... Akcja gry nie zatrzymuje się i po naciśniećui "powrót do gry" widać inne położenie wrogów i nasza postać ma mniej żyć niż przed zastopowaniem gry... Główna pętla działa dopóki nie naciśniemy wyjście while(gra==1)- podczas wyjścia do menu(wciśnięty ESC i wartość gra=0) ta pętla nie powinna być wykonywana i niby nie jest bo widzimy na ekranie menu, a nie obraz gry. Myślałem dzisiaj nad tym i niestety nic nie wymyśliłem... Może znajdzie się dobry, mądry człowiek, który mnie oświeci :)
Mam nadzieję, że usunę ten błąd ale narazie pracuję nad Menu->POMOC. Niczego szczególnego z kodu tam nie będzie. Po wejściu w pomoc będą jakieś "buttony" jak w menu i pod każdym będzie wyświetlana jakaś bitmapa na screen, ot całe menu :p.
Odp Tomkos... W grze muszą być 2 pętle: 1 główna(wykonuj się dopóki coś tam) 2-ga funkcja steruje prękdością increment_speed() ale 3-cia faktycznie jest niepotrzebna i faktycznie można zrobićmenu na case. Poprawi to czytelność kodu i ułatwi dalszą rozbudowę menu (bo powoli zaczynam się w tym wszystkim gubić) Może wtedy pauza będzie działała tak jak powinna... Zobaczymy... Może jutro uda mi się zastosować te zmiany w kodzie...
Mając chwilę czasu poczytałem o Allegro GUI i uznałem, że jest trochę zagmatwane i nie ma sensu się tego uczyć. Menu zrobiłem(jeszcze nie dokończone) w Allegro w sprytny sposób... Otóż dzięki tej bibliotece możemy używać także myszy. Pozycje myszy to:mouse_x,mouse_y; mouse_b- oznacza stan myszy tzn zmienna ta przechowuje stan poszczególnego klikniętego przycisku np. lewy przycisk myszy: 1, prawy 2, obydwa naraz to 3 itd... W grze posłużyłem się tylko przyciskiem lewym, którym będziemy wybierali poszczególną część menu. Obrazować je będą bitmapy wyświetlane na bitmapie startu gry menu : nowa gra, powrót do gry, pomoc i wyjście. Samo kliknięcie nic nam nie da bez poznania współrzędnych myszy i współrzędnych np. nowa gra jeżeli mamy już te współrzędne posłużymy się funkcją kolizja. Jeżeli nasz kursor znajduje się w obrębie owej bitmapy i klikniemy lewym przyciskiem myszy to aktywujemy "coś". Standardowy kursor myszy zastąpiłem innym, ładniejszym :) Oto funkcja, którą wywołuje się w main()
if ( kolizja(200,200,powrotdogry->w,powrotdogry->h,mouse_x,mouse_y,kursor->w,kursor->h) ) //powrot do gry
{
draw_sprite(bufor, ramka, 191,191); //brązowa ramka, która jest rysowana jeżeli najedziemy myszką na poszczególne pole menu. Taki bajer ;p (aktywowana jest kolizja) if (mouse_b==1) // lewy przycisk myszy
{
play_sample(klik, 255,255,1000,0); //dzwiek oddajacy klikniecie gra=1;
}
}
if ( kolizja(200,100,nowagra->w,nowagra->h,mouse_x,mouse_y,kursor->w,kursor->h) ) // nowa gra
{
draw_sprite(bufor, ramka, 191,91);
if (mouse_b==1)
{
play_sample(klik, 255,255,1000,0);
punktacja=0;//nadajemy zmiennym poczatkowe wartosci
zycia=100;
ammo_bazo=100;
ammo_machgun=40;
ammo_laser=0;
ammo_flame=0; gra=1; //powrot do gry z poczatkowym ustawieniem zmiennych czyli nowa gra :)
}
}
if ( kolizja(200,300,pomoc->w,pomoc->h,mouse_x,mouse_y,kursor->w,kursor->h) ) //pomoc
{
draw_sprite(bufor, ramka, 191,291);
if (mouse_b==1)
{
play_sample(klik, 255,255,1000,0);
}
}
if ( kolizja(200,400,powrotdogry->w,powrotdogry->h,mouse_x,mouse_y,kursor->w,kursor->h) ) //wyjscie
{
draw_sprite(bufor, ramka, 191,391);
if (mouse_b==1) {
play_sample(klik, 255,255,1000,0);
gra=2; //jeżeli gra=2 to główna pętla gry zostaje zakończona i wychodzimy z gry
}
}
show_mouse(bufor);
}
W main wywołujemy ją: // cos tam while(gra!=2) { gmenu(); while(gra==1) { while( ( speed > 0) && ( zycia>0 && punktacja<992) ) { //kod gry } blit( bufor, screen, 0,0,0,0, 800,600); // w grze wszystko rysujemy na buforze, po pełnym obiegu pętli wyświetlamy na screen } blit( bufor, screen, 0,0,0,0, 800,600); //wyświetlamy menu gry }
Z braku czasu (CCNA i studia) przez ostatnie 13 dni nic nie napisałem i zrobiłem pierwszą, 2-tygodniową przerwę w pracy nad projektem ... W ten weekend postaram się częściowo napisać menu do gry. Zastanawiam się tylko w czym to zrobić.
ALLEGRO: podstawić bitmapy, które będą reprezentowały "button", który będzie wywoływał jakąś czynność po kliknięciu myszą.
ALLEGRO GUI, którego praktycznie nie znam i na pierwszy rzut oka wydaje się torchę zagmatwane.
Menu będzie wyglądało miej więcej w ten sposób:
Oto ciekawy przypadek o szwindlu nigeryjskim :P (nie związane z projektem!!!)
Na allegro sprzedaję iPhona i dostaję masę propozycji kupna, tyle że w j.ang, co mnie zdziwiło bo do tej pory nigdy nie dostałem oferty kupna z innego kraju, a także allegro nie jest popularne za granicą, a szczególnie w Nigerii :P
Oczywiście na początku myślałem, że to ktoś z UK ale potem się okazało, że "dziwnym trafem" wszyscy adresaci mailów są z Nigerii to o mało nie spadłem z krzesła :)
Oczywiście sprawdziłem IP każdego maila i "odziwo" są identyczne. Spytałem wujka google co wie tym przypadku i naprawdę jest o tym wiele informacji... Chociażby ten artykuł
Piszę o tym bo może ktoś z Was w przyszłości otrzyma podobne propozycje kupna i nie da się oszukać.
Miałem zacząć pracować nad menu gry lecz brakuje mi na to czasu... Zaczął się kurs CISCO CCNA1, a do tego studia i niestety zamiast czytać o allegro GUI czytam o sieciach :p Ale do rzeczy. W tym poście przedstawię ruchy dla Cwrog_vhard. W poprzednim poście i demo jest klasa tymczasowa dla tego wroga. Nie będę wrzucał kodu bo narazie takowego nie ma :p Jak przystało na poziom wroga very hard będzie trzelał 3 pociskami na raz, środkowy będzie leciał w dół, a 2 z brzegów na dół po skosie.
Oto rysunek obrazujący (czerwonymi strzałkami)ruchy i (fioletowymi)strzelanie Cwrog_vhard
Kod będzie podobny do Cboss1 czyli 3 tablice na pociski... Wrzucę tylko funkcję odpowiedzialną za strzelanie. Poruszanie jest podobna do pozostałych.
void strzelanie_wroga() { for(int i=0; i<3; i++) { if ( pozpocwro_y[i]>430) { if (czest_poc>=ogranicz_czest_poc) { pozpocwro_x[i]=pozwro_x-10; pozpocwro_y[i]=pozwro_y+20; pozpocwro_x[i+1]=pozwro_x+10; pozpocwro_y[i+1]=pozwro_y+20; pozpocwro_x[i+2]=pozwro_x+30; pozpocwro_y[i+2]=pozwro_y+20; czest_poc=0; } } if (pozpocwro_y[i]>430) { pozpocwro_y[i]=800; } pozpocwro_y[i]=pozpocwro_y[i]+2; pozpocwro_x[0]=pozpocwro_x[0]-1; // aby pocisk z lewej strony leciał w lewo pozpocwro_x[2]=pozpocwro_x[2]+1; //aby pocisk z prawej strony leciał w prawo czest_poc++; } }
Pora na wyczekiwaną wersję DEMO. W tym poście przedstawię tymczasowe bitmapy przedstawiające wrogów , bonusy i amunicję wypadającą z wrogów, "tymczasowe" bo niestety nie znalazłem bitamp w klimacie gry kosmicznej, które można wprawić w ruch. Może ktoś mi podeśle link :)
Oczywiście każdy z wrogów zależnie od jego poziomu ma coraz większą liczbę żyć, strzela innymi pociskami, które tracą coraz więcej żyć, z każdego wroga wypada inna amunicja. Bronie także mają coraz większą moc. W wersji demo jest 10 etapów i ostatni kończy się bossem.
A oto bitmapy przedtsawiające różne obiekty w grze:
WROGOWIE
Cwrog_easy
Cwrog_medium
Cwrog_hard
Cwrog_vhard - nie pisałem o ruchach dla tego rodzaju wroga, ma ruchy podobne do medium ale rusza się szybciej i strzela szybciej od innych.
Cboss1 - tutaj akurat znalazłem na innym blogu(open source tak jak mój blog) 4 bitmapy i jest mini animacja :P
BONUSY
apteczka z życiami(wypada rzadko):
szybkie chodzenie(dopalacz :P)
AMUNICJA
bazooka: karabin maszynowy: laser: miotacz ognia:
Nie będę przedstawiał posisków wystrzelanych przez wrogów i dźwięków. Jak ściągniecie to zobaczycie.
Oto elementy, które zrobię w najbliższym czasie. - W grze nie ma jeszcze menu(przyjdzie na to czas ;p i zostanie zrobione w Allegro GUI) - jakieś ładne fonty - bitmapy, dzięki którym można uzyskać animację - animację wybuchu po zestrzeleniu wroga - koniec gry (po zniszczeniu [i przekroczeniu 10 etapu w demo] robota przez wrogów gra się wyłącza :P)
Kilka osób zagrało w wersję demo i mówią, że jest za trudna, doradzili mi żebym naniósłpewne poprawki co do kodu i samej rozgrywki w grze. I mam prośbę do WAS o wypowiedzi czy podoba się Wam gra, co byście zmienili w kodzie i w samej grze. Każda wiadomość od Was będzie dla mnie pomocna :)
Oto moje wypociny zawarte w funkcji odpowiadającej za wroga easy. W funkcji jest wyswietlenie wroga i jego pocisku, a także wszystkie możliwe kolizje. Kolizja pociskow z każdej broni z wrogiem, kolizja pocisku wroga z robocikiem, kolizja robocika z wrogiem i kolizja pocisku flamethrower z pociskiem wroga czyli możliwość obrony dla robota przed pociskami. Przy każdym wywołaniu kolizji "coś się dzieje". Albo uruchamiamy funkcje odpowiedzialne za LOSOWE wypadanie bonusów, tracimy życia, wypada amunicja, zabijamy wroga
UżyłemCwrog_easy enemy_e[5]; czyli stowrzyłem 6-elementową tablicę obietków klasy enemy_easy. 6 wrogow tej klasy wystarczy. Liczba wrogich statków uzależniona jest od void etapy() (poprzednie posty). NapisałemOstatni post przed wersją demo bo miało być obiektowo, a nie jest do końca. Zastanawiam się aby te kolizje jeszcze upchnąć do klas bo za dużo tu tego ... Oto kod:
Jestem przygotowany na krytykę i otwarty na pomysły co do zmian w kodzie :) Pewnie trochę potrwa (w weekend studia) zanim zrobię kolizje dla innych wrogów ale przy następnym poście dodam kod w code.google.
Krótki post na temat mechanizmu poruszania tłem. Jak na początku napisałem ma to być gra, w której akcja obywa się w kosmosie, więc trzeba pomyśleć na tłem do gry. Nie byłoby trudności z dodaniem bitmapy, która by się nie ruszała ale to by było pójście na łatwiznę... Myślałem trochę nad zrobieniem ruchomego tła i wymyśliłem taką funkcję.
Jest to funkcja składowa klasy Cmenu(odpowiedzialna za menu, interfejs gry).
Funkcja działa w taki sposób:
Po każdym obiegu pętli gry wycina "pasek" z góry ekranu, na jego miejsce przesuwa całą bitmapę czyli o 1 piksel do góry, po przesunięciu bitmapy o 1 piksel w górę zostaje nam pusty pasek u samego dołu i owa funkcja wstawia wycięty pasek na sam dół ekranu.
A oto rysunek pomocniczy, a zarazem skrót mojego kazania :P
S[rzałki obrazują ruch bitmapy. Wycinek o nr 1 wstawiamy na sam dół, i na miejsce 1 wskakuje 2. Po obiegu pętli owa 2 wskakuje na sam dół, a na jej miejsce wskoczy 3 itd.
Testowałem to i bardzo fajnie wyszło ale niestety nie mam dobrej tekstury (obrazy wziąłem z google) i nie ma dobrego przejścia tzn widać końce bitmapy po podczas przesuwania. Jeżeli chodzi o mnie to ideą pisania gry jest nauka programowania, a nie ładna grafika, choć jeżeli znacie jakieś stronki z teksturami to zapodajcie :)
Przyszedł czas na rozmyślenia jak zrobić w grze etapy. Myślałem nad tym trochę i wymyśliłem taką funkcję, która przyjmuje globalną zmienną zawierającą liczbę punktów zdobytych przez gracza. Wcześniej w jakimś poście wspomiałem o zmiennej punktacja i teraz o niej pomówimy. Liczba punktów będzie odpowiadała poszczególnym etapom. Gra oczywiście zaczyna się z 0-wym dorobkiem punktów. Po zestrzeleniu "odpowiedniego" wroga dostaniemy "odpowiednią" ilość punktów zależnie od poziomu trudności wroga. np: Cwrog_easy if(zycia<=0)
{
punktacja++;
} dostajemy 1 pkt
Cwrog_medium if(zycia<=0)
{
punktacja=punktacja+2; } dostajemy 2 pkt itd... Jak wyjdzie demo to wtedy zmodyfikuje się odpowiednie wartości co do życ wroga i punktacji za zabicie go.
Teraz opiszę funkcję etapy. Pierwszej części nie będę opisywał bo wszystko widać... Do switcha przesyłamy argument etap zawierający liczbę, która jest równa etapowi. i w case przypisujemy do zmiennych wartości np:
case 1: max_easy=3; - tylu wrogów Cwrog_easy wystąpi w 1 etapie czyli 3 max_medium=0; - tylu wrogów Cwrog_medium wystąpi w 1 etapie czyli 0
max_hard=0; - tylu wrogów Cwrog_hard wystąpi w 1 etapie max_vhard=0; - tylu wrogów Cwrog_vhard wystąpi w 1 etapie (narazie go nie ma ale trwwaja prace nad wymyśleniem ruchów dla niego)
max_b1=0; - tylu bossów Cboss1 wystąpi w 1 etapie
case 1:
max_easy=3;
max_medium=0;
max_hard=0;
max_vhard=0;
max_b1=0;
break;
case 2:
max_easy=1;
max_medium=2;
max_hard=0;
max_vhard=0;
max_b1=0;
break;
case 3:
max_easy=1;
max_medium=1;
max_hard=1;
max_vhard=0;
max_b1=0;
break;
case 4:
max_easy=2;
max_medium=1;
max_hard=1;
max_vhard=0;
max_b1=0;
break;
// itd
case 10:
max_easy=0;
max_medium=0;
max_hard=0;
max_vhard=0;
max_b1=1;
break;
}
}
Od jakiegoś czasu nie piszę o kodzie w main() bo przyjdzie na to czas, więc pokażę co zrobimy z taką zmienną w głównej pętli gry: for(int e=0; e<max_easy; e++) {} for(int m=0; m<max_medium; m++) {} Taka pętla wykona się tyle razy ilu mamy wrogów w poszczególnym etapie (funkcja etapy i instrukcja case). Zawarte w niej będą funkcje sprawdzające kolizję z różnymi obiektami i inne ciekawe rzeczy ale o tym w następnym poście :) Myślę, że w ciągu 2 tyg powstanie "wczesna" wersja beta P.S. Jeżeli znacie strony z bitmapami o tematyce kosmicznej to dajcie link, bardzo mi pomożecie :)