matiasz Temat założony przez niniejszego użytkownika |
[Allegro 4] Kolizja » 2012-08-21 20:43:59 Witam otóż mam problem z dobraniem kolizji. Sytuacja wygląda następująco: Strzelam pociskiem (pocisk tablica jednowymiarowa) pocisk trafia w potwora i tu jest problem. Chce zrobić tak żeby za zabicie ludzika gracz dostał X punktów. Przy kolizji jednorazowo dodał do zmiennej X punktów ,a potem żeby pocisk został zniszczony i wróg także(to też mi nie wychodzi z usuwaniem bitmapy po kolizji). for(i = 0; i < MAX_BULLETS; i++) { // ta działa ale nalicza za dużo punktów (jak pocisk się przemieszcza to nabija punkty) if( isCollision( bullets[ i ].x, bullets[ i ].y, bullets[ i ].w, bullets[ i ].h,obrazek_x, obrazek_y, obrazek->w, obrazek->h ) == true ) { punkty ++; } //ta nie działa w ogóle if (kolizja(bullets[i].x,bullets[i].y,bullets[i].w,bullets[i].h,obrazek_x,obrazek_y,obrazek->w, obrazek->h)) { punkty ++; } }
Nie mam żadnych pomysłów już kombinuje na wszelkie sposoby i nic. Z góry dzięki. |
|
Miras |
» 2012-08-21 20:46:55 dodaj dodatkowy warunek dla petli w przypadku kolizji zmien jego wartosc tak by przerwal petle |
|
waxx |
» 2012-08-21 20:47:26 nawet nie pokazales definicji funkcji z ktorych korzystasz -- ergo mam wrazenie ze nie masz pojecia co robisz ;d |
|
matiasz Temat założony przez niniejszego użytkownika |
» 2012-08-21 22:32:10 bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2) { if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; else if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else return false; }; bool isCollision( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 ) { if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
return( false ); };
Tak wyglądają definicje funkcji oby dwóch kolizji. Miras nie rozumiem za bardzo Twojej wypowiedzi. Tak myślę jakbym zmienił pętle for na While to czy by coś to dało. |
|
waxx |
» 2012-08-21 22:39:47 return( true );
the fuck is that? a co do tamtej jego wypowiedzi to chodzi o to zebys po kolizji usuwal pocisk [po prostu usun go z vectora, bo tak to bedzie ci ciagle pointsy liczyc] |
|
bingo009 |
» 2012-08-22 14:01:25 return( true ) i return ( false )? Po co to? Nie lepiej bez nawiasów? A co do kasowania pocisku, i punktów, to nie widzę problemu. Masz tu pseudokod: if( jestkolizja( pociskx, pocisky, celx, cely ) == true ) punkty += 50;
Tu masz linijke kodu na punkty. Wcześniej sobie tworzysz zmienna punkty i już. Możesz też zrobić tak, że podczas sprawdzania kolizji pocisków powiększasz punkty. Są to jedynie podstawy. Potem ją tylko wyświetlasz. A co do znikania pocisku, to jest prosta sprawa, Najzwyczajniej w życiu przestań go rysować. Zwykła tablica jednowymiarowa jest złym pomysłem, bo nie masz żadnej kontroli nad wielkością. Poczytaj o std::vector. Z jego pomocą napisanie kodu pocisków to pikuś. W kontenerze trzymasz sobie pozycje x i y pocisku, kiedy gracz naciśnie strzał, to wtedy dodawany jest nowy indeks do vectora z jego pozycją, potem tylko pętla która rysuje wszystkie pociski, które są w vector(przy okazji w tej pętli sprawdzasz też kolizję, jeżeli jakiś pocisk styka sie z celem, to kasujesz indeks z jego pozycją w vector) i na końcu po narysowaniu wszystkiego dajesz pętle która zwiększa/zmniejsza pozycję pocisków w vector(dzięki temu się ruszają) i po robocie. |
|
mati1qazxsw2 |
» 2012-08-22 15:01:37 LX < _RX RX > _LX LY < _RY RY > _LY
L - lewy gorny rog
R - prawy dolny rog
_ - drugi rect
Masz kolizje ;p |
|
matiasz Temat założony przez niniejszego użytkownika |
» 2012-08-22 17:43:28 Te kolizje które podałem znalazłem na jakiejś stronie i próbowałem je zastosować. Miałem też dość długą przerwę i trochę skleroza dała się w znaki. Dzięki za wskazówki jak coś mi nie będzie szło to dam znać. |
|
« 1 » 2 |