chesterr Temat założony przez niniejszego użytkownika |
[allegro] Niezależne przemieszczanie/animowanie obiektów na scenie » 2009-11-13 22:11:51 Witam wszystkich Odrazu problem. Pisze gre w ktorej leci statek i spuszcza bombe. Moj klopot polega na tym ze nie wiem jak zrobic aby lot statku i bomby byly nie zalezne. Moze troche takiego pseudo kodu: for( int i = 0; i < 800; i++ ) { rectfill( 20 + i, 20, 40 + i, 40 ) clear_to_color( ekran ) if( key[ KEY_ENTER ] ) bomba(); }
bomba() { for( int i = 0; i < 400; i++ ) { } } Tutaj problem polega na tym ze gdy zaczynam spuszczac bombe czyli wchodze w funkcje bomba() to samolot znika co jest zreszta logiczne. To tylko jedno z moich rozwiazan ktore jak reszta sie nie nadaje. Myslalem o czyms takim jak nakladanie sie bitmap jak warstwy rodem z fotoshopa ;d Jesli nie chce sie komus czytac calosci to: Chcialbym sie dowiedziec jak mozna wprawic obiekty w ruch calkowicie niezalezny od siebie. Interesuje mnie algorytm. Ale bylo by tez super zobaczyc to na jakims przykladzie w allegro. Z gory dziekuje za pomoc. |
|
chesterr Temat założony przez niniejszego użytkownika |
» 2009-11-14 16:17:01 chyba zem cos zabardzo pomotal ze nikt niechce pomoc ;d nie spotkal sie ktos moze z programem gdzie np. odbijaja sie poprostu 2 pileczki od scian albo leci statek ,strzela, spuszcza bomby itp. Interesowal by mnie fragmnet kodu (nieskomplikowanego zbytnio) jak to jest zrobione. |
|
DejaVu |
» 2009-11-14 16:26:05 Dodałem Twój temat do kolejki oczekujących na mojej liście - nie chciało mi się czytać tej długiej treści - zobaczę później...
/edit: Nie możesz robić animacji za pomocą zagnieżdżonych pętli. Musisz mieć natomiast zmienną do każdego obiektu, reprezentującą jego pozycję i prędkość. Niejednokrotnie ten temat był poruszany na forum i kilka razy już zdarzyło mi się dawać kod z wyjaśnieniem, więc możesz spróbować poszukać w googlach używając następującej frazy: site:forum.ddt.pl xyz, gdzie xyz to hasło, którego szukasz. |
|
chesterr Temat założony przez niniejszego użytkownika |
» 2009-11-15 00:26:37 Przedewszystkim to dziekuje za czas ktory sie znalazl i dla mnie :) hmm.. wygoglowalem ze mozna by to za pomoca switch'a zrobic na zasadzie: zmienna++ switch(zmienna) { case 0: ... //samolot w pozycji startowej case 1: ... //samolot w pozycji startowej+1 itp. }
wiele jest programow np. na gamedev gdzie moglbym podejrzec jakie ludziska maja na to sposoby ale prawie nikt kodu nie zalacza. W kazdym razie ja na dzis sie poddaje. |
|
DejaVu |
» 2009-11-15 01:38:21 Switch to słaby pomysł ;p |
|
malan |
» 2009-11-15 22:54:32 Może to Ci coś pomorze: int samolot_pozx = 0; int samolot_pozy = 150;
bool bomba = false; int bobma_pozx = 0; int bomba_pozy = 150;
while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] ) samolot_pozx--; if( key[ KEY_RIGHT ] ) samolot_pozx--; if( key[ KEY_UP ] ) samolot_pozy++; if( key[ KEY_DOWN ] ) samolot_pozy--; if( key[ KEY_ENTER ] ) if( !bomba ) bomba = true; if( bomba ) { if( bomba_pozy >= 0 ) { bomba_pozy--; } else { bomba = false; } masked_blit( , bomba_pozx, bomba_pozy, ); } else { bomba_pozx = samolot_pozx; bomba_pozy = samolot_pozy; } masked_blit( , samolot_pozx, samolot_pozy, ); } |
|
pompom |
» 2009-11-16 16:45:35 Ogólnie to można zrobić tak: masz kolejkę (albo listę bądź stos) z obiektami w grze, jest jedna pętla: - pobierasz współrzędne obiektów i je rysujesz (albo wywołujesz metodę rysuj obiektu i on sam siebie rysuje... wszystko jedno) - sprawdzasz, czy coś naciśnięto/ruszono się myszką/itd - jeśli tak, informujesz o tym zainteresowane obiekty, np. statek (zmieni później swoją pozycję) - mówisz obiektom, żeby się ruszyły - czyli np. bomba spadnie trochę - koniec pętli
Każdy krok to pętla przez całą kolejkę, dla wszystkich obiektów. Krok drugi można uprościć tworząć osobną strukturę zainteresowanych obiektów, ale jeśli jest ich mało i tak nie zrobi to różnicy.
Uwaga: jedna akcja na pętlę. Tzn - powiedzmy że bomba dotknęła ziemi - powinna wybuchnąć. Nie wybuchasz, ale zapisujesz sobie w obiekcie, że masz wybuchnąć i wybuchasz dopiero w następnej iteracji. A jak bomba wybuchnie to usuwasz ją z kolejki (ona sama siebie usuwa) i tworzy nowy obiekt wybuchu.
Zostaje ci jeszcze problem kolizji. Najprostszy sposób - tablica vector<bool> dla wszystkich pikseli gry. Jeśli dany piksel jest zajęty, to jest true. Każdy obiekt przy ruchu sprawdza, czy nie ma kolizji, jeśli nie ma, najpierw usuwa siebie z tablicy (zwalniając pola, czyli ustawiając na false), a następnie wypełnia z nową pozycją.
Bardziej skomplikowanym rozwiązaniem jest struktura z informacją, co pod danym pikselem (niekoniecznie pikselem, po prostu jednostką przestrzeni, bo tą można różnie podzielić) jest. Czyli np. pustka to będzie powietrze, coś innego to budynek, ziemia itd. Umożliwia to bardziej skomplikowane interakcje - np. piłka spadająca na miękką powierzchnię może odbić się inaczej od twardej itd. |
|
chesterr Temat założony przez niniejszego użytkownika |
» 2009-11-18 18:44:41 O to chodzilo... dzieki za pomoc malan oraz pompom. Juz pracuje nad programem w ktorym odbijam pileczkami i wszystko zagniezdzam w if'ach tak by wykonywala sie wlasnie jedna akcja na jedna iteracje.
Jeszcze jeden problem mam gdy chce odbic pilczke od sciany pod takim katem z jakim na nia wleciala. Mysle ze bedzie trzeba pobrac jakos kat wtedy kiedy pileczka dotknie sciany i z takim samym katem ja wypuscic... to tak w teorii :d |
|
« 1 » 2 |