8

私はJ2MEで作業しています。ゲームループで次のことを行っています:

public void run() {
        Graphics g = this.getGraphics();
        while (running) {
            long diff = System.currentTimeMillis() - lastLoop;
            lastLoop = System.currentTimeMillis();
            input();
            this.level.doLogic();
            render(g, diff);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                stop(e);
            }
        }
    }

つまり、これは単なる基本的なゲームループです。doLogic()関数はシーン内のキャラクターのすべてのロジック関数をrender(g, diff)呼び出し、シーンanimateChar上のすべてのキャラクターの関数を呼び出します。これに続いてanimChar、Character クラスの関数が画面内のすべてを次のように設定します。

protected void animChar(long diff) {
        this.checkGravity();
        this.move((int) ((diff * this.dx) / 1000), (int) ((diff * this.dy) / 1000));
        if (this.acumFrame > this.framerate) {
            this.nextFrame();
            this.acumFrame = 0;
        } else {
            this.acumFrame += diff;
        }
    }

これにより、マシンがサイクルからサイクルへと移動するのにかかる時間に従って、すべてが移動する必要があることが保証されます (これは電話であって、ゲーム機ではないことを思い出してください)。この動作を実現する最も効率的な方法ではないことは確かなので、コメントで私のプログラミング スキルに対する批判を完全に受け入れますが、ここで私の問題: キャラクターをジャンプさせるとき、私がすることは、彼のdyを負の値、たとえば -200 に設定し、ブール値のジャンプを true に設定すると、キャラクターが上昇します。次に、この関数を呼び出しcheckGravity()て、上昇するすべてのものを下降させる必要があることをcheckGravity確認し、キャラクターが存在するかどうかもチェックしますプラットフォームを超えているので、時間を節約するために少し省略します。

public void checkGravity() {
        if (this.jumping) {
            this.jumpSpeed += 10;
            if (this.jumpSpeed > 0) {
                this.jumping = false;
                this.falling = true;
            }
            this.dy = this.jumpSpeed;
        }
        if (this.falling) {
            this.jumpSpeed += 10;
            if (this.jumpSpeed > 200) this.jumpSpeed = 200;
            this.dy = this.jumpSpeed;
            if (this.collidesWithPlatform()) {
                this.falling = false;
                this.standing = true;
                this.jumping = false;
                this.jumpSpeed = 0;
                this.dy = this.jumpSpeed;
            }
        }
    }

したがって、問題は、この関数がdiffに関係なくdyを更新し、キャラクターが遅いマシンでスーパーマンのように飛ぶようにすることです。キャラクターがジャンプしているときに速度が低下するようにdiff係数を実装する方法がわかりませんゲーム速度に比例する方法。誰でもこの問題を解決するのを手伝ってもらえますか? または、J2ME で正しい方法で 2D ジャンプを作成する方法を教えてください。

4

4 に答える 4

5

経過時間に基づいてjumpSpeedを調整するべきではありませんか?つまり、おそらく速度が-75 /秒変化するので、diffはjumpSpeedに適用される変化量の重みになるはずです。

したがって、diffをcheckGravに渡して、次のようにします。jumpSpeed + =(diff *(rate_per_second))/ 1000;

(ミリ秒単位の差分を想定)

(理想的には、これは実際の重力のようになります:D)

于 2009-05-29T00:20:44.457 に答える
3

すべての定数をdiffでスケーリングしないのはなぜですか?

ちなみに、これを言うのは恥ずかしいのですが、キャラクターが上がるよりも下がる方が重力が2倍強いコマーシャルゲームに取り組みました。何らかの理由で、人々はこれを好みました。

于 2009-05-29T00:14:16.123 に答える
0

これは、ジャンプの数学というよりも、ゲームデザインに関する質問のようです。異なるプロセッサで実行されているゲームでは、1つのゲームの実行速度が速くなり、他のゲームでは実行速度が遅くなることがよくあります(したがって、ゲーム全体の速度が変わります)。ゲームの一般的な慣習はわかりませんが、自家製の2Dゲームを作成するときはいつでも(作成するのが楽しい)、ゲームダニの概念を持っていました。より高速なマシンの場合

long diff = System.currentTimeMillis() - lastLoop;
lastLoop = System.currentTimeMillis();

低くなります。ゲームがほとんどのマシンで同じ速度で実行されるように、待機時間は差分から導き出されます。また、ゲームの速度がグラフィックスに依存しないように、別のスレッドにrenderメソッドを配置します。

于 2009-05-29T00:25:38.147 に答える
0

このような式を与えることができます (どこでも使用します)。X は、ゼロから始まり、ジャンプの長さで終わるパラメーターです。誰かに高さ (H) と長さ (L) でジャンプさせたい場合、ジャンプの関数は次のようになります (見た目が変わることはありません)。

y = マイナス (累乗 (x - ジャンプの長さを 2 で割った値) に 4 を掛け、ジャンプの高さを掛けます) 長さの累乗で割り、最後にジャンプの高さを追加します。

y = -(xl/2)(xl/2)*4*h/(l*l) + h

また、ジャンプするオブジェクトを何かに着地させたい場合は、新しい X をすべてチェックして、それがプラットフォームにほぼ立っているかどうかを確認し、何かの上に立っている場合は、ただ停止させずに Y 位置を正確に等しくすることができます。プラットフォームの Y。

Flash など、y 軸が反転しているベースを使用している場合は、関数の出力に -1 を掛けます。

于 2010-04-22T13:19:00.543 に答える