我已经创建了一个非常简单的游戏,用来模拟在一个“球迷宫”风格的游戏中滚动一个球在游戏工作室。它只包括一个玩家的物体和墙壁,它不能通过。
玩家物体的速度和速度在你按下移动键时会增加/降低,然后它的位置每步移动一次(直到撞到墙壁)。我还增加了基本的减速,当没有按钮被按。
它主要起作用,但我有一个非常具体的bug。如果在x或y轴上快速、积极地移动(Right或Down;S或D,按WASDE 29)沿x或y轴移动时,如果我提供相反方向的输入(切换到E 110WE 211当持有E 112S<代码>E 213等等)时,播放机对象立即向相反的方向闪烁。
应该发生的是,物体应该开始减速,然后不可避免地撞上它正在倾覆的墙壁,这就是反向做同样的事情时所发生的事情;即通过保持W沿着y轴沿y轴快速移动,然后在撞到墙壁之前切换到S。
我不确定,但我很确定,当物体朝墙移动的速度足够快的时候,它没有足够的时间减速到停下来,然后再向相反的方向施加力来撞击墙壁。
以下是错误行为的短夹
这是一个正确行为的短夹,在相反的方向上工作。
下面是一个简单的步骤脚本:
// determine which input keys are being pressed and
// increment/decrement vspd and hspd respectively
if (vspd < 0 || keyboard_check(ord('W'))){
if place_meeting(x, y+vspd, block_obj)
{
// pixel-perfect collision resolution
while(!place_meeting(x, y-1, block_obj))
{
y -= 1;
}
vspd = 0;
}
else if keyboard_check(ord('W'))
{
if(!place_meeting(x, y-1, block_obj))
vspd -= 2;
}
else
{
if(vspd < -2)
{
vspd += 1;
}
else
{
vspd = 0;
}
}
}
if (vspd > 0 || keyboard_check(ord('S'))){
if place_meeting(x, y+vspd, block_obj)
{
// pixel-perfect collision resolution
while(!place_meeting(x, y+1, block_obj))
{
y += 1;
}
vspd = 0;
}
else if keyboard_check(ord('S'))
{
if(!place_meeting(x, y+1, block_obj))
vspd += 2;
}
else
{
if(vspd > 2)
{
vspd -= 1;
}
else
{
vspd = 0;
}
}
}
if (hspd < 0 || keyboard_check(ord('A'))){
if place_meeting(x+hspd, y, block_obj)
{
// pixel-perfect collision resolution
while(!place_meeting(x-1, y, block_obj))
{
x -= 1;
}
hspd = 0;
}
else if keyboard_check(ord('A'))
{
if(!place_meeting(x-1, y, block_obj))
hspd -= 2;
}
else
{
if(hspd < -2)
{
hspd += 1;
}
else
{
hspd = 0;
}
}
}
if (hspd > 0 || keyboard_check(ord('D'))){
if place_meeting(x+hspd, y, block_obj)
{
// pixel-perfect collision resolution
while(!place_meeting(x+1, y, block_obj))
{
x += 1;
}
hspd = 0;
}
else if keyboard_check(ord('D'))
{
if(!place_meeting(x+1, y, block_obj))
hspd += 2;
}
else
{
if(hspd > 2)
{
hspd -= 1;
}
else
{
hspd = 0;
}
}
}
x += hspd;
y += vspd;我似乎找不到导致这个问题的步骤代码的部分。
发布于 2017-06-22 19:42:35
如果我这样做,我将通过使用else语句,使每个控件彼此分离。伪代码,例如:
if (w) {
//code
} else if (a) {
//code
} else if (s) {
//code
} else if (d) {
//code
}这应该可以防止/帮助您的问题,因为您不能在多个方向一次提供加速度,如果这不能完全起作用,可能是因为您正在将轴向移动增加到墙上,并且当您改变方向时,您正在加速朝那个方向前进,因为碰撞检查不再是一个问题,因为您在按键内有碰撞检查,当您撞到墙上时,不应该因为这个原因而允许加速,只让玩家返回。我有一个几年前的项目,做你想做的事情,我会尝试发现它不起作用,让我知道。
https://stackoverflow.com/questions/44641425
复制相似问题