AP1994 Temat założony przez niniejszego użytkownika |
Kolizje w mojej platformówce » 2022-11-30 10:29:30 Przy pomocy kursu na youtubenapisałem kolizje do mojej gry niestety kolizje wydają się działać losowo. Wymiary bloku tektury: 32 na 32 Wymiary postaci: 32 na 32 void Collisions::onCollision( player & gracz, mapa & m ) { for( int i = 0; i <( int ) kolizje.size(); i++ ) { for( int j = 0; j <( int ) kolizje[ i ].size(); j++ ) { if( !collide_aabb_aabb( gracz.x, gracz.y, gracz.x2, gracz.y2, i * 32, j * 32, i * 32 + 32, j * 32 + 32 ) ) { gracz.platform = false; } else { if( kolizje[ i ][ j ] == 1 ) { if( gracz.vDir == 2 && gracz.y - gracz.velocityY <= j * 32 ) { gracz.y = j * 32 - 32; gracz.y2 = gracz.y + 32; gracz.platform = true; gracz.skok = true; gracz.velocityY = 0; } else if( gracz.vDir == 1 ) { gracz.y -= gracz.jumpSpeed; gracz.y2 = gracz.y; gracz.velocityY = 0; gracz.platform = false; gracz.skok = false; } if( gracz.hDir == 1 && !gracz.platform ) { if( gracz.sprint ) gracz.x -= bieg; else gracz.x -= moveSpeed; gracz.x2 = gracz.x + 32; } else if( gracz.hDir == 2 && !gracz.platform ) { if( gracz.sprint ) gracz.x += bieg; else gracz.x += moveSpeed; gracz.x2 = gracz.x + 32; } } } } } } void player::control( Window w ) { if( al_key_down( & w.klawiatura, ALLEGRO_KEY_D ) && al_key_down( & w.klawiatura, ALLEGRO_KEY_LSHIFT ) ) { velocityX = bieg; hDir = 1; sprint = true; } else if( al_key_down( & w.klawiatura, ALLEGRO_KEY_A ) && al_key_down( & w.klawiatura, ALLEGRO_KEY_LSHIFT ) ) { if( x >= 0 ) { velocityX = - bieg; hDir = 2; sprint = true; } else { x = 0; } } else if( al_key_down( & w.klawiatura, ALLEGRO_KEY_D ) ) { velocityX = moveSpeed; hDir = 1; sprint = false; } else if( al_key_down( & w.klawiatura, ALLEGRO_KEY_A ) ) { if( x >= 0 ) { velocityX = - moveSpeed; hDir = 2; sprint = false; } else { x = 0; } } else { velocityX = 0; hDir = 0; } if( al_key_down( & w.klawiatura, ALLEGRO_KEY_W ) && skok ) { velocityY -= jumpSpeed; vDir = 1; platform = false; } }
|
|
DejaVu |
» 2022-11-30 10:38:58 Tak na pierwszy rzut oka to: 1. wyciągnąłbym poniższą linijkę przed wszystkie pętle: 2. zmieniłbym if-a, aby wyglądał tak: if( collide_aabb_aabb( gracz.x, gracz.y, gracz.x2, gracz.y2, i * 32, j * 32, i * 32 + 32, j * 32 + 32 ) ) { if( kolizje[ i ][ j ] == 1 ) { if( gracz.vDir == 2 && gracz.y - gracz.velocityY <= j * 32 ) { gracz.y = j * 32 - 32; gracz.y2 = gracz.y + 32; gracz.platform = true; gracz.skok = true; gracz.velocityY = 0; } else if( gracz.vDir == 1 ) { gracz.y -= gracz.jumpSpeed; gracz.y2 = gracz.y; gracz.velocityY = 0; gracz.platform = false; gracz.skok = false; } if( gracz.hDir == 1 && !gracz.platform ) { if( gracz.sprint ) gracz.x -= bieg; else gracz.x -= moveSpeed; gracz.x2 = gracz.x + 32; } else if( gracz.hDir == 2 && !gracz.platform ) { if( gracz.sprint ) gracz.x += bieg; else gracz.x += moveSpeed; gracz.x2 = gracz.x + 32; } } } Powód zmian: Jeżeli będziesz miał 4 kratki na których jest postać i kolizja nie będzie występowała na ostatniej procesowanej kratce to zawsze wylądujesz ze statusem gracz.platform = false przy Twojej obecnej implementacji. |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-11-30 13:28:26 Ponieważ pisałem kolizje na podstawie kursu z YouTube, zmiany o których napisał DejaVu nie wiele dały postać zamiast zatrzymać się na przeszkodzie wchodzi na nią. |
|
DejaVu |
» 2022-11-30 18:12:39 No to może coś źle przepisałeś z tego kursu? |
|
pekfos |
» 2022-12-02 17:42:59 Albo źle przetłumaczony do innych założeń, bo raczej nie przepisywałeś całego kodu z kursu? Jakiego problemu tu szukamy? |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-12-06 17:22:05 Kiedy postać spada na kafelki, kolizja działa prawidłowo, ale kiedy postać idzie w prawo lub w lewo kolizje przestają działać poprawnie. Postać prawie zawsze przeskakuje nad kafelkiem i koliduje tylko przy specyficznym ułożeniu kafelków. Kurs przepisałem chyba poprawnie i nie zmieniałem kodu, który dotyczył kolizji. Ponieważ głównie o kolizje mi w tym kursie chodziło. W dodatku program zaczyna działać poprawnie, kiedy przeskaluję teksturę tak, że pojedynczy kafelek jest kilka razy większy od postaci. |
|
pekfos |
» 2022-12-06 20:37:21 Strzelam że próbując wejść w kafel od boku wypala ten warunek if( gracz.vDir == 2 && gracz.y - gracz.velocityY <= j * 32 ) Z kodu nie wynika jak jest osiągany stan vDir = 2 i druga część warunku nie ma dla mnie sensu. Interpretuję to jako test na kolizję od góry. Jeśli vDir = 2 oznacza spadanie, to może jest to też stan spoczynkowy gdy chodzisz po kaflach. Wejście na kafel z boku próbuje wtedy teleportować gracza na górę. Takie przestawianie pozycji gracza przy kolizjach nie jest za dobrym pomysłem, bo możesz wtedy wejść w zupełnie inne kolizje i reakcja na nie będzie przestawiać gracza dalej. |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-12-09 17:24:30 Jak w takim razie lepiej zbudować kolizje? Prosiłbym o przykład jakiegoś kodu algorytmu czy coś. |
|
« 1 » 2 3 |