我是 GameMaker 新手,我按照“让我们一起学习”教程进行操作。我试图为我的角色制造碰撞,但是每次我的角色撞到物体时,它们都会被卡住,我无法再控制它们。我检查了很多次,也尝试了自己的想法,但没有任何效果。
if(keyboard_check(ord("D")) && place_free(x + collisionSpeed, y)) {
x += walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Side_Right;
}
if(keyboard_check(ord("A")) && place_free(x - collisionSpeed, y)) {
x -= walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Side_Left;
}
if(keyboard_check(ord("W")) && place_free(x, y - collisionSpeed)) {
y -= walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Normal_Back;
}
if(keyboard_check(ord("S")) && place_free(x, y + collisionSpeed)) {
y += walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Normal;
}
if(keyboard_check(vk_shift)) {
walkSpeed = 7;
}
if(keyboard_check(vk_nokey)) {
image_speed = 0;
image_index = 0;
walkSpeed = 3.5;
}
如果您正在移动实例
walkSpeed
,您还应该检查 walkSpeed
距离内的碰撞,不是 collisionSpeed
。
如果
collisionSpeed
比 walkSpeed
小 1 个像素,那么它可能不会返回碰撞,因为它将是碰撞发生前的最后一个像素。
一个很好的例子是当
walkSpeed=3
和 collisionSpeed=2
时,这肯定会导致实例卡在固体物体内。
要解决角色碰撞时卡住的问题,请确保碰撞速度和行走速度相同,或者碰撞检查与实际移动距离精确匹配。由于这些值之间的差异,您的角色可能会进入实际上并不清晰的空间。这是运动代码的调整版本,可确保检查和实际运动一致:
// Ensure walkSpeed is defined appropriately before this logic
if(keyboard_check(ord("D")) && place_free(x + walkSpeed, y)) {
x += walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Side_Right;
}
if(keyboard_check(ord("A")) && place_free(x - walkSpeed, y)) {
x -= walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Side_Left;
}
if(keyboard_check(ord("W")) && place_free(x, y - walkSpeed)) {
y -= walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Normal_Back;
}
if(keyboard_check(ord("S")) && place_free(x, y + walkSpeed)) {
y += walkSpeed;
image_speed = walkSpeed / 3;
sprite_index = sClaire_Normal;
}
Also, consider adding a slight overlap allowance in your collision checks if your game's physics or design permits, to prevent the character from getting stuck at the edge of objects due to pixel-perfect collisions.
For dynamic speed adjustments (like when running), make sure any changes to walkSpeed are made before checking collisions and moving the character:
if(keyboard_check(vk_shift)) {
walkSpeed = 7; // Example running speed
} else {
walkSpeed = 3.5; // Example walking speed
}
// Movement and collision checks follow here, as shown above
最后,确保为所有涉及的精灵准确设置碰撞蒙版,以避免您看到的内容与游戏的碰撞逻辑之间出现任何差异。