基于Tile的2D平台平台中的45°坡度


12

我想在基于图块的平台游戏中使用简单的45°坡度,但是我似乎无法将算法推倒。请看一下代码和视频,也许我错过了明显的地方?

//collisionRectangle is the collision rectangle of the player with 
//origin at the top left and width and height
//wantedPosition is the new position the player will be set to.
//this is determined elsewhere by checking the bottom center point of the players rect
if(_leftSlope || _rightSlope)
{        
    //Test bottom center point
    var calculationPoint = new Vector2(collisionRectangle.Center.X, collisionRectangle.Bottom);
    //Get the collision rectangle of the tile, origin is top-left
    Rectangle cellRect =
        _tileMap.CellWorldRectangle(
            _tileMap.GetCellByPixel(calculationPoint));
    //Calculate the new Y coordinate depending on if its a left or right slope
    //CellSize = 8
    float newY = _leftSlope
                            ? (calculationPoint.X % CellSize) + cellRect.Y
                            : (-1 * (calculationPoint.X % CellSize) - CellSize) + cellRect.Y;
    //reset variables so we dont jump in here next frame
    _leftSlope = false;
    _rightSlope = false;
    //now change the players Y according to the difference of our calculation
    wantedPosition.Y += newY - calculationPoint.Y;
}

外观视频:http: //youtu.be/EKOWgD2muoc


1
Vectors很棒吗?:D
Gustavo Maciel

Answers:


10

根据我对您所提问题的理解,您想给YX玩家的位置,计算出正确的位置。这是微不足道的。看一下这张图片:

坡

假设您的倾斜砖位于给定位置x,y(原点位于图像的左下方)。您拥有播放器的位置x1以及倾斜图块(u, v)的宽度和高度。x, y并且x1是世界坐标。

有了这些参数,您的玩家Y位置(y1)将为:

y1 = y + (x1 - x) * (v / u)

如果您只处理45度角,那么它会变得更加简单:

y1 = y + (x1 - x)

如果坡度相反,则为:

y1 = y + (v - (x1 - x))

在应用@SkimFlux修复程序,新公式以及一些愚蠢的东西之后,我忽略了它的作用。谢谢。
xNidhogg

您不能使用y = mx + b进行更简单的计算吗?
ashes999 2012年

@ ashes999我认为它不会比我写的简单得多。什么是mb你的计算?
bummzack 2012年

@bummzack m是您的坡度(1表示向下45度坡度,-1表示向上坡度),b表示x轴上的截距。9年级代数。只是在说'。
ashes999 2012年

@ ashes999是的,已经很长时间了。随时发布此等式作为答案。
bummzack 2012年

8

尽管已经回答了这个问题,但让我提供另一个方程式:y = mx + b,y是计算的坐标,m是斜率(-1在45度向下表示,1在45度向上表示),b是y截距- -y坐标,其中x = 0。

这使您稍微灵活一些。您可以更改m以计算45度以外的其他斜率。例如,pi / 3的m为30度。


4

您可能会在此站点中找到很多价值:http : //info.sonicretro.org/Sonic_Physics_Guide

专门针对您要查找的内容,请查看“实心图块:坡度和曲线”部分。它基本上向您显示了如何相信这是在早期的Sonic游戏中完成的。


有趣的读物,但是太复杂了。这种斜率是我唯一想要的斜率,因此应简化解决方案。高度图/传感器/扫描仪系统对此可能会过大。不过,感谢您挖掘链接。
xNidhogg

2

您可能需要研究“分离轴定理”,它将解决您的斜率问题,但是它确实需要大量的数学运算,并且理论本身也需要花费一些时间才能解决。我已将您链接到一本教程和一本可以更好地解释它的书

metanet软件教程

实时碰撞检测


太多了,imo。这是一个高度简化的情况,因此不需要使用SAT。不过,感谢您抽出宝贵的时间来建立链接。
xNidhogg

2

我认为您或者在别处有一个错误的错误,或者您没有在正确的时间设置_leftSlope / _rightSlope标志。这段代码根本不涉及X动作,但这似乎是您在视频中遇到的问题。

您应该检查这些标志是否被触发。然后检查水平碰撞检测:您不希望它在斜坡上触发。


哦,天哪。发生这种情况时,我实际上不希望水平或垂直碰撞检测。我完全忘记禁用它。现在看起来好一些,但尚未完成。谢谢。
xNidhogg '02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.