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 :)