我无法使基于 bbox 的 gml 碰撞起作用。我的卧式没问题。这只是我的垂直
I'm having trouble getting bbox based gml collisions to work. My horizontal one is fine. Its just my vertical
所以最初我设置了 bbox
和 sprite_index
东西(我知道你应该使用遮罩,但我还没有达到动画效果所以我现在保持简单)。
var sprite_bbox_top = sprite_get_bbox_top(sprite_index) - sprite_get_yoffset(sprite_index);
var sprite_bbox_right = sprite_get_bbox_right(sprite_index) - sprite_get_xoffset(sprite_index);
var sprite_bbox_left = sprite_get_bbox_left(sprite_index) - sprite_get_xoffset(sprite_index);
var sprite_bbox_bottom = sprite_get_bbox_bottom(sprite_index) - sprite_get_yoffset(sprite_index);
所以下面是hsp代码。这工作得很好。
if (place_meeting(x + hsp, y, argument0)) {
while (!place_meeting(x + sign(hsp), y, argument0)) {
x += sign(hsp);
}
_wall = instance_place(x + sign(hsp), y, argument0);
if (hsp > 0) {
x = (_wall.bbox_left - 1) - sprite_bbox_right;
}
else {
x = (_wall.bbox_right + 1) - sprite_bbox_left;
}
hsp = 0;
}
这是无效的代码。正如您所看到的,这是相同的,但对于 y。我不明白它怎么会有不同的反应。当我向下并与 argument0
碰撞时,物体快速向右移动(pos x)。当我向上碰撞时,它完全消失了。
if (place_meeting(x, y + vsp, argument0)) {
while (!place_meeting(x, y + sign(vsp), argument0)) {
y += sign(vsp);
}
_wall = instance_place(x, y + sign(vsp), argument0);
if (vsp > 0) {
y = (_wall.bbox_bottom - 1) - sprite_bbox_top;
}
else {
y = (_wall.bbox_top + 1) - sprite_bbox_bottom;
}
vsp = 0;
}
这是俯视游戏还是平台游戏?如果是平台游戏,那么 vsp
可能会因为重力而有不同的速度。所以我认为 y = (_wall.bbox_bottom - 1) - sprite_bbox_top
在这种情况下不够有效。
也许甚至不需要,因为 while 语句中的 sign
应该已经将其与碰撞正确对齐。也许您可以尝试 removing/disabling 第二个 if 语句,看看是否有帮助。
它可以是以下两种情况之一:
速度与排量不兼容
例如,如果它移动到两个像素并且速度为三个,那么当出现绞痛时它将停止移动,因为它会不规则,我希望你能做到这一点,在我发现它是速度
锚点或原点可能会移动,检查精灵并确保它说的原点默认为0.0或左上角相同,有时我们会错误地移动并且不知不觉
目前我只能想到这两个,因为我在代码中没有看到错误,这意味着错误在另一部分或另一侧
如果我的回答对你有帮助,请给我+1 XD
所以最初我设置了 bbox
和 sprite_index
东西(我知道你应该使用遮罩,但我还没有达到动画效果所以我现在保持简单)。
var sprite_bbox_top = sprite_get_bbox_top(sprite_index) - sprite_get_yoffset(sprite_index);
var sprite_bbox_right = sprite_get_bbox_right(sprite_index) - sprite_get_xoffset(sprite_index);
var sprite_bbox_left = sprite_get_bbox_left(sprite_index) - sprite_get_xoffset(sprite_index);
var sprite_bbox_bottom = sprite_get_bbox_bottom(sprite_index) - sprite_get_yoffset(sprite_index);
所以下面是hsp代码。这工作得很好。
if (place_meeting(x + hsp, y, argument0)) {
while (!place_meeting(x + sign(hsp), y, argument0)) {
x += sign(hsp);
}
_wall = instance_place(x + sign(hsp), y, argument0);
if (hsp > 0) {
x = (_wall.bbox_left - 1) - sprite_bbox_right;
}
else {
x = (_wall.bbox_right + 1) - sprite_bbox_left;
}
hsp = 0;
}
这是无效的代码。正如您所看到的,这是相同的,但对于 y。我不明白它怎么会有不同的反应。当我向下并与 argument0
碰撞时,物体快速向右移动(pos x)。当我向上碰撞时,它完全消失了。
if (place_meeting(x, y + vsp, argument0)) {
while (!place_meeting(x, y + sign(vsp), argument0)) {
y += sign(vsp);
}
_wall = instance_place(x, y + sign(vsp), argument0);
if (vsp > 0) {
y = (_wall.bbox_bottom - 1) - sprite_bbox_top;
}
else {
y = (_wall.bbox_top + 1) - sprite_bbox_bottom;
}
vsp = 0;
}
这是俯视游戏还是平台游戏?如果是平台游戏,那么 vsp
可能会因为重力而有不同的速度。所以我认为 y = (_wall.bbox_bottom - 1) - sprite_bbox_top
在这种情况下不够有效。
也许甚至不需要,因为 while 语句中的 sign
应该已经将其与碰撞正确对齐。也许您可以尝试 removing/disabling 第二个 if 语句,看看是否有帮助。
它可以是以下两种情况之一:
速度与排量不兼容 例如,如果它移动到两个像素并且速度为三个,那么当出现绞痛时它将停止移动,因为它会不规则,我希望你能做到这一点,在我发现它是速度
锚点或原点可能会移动,检查精灵并确保它说的原点默认为0.0或左上角相同,有时我们会错误地移动并且不知不觉 目前我只能想到这两个,因为我在代码中没有看到错误,这意味着错误在另一部分或另一侧
如果我的回答对你有帮助,请给我+1 XD