-1

基本的に、私は現在、プレーヤーが動きを通して何かと戦うことができる小さなプロジェクトに取り組んでいますが、重力が私にある種の問題を与えています. 基本的に、私はこのメソッドを取得しました.checkGravity() isGravityApplicable()がtrueを返すかどうかをチェックします.

isGravityApplicable() が true を返す場合、重力を適用する必要がありますが、1 ピクセル Y を超えるものは速すぎて、キャラクターを 1 ピクセル移動するのが非常に高速であるという問題があります。ゲーム ループを修正する必要があるかどうか、または何を修正する必要があるかわかりません。

public boolean isGravityApplicable() {
    for (Line2D line : frame.getMap().getFootholds()) {
        /*Does the bottom collider intersect the foothold?*/
        /*v THIS CHECK DOESN'T WORK CORRECTLY FOR SOME REASONS v*/
        if (!GraphicHelper.getLineCameraRelative(getBottomCollider(), frame.getCam()).intersectsLine(line)) {
            return true;
        }
        /*Above check returned false, if the velocity.y is above 1, then it might
         skip the line since it would be skipping 5 pixels for example at once.
         this check should resolve that.*/
        if (velocity.y > 0) {
            Line2D collider = getPositionToVelocityCollider();
            if (!collider.intersectsLine(line)) {
                position.y = (int) line.getY1(); //Y1 or Y2, same sh*t.
                return true;
            }
        }
    }
    return false;
}

public void checkGravity() {
    if (isGravityApplicable()) {
        if (isJumping) { //Player has jumped
            velocity.y += 1;
            velocity.y = velocity.y > TERMINAL_ACCELERATION ? (int) TERMINAL_ACCELERATION : velocity.y;
            if (velocity.y < 0) {
                isFalling = true;
            }
        } else if (isFalling) { //Player is currently falling but not from jumping. Most likely just spawned
            velocity.y = 1;
            /*Anything higher than 1 is WAY too quickly...*/
            //velocity.y += 1;
            //velocity.y = velocity.y > TERMINAL_VELOCITY ? (int) TERMINAL_VELOCITY : velocity.y;
        } else if (isJumping && isFalling) { //Player has jumped and has reached its highest point, falling back down
            velocity.y = 1;
            /*Anything higher than 1 is WAY too quickly...*/
            //velocity.y += 1;
            //velocity.y = velocity.y > TERMINAL_VELOCITY ? (int) TERMINAL_VELOCITY : velocity.y;
        } else { //Player hasn't jumped and has not started falling, he most likely just spawned
            isFalling = true;
            velocity.y = 1;
        }
    } else {
        isFalling = false;
        isJumping = false;
    }
}

前もって感謝します。ああ、エンティティの周りの単純な線で構成される衝突のように、もっとうまくできることがあれば教えてください。:) ありがとう。

4

1 に答える 1

0

なんらかの理由で update/tick メソッドがループ内で 2 回呼び出されました。私は脳のおならか何かを持っていたと思います。

于 2012-08-20T01:32:25.700 に答える