2

だから私はそうしようとしました。敵の左側の位置がプラットフォームの右側よりも大きい場合、敵は反対方向に向きを変え、その逆も同様です。今の問題は、ゲームが突然それを認識できなくなることです。この敵は同時に空中にジャンプするので、X値のみをチェックするようにしました。(長方形の右側と左側)
コードは次のとおりです。
これらは、プラットフォームの内側にあるかどうかを確認します...

static class RectangleHelper
{
    public static bool isInsideOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Right >= r2.Left &&
            r1.Left <= r2.Right);
    }
}
if (!chompBall.rectangle.isInsideOf(platform.rectangle))
{
    if (chompBall.movingRight == true && chompBall.canChangeDirection == true)
        chompBall.movingRight = false;
    else if (chompBall.movingRight == false && chompBall.canChangeDirection == true)
        chompBall.movingRight = true;
    chompBall.canChangeDirection = false;
}

私は多くのことを変更しようとしましたが、! それが機能するかどうかを確認しますが、いいえ。何も思いつきません!面白いことに、常に地面 (他の敵) に触れている場合は機能しますが、X 座標のみが重要なため、機能しません。
助けてください!
-編集:
ロジックを分割しますか? それはこれを行うことを意味しますか?:

            if (!chompBall.rectangle.isInsideOf(platform.rectangle) && chompBall.movingRight == true)
                chompBall.movingRight = false;
            else if (!chompBall.rectangle.isInsideOf(platform.rectangle) && chompBall.movingRight == false)
                chompBall.movingRight = true;  

-編集 2: ああ、私はあなたが何を意味するか知っていると思います。右にあるかどうかをチェックする RectangleHelper を作成し、その逆も行います。それでも機能しません。結果は同じです。

            if (chompBall.rectangle.isRightOf(platform.rectangle) && chompBall.movingRight == true)
                chompBall.movingRight = false;
            else if (chompBall.rectangle.isLeftOf(platform.rectangle) && chompBall.movingRight == false)
                chompBall.movingRight = true;

編集 3、敵の動き。ご覧のとおり、ここでは "canChangeDirection bool" が使用されています。これは、敵がプラットフォームの端に到達すると向きを変え、100ms まで再び向きを変えることができないようにするためのものです。コーナー:

            if (movingRight == true)
            {
                position.X += 2;
                rotation += 0.05f;
            }
            else if (movingRight == false)
            {
                position.X -= 2;
                rotation -= 0.05f;
            }

            if (canChangeDirection == false)
            {
                timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds;
                if (timer >= 100)
                {
                    canChangeDirection = true;
                    timer = 0;
                }
            }
4

0 に答える 0