碰撞 GameMaker 问题

问题描述 投票:0回答:2

我是 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;
    
}
game-maker game-maker-studio-2 game-maker-language
2个回答
0
投票

如果您正在移动实例

walkSpeed
,您还应该检查
walkSpeed
距离内的碰撞,不是
collisionSpeed

如果

collisionSpeed
walkSpeed
小 1 个像素,那么它可能不会返回碰撞,因为它将是碰撞发生前的最后一个像素。

一个很好的例子是当

walkSpeed=3
collisionSpeed=2
时,这肯定会导致实例卡在固体物体内。


0
投票

要解决角色碰撞时卡住的问题,请确保碰撞速度和行走速度相同,或者碰撞检查与实际移动距离精确匹配。由于这些值之间的差异,您的角色可能会进入实际上并不清晰的空间。这是运动代码的调整版本,可确保检查和实际运动一致:

// 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

最后,确保为所有涉及的精灵准确设置碰撞蒙版,以避免您看到的内容与游戏的碰撞逻辑之间出现任何差异。

© www.soinside.com 2019 - 2024. All rights reserved.