Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kolizje z platformą od dołu i po bokach

Ostatnio zmodyfikowano 2010-05-31 16:43
Autor Wiadomość
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:
C/C++
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;
   
}
P-17355
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ść.
P-17358
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).
P-17360
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ą.
P-17361
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ł.
P-17362
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.
P-17363
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.
P-17366
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.
P-17379
« 1 » 2
  Strona 1 z 2 Następna strona