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

Kolizje w mojej platformówce

Ostatnio zmodyfikowano 2023-05-31 17:05
Autor Wiadomość
AP1994
Temat założony przez niniejszego użytkownika
Kolizje w mojej platformówce
» 2022-11-30 10:29:30
Przy pomocy kursu na youtube
napisałem kolizje do mojej gry niestety kolizje wydają się działać losowo.
Wymiary bloku tektury: 32 na 32
Wymiary postaci: 32 na 32
C/C++
void Collisions::onCollision( player & gracz, mapa & m ) ///Metoda kolizji
{
   
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 ) ///Metoda ruchu gracza
{
   
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;
   
}
}
P-179794
DejaVu
» 2022-11-30 10:38:58
Tak na pierwszy rzut oka to:
1. wyciągnąłbym poniższą linijkę przed wszystkie pętle:
C/C++
gracz.platform = false;
2. zmieniłbym if-a, aby wyglądał tak:
C/C++
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.
P-179795
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ą.
P-179796
DejaVu
» 2022-11-30 18:12:39
No to może coś źle przepisałeś z tego kursu?
P-179797
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?
P-179798
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.
P-179799
pekfos
» 2022-12-06 20:37:21
Strzelam że próbując wejść w kafel od boku wypala ten warunek
C/C++
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.
P-179800
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ś.
P-179808
« 1 » 2 3
  Strona 1 z 3 Następna strona