首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单物理模拟GMS中播放器对象的不正确移动

简单物理模拟GMS中播放器对象的不正确移动
EN

Stack Overflow用户
提问于 2017-06-19 23:26:42
回答 1查看 440关注 0票数 0

我已经创建了一个非常简单的游戏,用来模拟在一个“球迷宫”风格的游戏中滚动一个球在游戏工作室。它只包括一个玩家的物体和墙壁,它不能通过。

玩家物体的速度和速度在你按下移动键时会增加/降低,然后它的位置每步移动一次(直到撞到墙壁)。我还增加了基本的减速,当没有按钮被按。

它主要起作用,但我有一个非常具体的bug。如果在x或y轴上快速、积极地移动(RightDownSD,按WASDE 29)沿x或y轴移动时,如果我提供相反方向的输入(切换到E 110WE 211当持有E 112S<代码>E 213等等)时,播放机对象立即向相反的方向闪烁。

应该发生的是,物体应该开始减速,然后不可避免地撞上它正在倾覆的墙壁,这就是反向做同样的事情时所发生的事情;即通过保持W沿着y轴沿y轴快速移动,然后在撞到墙壁之前切换到S。

我不确定,但我很确定,当物体朝墙移动的速度足够快的时候,它没有足够的时间减速到停下来,然后再向相反的方向施加力来撞击墙壁。

以下是错误行为的短夹

这是一个正确行为的短夹,在相反的方向上工作。

下面是一个简单的步骤脚本:

代码语言:javascript
复制
// 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;

我似乎找不到导致这个问题的步骤代码的部分。

EN

回答 1

Stack Overflow用户

发布于 2017-06-22 19:42:35

如果我这样做,我将通过使用else语句,使每个控件彼此分离。伪代码,例如:

代码语言:javascript
复制
if (w) {
//code
} else if (a) {
//code
} else if (s) {
//code
} else if (d) {
//code
}

这应该可以防止/帮助您的问题,因为您不能在多个方向一次提供加速度,如果这不能完全起作用,可能是因为您正在将轴向移动增加到墙上,并且当您改变方向时,您正在加速朝那个方向前进,因为碰撞检查不再是一个问题,因为您在按键内有碰撞检查,当您撞到墙上时,不应该因为这个原因而允许加速,只让玩家返回。我有一个几年前的项目,做你想做的事情,我会尝试发现它不起作用,让我知道。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44641425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档