Temporal Opublikowano 24 Grudnia 2018 Udostępnij Opublikowano 24 Grudnia 2018 Dla nauki robię swoją pierwszą gierkę i próbuję wykorzystać wiedzę, którą zdobyłem przerabiając różne tutoriale. Zamysł jest taki, że sterujemy kulką, platformy lecą do góry, a my skaczemy z jednej na drugą by nie wpaść do przepaści. Stworzyłem kod ruchu platformowego, z możliwością skakania i perfekcyjnych kolizji. Wszystko działa super gdy platformy się nie poruszają, ale przy ruchomych platformach potrzebuje jakiś modyfikacji. Problem jest taki, że nie wiem jak się za to zabrać, w necie łatwo o znalezienie tutoriali odnośnie platform poruszających się poziomo, ale z pionowym już gorzej (większość tutoriali pokazuje jak wykonać jakiś kod na odpieprz bez precyzyjnych kolizji). Próbowałem coś tam po swojemu kombinować, ale każdy sposób dawał opłakane rezultaty. Kod gierki wygląda tak: dla obj_player: create /// @desc Variables spd = 2; jump_impulse = 4; grav = 0.1; hspd = 0; vspd = 0; step /// @desc Main code // initialize input iLeft = (keyboard_check(vk_left)) || (keyboard_check(ord("A"))); iRight = (keyboard_check(vk_right)) || (keyboard_check(ord("D"))); iUp = (keyboard_check(vk_up)) || (keyboard_check(ord("W"))); iDown = (keyboard_check(vk_down)) || (keyboard_check(ord("S"))); iJump = (keyboard_check_pressed(vk_space)); // x direction dx = iRight - iLeft; dy = iDown - iUp; // horizontal speed hspd = dx*spd; // gravity if (grav<0.3){grav+=0.01}; vspd = vspd+grav; // horizontal collision and movment if (place_meeting(x+hspd,y, obj_platform)){ while (!place_meeting(x+sign(hspd), y, obj_platform)){ x += sign(hspd); } hspd = 0; } x += hspd; // jumping if (iJump){ if (place_meeting(x,y+1, obj_platform)){ vspd=-jump_impulse; } } //vertical collision and movment if (place_meeting(x,y+vspd, obj_platform)){ while (!place_meeting(x, y+sign(vspd), obj_platform)){ y += sign(vspd); } grav = 0.1; vspd = 0; } y += vspd; dla obj_platform create /// @desc Random sprite sprite_index = choose(spr_platform_small, spr_platform_medium, spr_platform_large); vspd = 1; step //platform movement y-= vspd; // colission with player if(place_meeting(x,y-1, obj_player)){ while (!place_meeting(x, y-sign(vspd), obj_player)){ obj_player.vspd -= sign(vspd); } obj_player.vspd = vspd; } Ten kod dla obj_platform jest bez sensu, ale to z ostatniej wersji. Kombinowałem różne warianty, ale nie mam już na to pomysłu i testuje jak leci. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 24 Grudnia 2018 Udostępnij Opublikowano 24 Grudnia 2018 Może bezpośrednio przesuwaj 'y' gracza zamiast modyfikować jego prędkość Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Temporal Opublikowano 24 Grudnia 2018 Autor Udostępnij Opublikowano 24 Grudnia 2018 Pokombinowałem trochę i wymyśliłem coś takiego: dla obj_player: create dla obj_player: create /// @desc Variables spd = 2; jump_impulse = 4; grav = 0.1; hspd = 0; vspd = 0; lift = false; step /// @desc Main code // initialize input iLeft = (keyboard_check(vk_left)) || (keyboard_check(ord("A"))); iRight = (keyboard_check(vk_right)) || (keyboard_check(ord("D"))); iUp = (keyboard_check(vk_up)) || (keyboard_check(ord("W"))); iDown = (keyboard_check(vk_down)) || (keyboard_check(ord("S"))); iJump = (keyboard_check_pressed(vk_space)); // x direction dx = iRight - iLeft; dy = iDown - iUp; // horizontal speed hspd = dx*spd; // gravity if (grav<0.3){grav+=0.01}; vspd = vspd+grav; // horizontal collision and movment if (place_meeting(x+hspd,y, obj_platform)){ while (!place_meeting(x+sign(hspd), y, obj_platform)){ x += sign(hspd); } hspd = 0; } x += hspd; // jumping if (iJump){ if (place_meeting(x,y+1, obj_platform)){ vspd=-jump_impulse; } } //vertical collision and movment if (place_meeting(x,y+vspd, obj_platform)){ while (!place_meeting(x, y+sign(vspd), obj_platform)){ y += sign(vspd); } grav = 0.1; vspd = 0; } else { lift = false; } if (lift == false){y += vspd}; dla obj_platform /// @desc Random sprite sprite_index = choose(spr_platform_small, spr_platform_medium, spr_platform_large); vspd = 1; step /// @desc ? //platform movement y-= vspd; // lift the player if (place_meeting(x, y-1, obj_player)){ obj_player.y = (bbox_top-4); obj_player.lift = true; obj_player.grav = 0.1; obj_player.vspd = 0; } //destroy platform outside the height room if (y < 0){instance_destroy()}; Nie wiem czy to optymalne rozwiązanie, ale działa jak złoto. Żadnych bugów, perfekcyjna kolizja, śmiga wszystko. Może komuś się przyda, dlatego zostawiam to na forum. 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ę