Skocz do zawartości

Precyzyjna kolizja i platforma poruszająca się pionowo


Temporal

Rekomendowane odpowiedzi

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

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

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ę...