我是新手,正在学习使用Gamemaker和编程,试图按照Gamemaker RPG教程来学习,同时为了解决之前与碰撞相关的问题(玩家会在墙壁上被卡住,仅能轻微地移动),我查看了另一个关于更好的移动代码的教程。

现在它的工作情况已经有所改善,但我现在遇到了一个问题:玩家在改变方向时,如果他们在墙壁旁边会出现与墙壁水平对齐并冻结的问题。通常我不会问这样一个问题,但现在我已经超出了两个教程的范围了,我完全不知道如何查找解决这个问题的方法,所以任何帮助都将非常感谢!

-

视频:

https://www.youtube.com/watch?v=1J5EydrnIPs&t=1s
https://www.youtube.com/watch?v=oqYyD4KB7pw

玩家代码(墙壁是标准的):

[Create]

move_speed = 1;

xspd = 0;

yspd = 0;

tilemap = layer_tilemap_get_id("Tiles_Col"); (//这个是碰撞墙壁的图层)

[Step]

//获取输入

right_key = keyboard_check(vk_right);

left_key = keyboard_check(vk_left);

up_key = keyboard_check(vk_up);

down_key = keyboard_check(vk_down);

//获取x & y速度

xspd = (right_key - left_key) * move_speed;

yspd = (down_key - up_key) * move_speed;

//碰撞检测

if place_meeting(x + xspd, y, tilemap)

{

xspd = 0;

}

if place_meeting(x, y + yspd, tilemap)

{

yspd = 0;

}

//玩家动画

if (xspd !=0 or yspd != 0)

{

if (yspd > 0) sprite\_index = spr\_player\_walk\_down;

else if (yspd < 0) sprite\_index = spr\_player\_walk\_up;

else if (xspd > 0) sprite\_index = spr\_player\_walk\_right;

else if (xspd < 0) sprite\_index = spr\_player\_walk\_left;

}

else

{

if (sprite\_index == spr\_player\_walk\_down) sprite\_index = spr\_player\_idle\_down;

else if (sprite\_index == spr\_player\_walk\_up) sprite\_index = spr\_player\_idle\_up;

else if (sprite\_index == spr\_player\_walk\_right) sprite\_index = spr\_player\_idle\_right;

else if (sprite\_index == spr\_player\_walk\_left) sprite\_index = spr\_player\_idle\_left;

}

//移动玩家

x += xspd

y += yspd

[End Step]

with (all)

{

depth = -bbox\_bottom;

}