1

私はタイルの2Dサイドプラットフォーマーゲームに取り組んでいます。私はこれまでにいくつかのことをしました。私はlibgdxの長方形を使用して基本的な衝突検出に取り組んでいるので、今のところ草のブロックしかないことを考慮して、Javaで単一のブロックの世界を作成しました(ファイルリーダーの準備ができていません)問題は、検出が初めて機能することです。衝突をブロックにスポーンすると、衝突が検出されます。ただし、衝突することなくプレーヤーをブロックの一番上にスポーンすると、プレーヤーは永久に落下します。

これがコードですworld.update();=>

public void update() {

    Iterator<block> cb = Blocks.iterator();
    while (cb.hasNext()) {

        block b = cb.next();
        if (b.getBounds().overlaps(player.getBounds())) {

            if (player.getPosition().x >= b.getPosition().x + 32) {
                //RIGHT
                player.getVelocity().x = 0;
            } else if (player.getPosition().x + 32 <= b.getPosition().x) {
                //Left
                player.getVelocity().x = 0;
            }
            //All Y
            player.getVelocity().y = 0;
        }
        if (!b.getBounds().overlaps(player.getBounds())) {
            player.getVelocity().y = -gravity;
        }

    }
}
4

1 に答える 1

2

whileループは、プレーヤーが交差しないすべてのブロックに重力を適用しています。したがって、10個のブロックがあり、プレーヤーが1個だけ交差する場合でも、重力を9回適用します。重力の変更は、プレーヤーに1回だけ適用する必要があります。

boolean hitSomething = falseループの前にフラグ( )を設定しhitSomething = true、プレーヤーがいずれかのブロックにヒットした場合はそれをtrue()に設定します。次に、ループの後で、hitSomethingfalseの場合、プレーヤーに重力を適用します。

デバッガーを使用してupdateメソッドをステップ実行することは、このような場合にコードが何を行っているかを理解するための良い方法です。StackOverflowがコードをデバッグするのを待つよりも速いはずです。

于 2013-02-11T18:03:53.283 に答える