玩家在向上倾斜时粘在墙上
Player sticks in a wall while moving on slope up
我在我的 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(精确坡度对象) 和 parent_ground(子对象是 object_ground 和 object_slope 的对象)。
谢谢。
这是 game-maker 的一个很常见的问题,它只有 2 个真正的解决方案。
- 正在更改房间速度以使其跟上
- 降低玩家(白立方体)的速度
解决这个问题的一个简单而正确的解决方案是检查两者之间的位置。不要一次移动它 spd
个像素,而是将它移动 1 个像素 spd
次。如果在此期间你遇到碰撞,你已经达到最大值。
这样一来,无论您以 0.01
速度移动还是以 9999.0
速度移动都没有关系。
我在我的 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(精确坡度对象) 和 parent_ground(子对象是 object_ground 和 object_slope 的对象)。
谢谢。
这是 game-maker 的一个很常见的问题,它只有 2 个真正的解决方案。
- 正在更改房间速度以使其跟上
- 降低玩家(白立方体)的速度
解决这个问题的一个简单而正确的解决方案是检查两者之间的位置。不要一次移动它 spd
个像素,而是将它移动 1 个像素 spd
次。如果在此期间你遇到碰撞,你已经达到最大值。
这样一来,无论您以 0.01
速度移动还是以 9999.0
速度移动都没有关系。