玩家在斜坡上移动时粘在墙上

Posted

技术标签:

【中文标题】玩家在斜坡上移动时粘在墙上【英文标题】:Player sticks in a wall while moving on slope up 【发布时间】:2019-05-28 07:52:22 【问题描述】:

我在我的 GameMaker 游戏中做了一个简单的斜坡运动。

一切正常,除非玩家上坡并且它的速度快到没有时间对卡在墙上的碰撞代码做出反应。

看起来是这样的:GIF。

所以我的代码如下所示:

创建活动

hspd = 0;
vspd = 0;

grav = 2;

步骤事件

// Movement
if (keyboard_check(vk_right) && !keyboard_check(vk_left)) 
    hspd = 9;
 else
if (keyboard_check(vk_left) && !keyboard_check(vk_right)) 
    hspd = -9;


// Check not moving
if ((!keyboard_check(vk_right) && !keyboard_check(vk_left)) || (keyboard_check(vk_right) && keyboard_check(vk_left))) 
    hspd = 0;


// Gravity
if (!place_meeting(x, y+1, parent_ground)) 
    vspd += grav;


// Jumping
if (place_meeting(x, y+1, parent_ground)) 
    if (keyboard_check_pressed(vk_up)) 
        vspd = -20;
    


// Variables
var hspd_final = hspd;

// Horizontal collision
horizontal_collision = instance_place(x+hspd_final, y, parent_ground);
if (horizontal_collision != noone) 
    if (horizontal_collision.object_index == object_ground) 
        while (!place_meeting(x+sign(hspd_final), y, horizontal_collision)) 
            x += sign(hspd_final);
        
        hspd_final = 0;
     else 
        // Declare yplus
        yplus = 0;

        // Loop
        while (place_meeting(x+hspd_final, y-yplus, parent_ground) && yplus <= abs(1*hspd_final)) 
            yplus += 1;
        
        y -= yplus;
        while (place_meeting(x, y+1, parent_ground)) 
            y -= 1;
        
    


// Down slope
down_slope = instance_place(x, y+1, parent_ground);
if (down_slope != noone && down_slope.object_index != object_ground) 
    if (place_meeting(x, y+1, parent_ground)) 
        yminus = abs(hspd_final);

        while (place_meeting(x+hspd_final, y+yminus, parent_ground) && yminus != 0) 
            yminus --;
        

        y += yminus;
    


// Initialize horizontal speed
x += hspd_final;

// Vertical collision
if (place_meeting(x, y+vspd, parent_ground)) 
    while (!place_meeting(x, y+sign(vspd), parent_ground)) 
        y += sign(vspd);
    
    vspd = 0;


// Initialize vertical speed
y += vspd;

我有 3 个墙壁对象:object_ground(基本块)、object_slope(精确坡度对象)和 parent_ground(子对象是对象object_ground 和 object_slope)。

谢谢。

【问题讨论】:

【参考方案1】:

一个简单而恰当的解决方案就是检查两者之间的位置。不要一次移动它spd 像素,而是移动它1 像素spd 次。如果在此期间遇到碰撞,您已经达到了最大值。

这样,无论您以0.01 速度还是9999.0 速度移动都没有关系。

【讨论】:

我如何准确地移动我的播放器spd 次?喜欢repeat (spd) hspd += 1; 然后夹住我的hspd 是的,或者在 while / for 循环中。但是看看你的代码,如果它发生碰撞,你实际上看起来像是在向后移动对象(while 循环会这样做)。我认为正在发生的是,在斜坡代码运行后,您的“垂直运动”正在将玩家拉下。我通常使用自己的速度和方向变量,然后尝试平滑移动,逐个像素地检查沿线的每一个。【参考方案2】:

这是游戏制作者很常见的问题,它只有两个真正的解决方案。

    更改您的房间速度以使其跟上 降低播放器(白色方块)的速度

【讨论】:

好吧,我的玩家速度不是一个偶数,所以我猜是因为它,玩家被困在了墙内。我想让我的运动不是线性的,所以玩家会有加速度和东西,但这意味着速度值会有奇数。我该如何实现呢?

以上是关于玩家在斜坡上移动时粘在墙上的主要内容,如果未能解决你的问题,请参考以下文章

CollectionView "Header" 像 instagram 一样滚动时粘在顶部

仅当玩家在 Y 轴上向上移动时才移动地面视差

Spritekit:如何将玩家移动限制在某些瓷砖上

处理较大背景上的玩家移动

Unity 2D:玩家角色移动脚本

《头号玩家》AI电影调研报告