タイルベースの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
グスタボマシエル

回答:


10

私があなたの質問を読んで理解していることから、プレイヤーの位置がY与えられれば、あなたは正しい位置を計算したいと思うでしょうX。これはかなり簡単です。この画像を見てください:

スロープ

スロープタイルが指定された位置にあると仮定します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

@ ashes999私が書いたものよりもずっと単純になるとは思わない。あなたの計算には何がmありbますか?
-bummzack

@bummzack mは勾配(1は下向き45度、1は上向き)であり、bはx軸上の切片です。グレード9の代数。言ってるだけ'。
ashes999

@ ashes999ええ、久しぶりです。この方程式を回答としてお気軽に投稿してください。
bummzack

8

これはすでに答えられていますが、別の方程式を提供できます:y = mx + bここで、yは計算された座標、mは勾配(45度で下降する場合は-1、45度で上昇する場合は1)、bはy切片です- -x = 0のy座標。

これにより、柔軟性がわずかに高まります。mを変更して、45度以外の異なる勾配を計算できます。たとえば、mがpi / 3の場合、勾配は30度になります。


4

このサイトには多くの価値があります:http : //info.sonicretro.org/Sonic_Physics_Guide

具体的には、ソリッドタイル:勾配と曲線のセクションをご覧ください。これは基本的に、これが初期のソニックゲームで達成されたと思われる方法を示しています。


興味深い読み物ですが、複雑すぎます。この種の勾配は私が望む唯一のものであるため、ソリューションを簡素化する必要があります。これには、高さマップ/センサー/スキャナーシステムが多すぎます。ただし、リンクを掘り下げてくれてありがとう。
-xNidhogg

2

別の軸の定理を調べてみてください。勾配の問題は解決しますが、かなりの数の数学が必要であり、理論自体は頭を回るのに時間がかかります。私はあなたをチュートリアルとそれをより良く説明する本にリンクしました

metanetsoftwareチュートリアル

リアルタイム衝突検出


それは多すぎる、imo。これは非常に単純化されたケースであり、SATの他の使用の必要はありません。しかし、時間をかけてリンクを作成してくれてありがとう。
-xNidhogg

2

どこか別の場所でオフバイワンエラーが発生したか、適切なタイミングで_leftSlope / _rightSlopeフラグを設定していないと思います。このコードはXの動きにまったく影響しませんが、ビデオの問題のようです。

これらのフラグがトリガーされるかどうかを確認する必要があります。次に、水平方向の衝突検出を確認します。斜面でトリガーしないようにします。


ああ、そうだね。これが起こるとき、私は実際に水平または垂直の衝突検出を望まない。私はそれを完全に無効にするのを忘れていました。今は何とか良く見えますが、まだ完成していません。ありがとう。
-xNidhogg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.