Игрок вонзается в стену, двигаясь по склону вверх - PullRequest
0 голосов
/ 28 мая 2019

Я сделал простое движение по склону в моей игре 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;

У меня есть 3 настенных объекта: object_ground (основной блок), object_slope (percise slope object) и parent_ground (объект, дочерними объектами которого являются object_ground и object_slope ).

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Простое и правильное решение, чтобы исправить это, это проверить позиции между ними. Вместо того, чтобы перемещать его spd пикселей сразу, переместите его на 1 пиксель spd раз. Если за это время вы столкнулись со столкновением, вы достигли максимума.

Таким образом, не имеет значения, двигаетесь ли вы со скоростью 0.01 или со скоростью 9999.0.

0 голосов
/ 30 мая 2019

Это довольно распространенная проблема для гейм-мейкера, и у него есть только 2 реальных решения.

  1. Изменение скорости в комнате, чтобы она не отставала
  2. Снижение скорости вашего игрока (белый куб)
...