进行对象碰撞的最佳方法?
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' 让正在旋转的物体在旋转之前进行检查,如果有物体挡道,则要么停止它,要么将它们推回,这样它们就不会在范围内。
我正在尝试对物体进行墙体碰撞,并且我遵循了提供一种碰撞方法的教程。
这是教程: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' 让正在旋转的物体在旋转之前进行检查,如果有物体挡道,则要么停止它,要么将它们推回,这样它们就不会在范围内。