进行对象碰撞的最佳方法?

Best way to do object collision?

我正在尝试对物体进行墙体碰撞,并且我遵循了提供一种碰撞方法的教程。

这是教程:https://www.youtube.com/watch?v=yZU1QJJdxgs

目前,如果对象检测到墙壁,它不会移动它的完整距离,而是逐像素移动,直到它靠在墙上。在我开始尝试使用 image_rotate 旋转对象之前,这一直很有效,因为它会导致对象通过滑动或旋转进入墙壁而卡在墙上。

我通过使用 draw_sprite_ext 并更改精灵本身的旋转而不是遮罩来解决这个问题,它工作了大约 20 分钟,直到它开始引起更多问题。

///obj_player Step

//Initialise Variables
hor_speed = 0;
ver_speed = 0;
accelerationspeed = 0.2;
decelerationspeed = 0.2;
maxspeed = 3;
pointdirection = 0;

//Get player's input
key_right = keyboard_check(ord("D"))
key_left = -keyboard_check(ord("A"))
key_up = -keyboard_check(ord("W"))
key_down = keyboard_check(ord("S"))
pointdirection = point_direction(x,y,mouse_x,mouse_y) + 270

hor_movement = key_left + key_right;
ver_movement = key_up + key_down;

//horizontal acceleration
if !(abs(hor_speed) >= maxspeed) {
    hor_speed += hor_movement * accelerationspeed;
}
//horizontal deceleration
if (hor_movement = 0) {
    if !(hor_speed = 0) {
        hor_speed -= (sign(hor_speed) * decelerationspeed)
    }
}

//vertical acceleration
if !(abs(ver_speed) >= maxspeed) {
    ver_speed += ver_movement * accelerationspeed;
}
//vertical deceleration
if (ver_movement = 0) {
    if !(ver_speed = 0) {
        ver_speed -= (sign(ver_speed) * decelerationspeed)
    }
}

//horizontal collision
if (place_meeting(x+hor_speed,y,obj_wall)) {
    while(!place_meeting(x+sign(hor_speed),y,obj_wall)) {
    x += sign(hor_speed);
    }
    hor_speed = 0;
}

//vertical collision
if (place_meeting(x,y+ver_speed,obj_wall)) {
    while(!place_meeting(x,y+sign(ver_speed),obj_wall)) {
    y += sign(ver_speed);
    }
    ver_speed = 0;
}

//move the player
x += hor_speed;
y += ver_speed;

///obj_player Draw
//rotate to look at cursor
draw_sprite_ext(spr_player, 0, x,y,image_xscale,image_yscale, pointdirection, image_blend, image_alpha);

我认为旋转对象的最佳方式是通过 image_rotate,我希望这样做时不会让东西卡在墙上。我目前的碰撞方法是否可以适用于此,或者我应该尝试以不同的方式来做到这一点?

你的代码看起来不错,但如果你要旋转物体,那么你还需要考虑 "knock back mechanic." 原因是玩家可能坐在这堵墙旁边,如果你旋转他们上方的物体使他们无法移动,被卡住的时间可不好玩。

所以你 'could' 让正在旋转的物体在旋转之前进行检查,如果有物体挡道,则要么停止它,要么将它们推回,这样它们就不会在范围内。