Kolizje z platformą od dołu i po bokach
Ostatnio zmodyfikowano 2010-05-31 16:43
GzZiom Temat założony przez niniejszego użytkownika |
Kolizje z platformą od dołu i po bokach » 2010-05-30 16:50:22 Witam! Mam problem z kolizjami z platformami. Mogę sobie na nie wskakiwać z różnych stron, ale chcę aby działały one tak jak zwykłe obiekty (chcę żeby nie można było wskakiwać od dołu, oraz jak się nie doskoczy z boku to postać nie "przeniknie" przez platformę). Mój kodzik dla każdej platformy jest taki: for( int i = 0; i < MAP_H * MAP_W; i++ ) { if( platformy[ i ].y > 0 && player.y >= platformy[ i ].y - ludek->h && player.y <= platformy[ i ].y - ludek->h - player.vy && player.x >= platformy[ i ].x - ludek->w / 2 + 10 && player.x <= platformy[ i ].x + 32 - 10 ) naPodlozu = true; if( platformy[ i ].y > 0 && player.y >= platformy[ i ].y - ludek->h && player.y <= platformy[ i ].y - ludek->h - player.vy && player.x >= platformy[ i ].x - ludek->w / 2 + 10 && player.x <= platformy[ i ].x + 32 - 10 ) player.y = platformy[ i ].y - ludek->h; } |
|
DejaVu |
» 2010-05-30 17:01:29 Musisz zrobić coś w stylu: 1) jeżeli nie ma kolizji i przecięcie od góry - jest kolizja; 2) jeżeli jest kolizja - ignoruj ją.
Nie osiągniesz prawidłowego efektu dla przypadku w którym od boku będzie również kolizja, ponieważ przemieszczając obiekt jednocześnie w obu osiach (np. podczas skoku) może się zdarzyć tak, że ze stanu bez kolizji wejdziesz na dolną i boczną krawędź platformy. W tym wypadku powinieneś na nią wskoczyć, a nie się na niej zatrzymać.
Powinieneś mieć 2 mechanizmy kolizji: 1) ten wyżej opisany 2) pełny mechanizm kolizji tj. z czterech stron, czyli np. pudełko stoi na ziemii to nie da się przez nie przejść. |
|
GzZiom Temat założony przez niniejszego użytkownika |
» 2010-05-30 17:09:56 Jeżeli mam ignorować kolizję to po co w ogóle sprawdzać czy ona zachodzi? I trochę nie rozumiem tego 1 punktu (przecięcie od dołu). |
|
DejaVu |
» 2010-05-30 17:11:03 Jeżeli nie ma kolizji w stanie poprzednim i jest kolizja w stanie następnym z górną linią to powinien obiekt zostać na platformie, a nie przelecieć przez nią. |
|
GzZiom Temat założony przez niniejszego użytkownika |
» 2010-05-30 17:16:11 Tylko że w taki sposób, gdy prędkość w osi Y będzie duża to będzie on mógł przez tą jedną klatkę przelecieć z dołu do góry. I wtedy efekt będzie taki sam jakbym tego nie miał. |
|
DejaVu |
» 2010-05-30 17:29:20 To zbuduj prostokąt zawierający pozycję początkową i końcową i nim sprawdzaj czy nastąpiła kolizja... po prostu pokombinuj :) pisanie gier to nie jest prosta sprawa i trzeba tutaj myśleć jak problemy rozwiązywać, a nie szukać gotowców bo prawdopodobieństwo że je znajdziesz jest bliskie zeru. |
|
GzZiom Temat założony przez niniejszego użytkownika |
» 2010-05-30 18:14:30 Nie chodzi mi o gotowca, w żadnym wypadku. Chcę tylko wiedzieć jak to można rozwiązać (po ludzku, na chłopski rozum ;)), gdy już zupełnie nie wiem co zrobić. Wiem jak sprawdzić czy jest kolizja, tylko nie wiem jak na tą kolizję zareagować. Gdy tworzyłem gierkę z widokiem top-down, to kolizje rozwiązywało się prosto: vx = -vx; vy = -vy;
A tutaj właśnie ten sposób nie działa, a żaden inny mi nie przychodzi do głowy. |
|
DejaVu |
» 2010-05-31 01:17:52 Napisałem Ci pi razy drzwi proponowane rozwiązanie. Poza tym na forum istnieje kod, który realizuje dokładnie to co chcesz - już komuś to kiedyś rozwiązywałem. |
|
« 1 » 2 |