2009-05-29 6 views
8

でジャンプの数学は、私は私のgameloopは、次の操作を行ってあります私はJ2MEで働いていた2Dゲーム

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); 
      } 
     } 
    } 

だから、それだけで基本的なgameloopだ、doLogic()機能は、すべての論理関数を求めてシーン内の文字とrender(g, diff)がシーンのすべての文字のanimateChar関数を呼び出すの、この次、CharacterクラスでanimChar機能は、このように画面内のすべてを設定しています

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に設定して、ブール値をにジャンプさせると、文字が上がります。次に、この関数が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; 
      } 
     } 
    } 

、問題は、この機能はDYのを更新していること、ですにかかわらずdiffに関係なく、スローマシンではスーパーマンのように飛んでいますが、diffの要因を実装する方法はわかりません。そのため、キャラクターがジャンプしているときに、スピードがゲーム速度。誰も私がこの問題を解決する手助けはできますか?または、私にどのように指針を与えるJ2MEの2Dジャンプを正しい方法で行う

+0

これは長い質問です。本質を引き出すことができます。 –

+0

サイドの問題として、あなたは本当にJ2MEゲームで100ティック/秒をしたいですか?私がsbが言及したと思うように、あなたは本当に毎回一定の持続時間ではなく、次の所望の起床ポイントまで眠るべきです。 –

答えて

5

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

したがって、diffをcheckGravに渡して、jumpSpeed + =(diff *(rate_per_second))/ 1000のようにします。 (ミリ秒単位で差分を仮定して)

は(理想的には、これは本物の重力のようにそれをするだろう:D)

+0

これは完全に問題を解決した、私はユニットテストを行い、すべての携帯電話はジャンプの同様のピーク高度をbenched!私は本当にそれらの物理学の本をもう一度読む必要があります、グレッグのおかげで! – fixmycode

3

diffですべての定数をスケールするのはなぜですか?

ところで、私はこれを言うのは恥ずかしいですが、私は重力が登場人物の2倍の強さであった商用ゲームに取り組んでいました。何らかの理由で、人々はこれを好んだ。

+0

私のupvoteはあなたがそれを作っただけではないという理解に基づいています。 –

+0

ハハ。あなたの懐疑はすばらしいです。ゲームはSegaCDの "Bouncers"でした。私がコモドール64のために書いたCOMPUTE!のガゼットゲームであった "Basketball Sam&Ed"に基づいています。 – Nosredna

+1

私が開発していた時、私は友達とテストして反応を得ました。マリオは、重力が低くなり、彼に「羽」という感じを与えます。人々が物理学を理想化する方法は面白いです。 – fixmycode

0

これはジャンプの数学よりもゲームデザインについての質問の多くのことのようです。異なるプロセッサ上で実行されているゲームでは、1つのゲームがより速く実行され、他のゲームではより遅く実行される(したがって、ゲームの全速度が変化する)という共通の問題です。私はゲームで何が一般的な練習であるか分かりませんが、家庭で作られた2Dゲームを作るたびに(彼らは楽しかったです)、私はゲームチックのコンセプトを持っていました。より高速なマシンで

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

ほとんどのマシンで同じ速度でゲームが実行されるように、待ち時間はdiffから導出されます。私はゲームの速度がグラフィックに依存しないように別のスレッドでレンダリングメソッドを持っています。

+0

待機時間を差分依存にする方法を詳しく説明できますか? – fixmycode

0

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

y =マイナス(パワー(x - ジャンプの長さを2で割った値)に4を掛け、ジャンプの高さで を乗じる)を長さで除算して加算します 最後のジャンプの高さ。

のy = - (XL/2)(XL/2)* 4 * H /(L * 1)+ H

そして、あなたはジャンプのオブジェクトが何かに着陸したい場合は、その後のことができます。プラットフォーム上にほぼ立っている場合は新しいXをすべて確認し、何かに立っている場合は停止させないで、プラットフォームのYと正確に同じY位置にします。

y軸を逆にしたFlashやその他のベースを使用している場合は、関数の出力に-1を掛けます。

関連する問題