>source

GameMaker 게임에서 간단한 경사 운동을했습니다.

플레이어가 기울기를 올라가고 벽에 충돌하는 충돌 코드에 반응 할 시간이 없을 정도로 속도가 빠를 경우를 제외하고는 모든 것이 잘 작동합니다.

이것은 다음과 같습니다 : GIF .

내 코드는 다음과 같다 :

이벤트 만들기:

hspd = 0;
vspd = 0;
grav = 2;

단계 이벤트:

// Movement
if (keyboard_check(vk_right) && !keyboard_check(vk_left)) {
    hspd = 9;
} else
if (keyboard_check(vk_left) && !keyboard_check(vk_right)) {
    hspd = -9;
}
// Check not moving
if ((!keyboard_check(vk_right) && !keyboard_check(vk_left)) || (keyboard_check(vk_right) && keyboard_check(vk_left))) {
    hspd = 0;
}
// Gravity
if (!place_meeting(x, y+1, parent_ground)) {
    vspd += grav;
}
// Jumping
if (place_meeting(x, y+1, parent_ground)) {
    if (keyboard_check_pressed(vk_up)) {
        vspd = -20;
    }
}
// Variables
var hspd_final = hspd;
// Horizontal collision
horizontal_collision = instance_place(x+hspd_final, y, parent_ground);
if (horizontal_collision != noone) {
    if (horizontal_collision.object_index == object_ground) {
        while (!place_meeting(x+sign(hspd_final), y, horizontal_collision)) {
            x += sign(hspd_final);
        }
        hspd_final = 0;
    } else {
        // Declare yplus
        yplus = 0;
        // Loop
        while (place_meeting(x+hspd_final, y-yplus, parent_ground) && yplus <= abs(1*hspd_final)) {
            yplus += 1;
        }
        y -= yplus;
        while (place_meeting(x, y+1, parent_ground)) {
            y -= 1;
        }
    }
}
// Down slope
down_slope = instance_place(x, y+1, parent_ground);
if (down_slope != noone && down_slope.object_index != object_ground) {
    if (place_meeting(x, y+1, parent_ground)) {
        yminus = abs(hspd_final);
        while (place_meeting(x+hspd_final, y+yminus, parent_ground) && yminus != 0) {
            yminus --;
        }
        y += yminus;
    }
}
// Initialize horizontal speed
x += hspd_final;
// Vertical collision
if (place_meeting(x, y+vspd, parent_ground)) {
    while (!place_meeting(x, y+sign(vspd), parent_ground)) {
        y += sign(vspd);
    }
    vspd = 0;
}
// Initialize vertical speed
y += vspd;

object_ground(기본 블록),object_slope(percise slope 객체) 및parent_ground(하위 객체가있는 객체)의 3 개의 벽 객체가 있습니다. object_ground 및 object_slope).

감사합니다.

  • 답변 # 1

    이 문제를 잘 해결하는 간단하고 적절한 해결책은 그 사이의 위치를 ​​확인하는 것입니다. 그것을 spd 이동하는 대신  한 번에 픽셀, 1 픽셀 이동 spd  타임스. 그 사이에 충돌이 발생하면 최대 값에 도달 한 것입니다.

    이 방법은 0.01 로 움직여도 상관 없습니다.  속도 또는 9999.0  

  • 답변 # 2

    이것은 게임 제작자에게 매우 일반적인 문제이며 2 가지 실제 솔루션 만 있습니다.

    <올>

    실내 속도를 변경하여 유지할 수 있도록

    플레이어 (화이트 큐브) 속도 줄이기

  • 이전 amazon web services - CloudWatch 사용자 정의 로그가 올바르게 렌더링되지 않습니다
  • 다음 Excel IF 문이 "FALSE"를 반환합니다