Skocz do zawartości

wyjaśnienie kodu


Stydziu
Przejdź do rozwiązania Rozwiązane przez SimianVirus7,

Rekomendowane odpowiedzi

Cześć

 

Mam pytanie odnośnie kodu z tourialu, ogólnie kod rozumiem ale nie wiem po co jest ta pętla while co robi wiem że wykonuje się jak nie ma kolizji ale nie widzę żadnej różnicy jak usunę ten fragment kodu z tym jak on jest w poruszaniu się gracza.

 

if (place_meeting(x+hsp,y,oWall))
{
    
    while(!place_meeting(x+sign(hsp),y,oWall))
    {
        x = x + sign(hsp);
    }
    hsp = 0;
}

x = x + hsp;

Odnośnik do komentarza
Udostępnij na innych stronach

  • Rozwiązanie

Chodzi tutaj o dodatkowe sprawdzanie każdego piksela, tak zwane "pixel perfect collision". Samo IF sprawdza, czy w odległości od równej prędkości poruszania jest ściana (oWall). Jeśli tak, oczywiście IF wykonuje się. Ale co jeśli prędkość jest większa niż powiedzmy 10px? Wtedy zostanie nam luka, bo IF sprawdził to tylko raz. Kod w WHILE wykonuje się BEZ PRZERWY dopóki warunek jest spełniony. Dlatego łatwo grę można zatrzymać w miejscu, ponieważ WHILE zapętla się i nie pozwala programowi wykonywać się dalej, kiedy źle określimy warunek. 

Czyli, wykonując swój kod, IF sprawdza, czy napotkano ścianę, jeśli tak, WHILE sprawdza pozycję gracza + jeden pixel! (sign oznacza jeden pixel) i jeśli nie wykryję ściany, przesuwa gracza o ten jeden pixel i tak w nieskończoność, dopóki pozycja gracza + jeden pixel == pozycja ściany.

W praktyce wygląda to następująco, gdy prędkość poruszania się gracza to 20px
Animated GIF

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Z początku chciałem napisać, ze w tej sytuacji ostatnia linijka jest też zbędna, bo przecież hsp = 0, ale to nie prawda - jeśli akurat pozycja gracza jest idealna, ze nie wystąpi ten problem, wtedy właśnie hsp ma wartość która zbliży nas na 0 pikseli do ściany, więc jednak to musi być (chociaż mogło by tam być else). Sprytne.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...