我刚开始制作一个游戏,目前得到了一个可行的基础。其中包括玩家移动、墙壁碰撞和更换玩家服装(在不同颜色的衣服之间更换)。碰撞检测和服装更换工作正常,但是有一点让我困惑,我不知道为什么,当玩家站在原地并按下除左右箭头和 WASD 键之外的键时,角色会掉换衣服,而且从右侧查看。

这是一个 快照影片 以展示其中的问题,展示了墙壁检测和玩家服装更换,然后我按下 Z、回车和 4 键。

玩家对象的创建代码:

//定义变量

xspd = 0

yspd = 0

move_spd = 2

walk_spd = 2

run_spd = 3

x_inter = 真

y_inter = 是

颜色 = 1

玩家对象的步骤事件代码:

//控制

var up_key = 检查键盘(vk_up)或检查键盘(ord(“W”))

var down_key = 检查键盘(vk_down)或检查键盘(ord(“S”))

var right_key = 检查键盘(vk_right)或检查键盘(ord(“D”))

var left_key = 检查键盘(vk_left)或检查键盘(ord(“A”))

//移动

如果(检查键盘(vk_shift)或检查键盘(ord(“X”))]{move_spd = run_spd;

} else {move_spd = walk_spd

xspd = (right_key - left_key)* move_spd

yspd = (down_key - up_key)* move_spd

//碰撞检测

如果(place_meeting(x+xspd,y,obj_wall)){xspd = 0}

如果(place_meeting(x,y+yspd,obj_wall)){yspd = 0

x+=xspd

y+=yspd

如果(place_meeting(x,y,obj_changered)和检查键盘_按下(ord(“Z”))){

颜色 = 2

}

如果(place_meeting(x,y,obj_changeback)和检查键盘_按下(ord(“Z”))){

颜色 = 1

//动画

如果(颜色 = 1){

如果(检查键盘_按下(vk_up或ord(“W”))){sprite_index = spr_bootswu;image_index = 1;}

如果(检查键盘_按下(vk_down或ord(“S”))){sprite_index = spr_bootswd;image_index = 1;}

如果(检查键盘_按下(vk_left或ord(“A”))){sprite_index = spr_bootswl;image_index = 1;}

如果(检查键盘_按下(vk_right或ord(“D”))){sprite_index = spr_bootswr;image_index = 1;

如果(yspd = 0 或检查键盘_释放(vk_up或vk_down或ord(“W”或“S”))){x_inter = 真

如果(xspd = 0 或检查键盘_释放(vk_左或vk_右或ord(“A”或“D”))){y_inter = 真

如果(xspd != 0 或 yspd !=0){

image_speed = 1

如果(xspd> 0 和 x_inter = 真){sprite_index = spr_bootswr;y_inter = 假}

如果(xspd< 0 和 x_inter = 真){sprite_index = spr_bootswl;y_inter = 假}

如果(yspd> 0 和 y_inter = 真){sprite_index = spr_bootswd;x_inter = 假}

如果(yspd< 0 和 y_inter = 真){sprite_index = spr_bootswu;x_inter = 假}

} else {image_(speed = 0;image_index = 0;

如果(xspd = 0 和 yspd = 0){

如果(up_key){sprite_index = spr_bootswu}

如果(down_key){sprite_index = spr_bootswd}

如果(left_key){sprite_index = spr_bootswl}

如果(right_key){sprite_index = spr_bootswr}

}

} else if(color = 2){

如果(检查键盘_按下(vk_up或ord(“W”))){sprite_index = spr_crmsn_bootswu;image_index = 1;}

如果(检查键盘_按下(vk_down或ord(“S”))){sprite_index = spr_crmsn_bootswd;image_index = 1;}

如果(检查键盘_按下(vk_左或ord(“A”))){sprite_index = spr_crmsn_bootswl;image_index = 1;}

如果(检查键盘_按下(vk_右或ord(“D”))){sprite_index = spr_crmsn_bootswr;image_index = 1;

如果(yspd = 0 或检查键盘_释放(vk_up或vk_down或ord(“W”或“S”))){x_inter = 真

如果(xspd = 0 或检查键盘_释放(vk_左右或ord(“A”或“D”))){y_inter = 真

如果(xspd != 0 或 yspd !=0){

image_speed = 1

如果(xspd> 0 和 x_inter = 真){sprite_index = spr_crmsn_bootswr;y_inter = 假}

如果(xspd< 0 和 x_inter = 真){sprite_index = spr_crmsn_bootswl;y_inter = 假}

如果(yspd> 0 和 y_inter = 真){sprite_index = spr_crmsn_bootswd;x_inter = 假}

如果(yspd< 0 和 y_inter = 真){sprite_index = spr_crmsn_bootswu;x_inter = 假}

} else {image_speed = 0;image_index = 0;
}else {color = 1