0

私は現在、C#forXNAに基づくプラットフォーマープロジェクトに取り組んでいます。

私の問題は、キャラクターがプラットフォームから離れるときに発生します。彼は倒れるはずですが、倒れません。私は現在、一連のブールを使用しています。jumpBool、fallBool、groundBool、および長方形ヘルパーを使用してプラットフォーム上にいるかどうかを判断する静的ブール値。

彼がどのジャンプ状態にあるかを決定するコードは次のとおりです。

    if (onGround == true)
        {
            fallBool = false;
            gravity = 0.0f;
            jumpheight = -14.0f;
        }
        else
        {
            fallBool = true;
        }

        if (jumpBool == true)
        {
            gravity = 0.0f;
            jumpheight += 1.0f;
            Position.Y += jumpheight;
            onGround = false;
        }

        if (jumpheight > 0)
        {
            jumpBool = false;
            fallBool = true;
        }

        if (fallBool == true)
        {
            gravity = 1.0f;
        }

彼がプラットフォームに触れたときに衝突テストを追加しようとするまで、これはすべて機能します。

以下は、プレーヤーがプラットフォームの上にあるかどうかを確認するためのバウンディングボックスを決定します。

static class RectangleHelper
{
    public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Bottom >= r2.Top - 1 &&
                r1.Bottom <= r2.Top + (r2.Height / 2) &&
                r1.Right >= r2.Left + r2.Width / 5 &&
                r1.Left <= r2.Right - r2.Width / 5);
    }

    public static bool TouchBottomOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Top <= r2.Bottom + (r2.Height / 5) &&
                r1.Top >= r2.Bottom - 1 &&
                r1.Right >= r2.Left + (r2.Width / 5) &&
                r1.Left <= r2.Right - (r2.Width / 5));
    }

    public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Right <= r2.Right &&
                r1.Right >= r2.Right - 5 &&
                r1.Top <= r2.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));
    }

    public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Left <= r2.Left &&
                r1.Left >= r2.Left - 5 &&
                r1.Top <= r2.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));
    }
}

そして最後に、このコードは、彼がブロックの上に立っているかどうかをチェックし、プラットフォームに触れたときにジャンプのプロパティを変更します。

 if (rectangle.TouchTopOf(newRectangle))
        {
            jumpheight = -14.0f;
            onGround = true;
            gravity = 0.0f;
            fallBool = false;
        }

ただし、私はブールを使用して彼が地面にいるかどうかを判断しているため、彼がプラットフォームから離れるとき、ブールはまだtrueに設定されており、落下しません。私は次のようなことを試みることを考えました

 if else(!rectangle.TouchTopOf(newRectangle))
 {
      onGround = false;
 }

しかし、それは何らかの理由でonGroundが常にfalseになる原因となり、彼はプラットフォームを通り抜けるだけです。彼がプラットホームを降りたら、どうすれば彼を転倒させることができますか?

この投稿を見て、ここまで作成していただきありがとうございます。ほんとうにありがとう。

4

1 に答える 1

0

関数がブール値を返すため、プレーヤーが地面にいるときにのみ「onGround」を設定しているようです(プレーヤーが降りた後は更新しません)。

onGround = rectangle.TouchTopOf(newRectangle);
于 2013-02-09T01:25:06.547 に答える