Stydziu Opublikowano 29 Września 2020 Udostępnij Opublikowano 29 Września 2020 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 Więcej opcji udostępniania...
Rozwiązanie SimianVirus7 Opublikowano 30 Września 2020 Rozwiązanie Udostępnij Opublikowano 30 Września 2020 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 Chell i gnysek 2 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Stydziu Opublikowano 30 Września 2020 Autor Udostępnij Opublikowano 30 Września 2020 Dzięki za wyczerpującą odpowiedz. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 30 Września 2020 Administratorzy Udostępnij Opublikowano 30 Września 2020 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę