3

画面をタップ/クリックするとキャラクターが飛ぶシンプルなゲームを開発しています。タップし続けるとキャラクターが飛んでいきます (フラッピー バードやジェット パックに似たものもあります)。しかし、ジェットパックのように、動きはまったくスムーズではありません。

これが私のコードのサンプルです。

変数の初期化

maxSpeedLimit  = spriteHeight/10;
speed = maxSpeedLimit/2; //half of the max speed

タッチイベント

public void onTapOrClick(int action) {
    if (action == UP) {
        sprite.up= true;
    }
    else {
        sprite.up = false;
    }
}

ゲームループから呼び出されるスプライトの更新

public void update() {
    if (up) {
        y -= speed; //fly up
    }
    else {
        y += speed;// fly down
    }
    if (speed < maxSpeedLimit) {
        speed++; // May be cheep way to add **velocity/acceleration**
    }   
}

speed++速度を上げるのはスムーズな方法ではないと思いますが、よくわかりませんが、インクリメントに時間関連の変数を追加すると改善される可能性があります。さらに、重力を追加するとより現実的になりますが、方法がわかりません。ブログをほとんど読んだことがありません。最初に、正しいキーワードで検索することができません。次に、プラットフォーム関連のコードが含まれているため、ブログが非常に理解しにくいことです。助けてください。

私はこのゲームを Android で作成していますが、任意の言語 (HTML5、javascript、Android、Flash など) のコードが受け入れられます。

Q: ユーザーがタップまたはクリックして離すと落下するオブジェクト (スプライト) に加速度と重力を追加するにはどうすればよいですか? ジェットパックジョイライドに似たもの(上下移動のみ)

更新しました

@scotttがアドバイスした後dY += gravity + flapp、重力を感じることができるようになりましたが、2つの問題があります。

  1. 私の画面の高さは480で、スプライトの速度が上がり続けると思うので、スプライトはすぐに上(y = 0)と下(y = 480)の境界に触れます。
  2. 地面に触れると、スプライトを空中に持ち上げるのに非常に時間がかかるように見えます。

y の場所に常に追加されている dY に何らかの制限があるはずです。

ここに更新コードがあります。

int downSpeed = 1;
int upSpeed = -2;
int dy = 0;
private void update() {
    if (flapping) {
        upSpeed = -2; //if flying speed
    }
    else {
        upSpeed = 0;
    }

    dy  +=  downSpeed + upSpeed;
    if (dy < -10) {
        dy = -10; //limit for rise speed
    }
    else if (dy > 8) {
        dy = 8; //limit for gravity
    }
    y += dy; // add value in y location
    if (y > GAME_HEIGHT - sprite.getHeight()) {
        y = GAME_HEIGHT  - sprite.getHeight(); // reset y, if touch ground
        dy = 0; //reset speed, otherwise it make it very heavy to rise
    }
    else if ( y < 0) {
        y = 0; //reset y if touch upper limit
        dy = 0; //reset speed, otherwise take much time to fall (as it would be in negative)
    }
}
4

1 に答える 1

3

重力はただの下向きの加速度です。加速度は、速度の単なる変化です (指示された速度)。以下の説明では、話を簡単にするために次の前提を置きます。

  • あなたの水平速度は一定です
  • 入力タッピングは「フラッピング」と呼ばれます
  • 重力は正常に動作します
  • 科学的アプローチではなく単純化/言葉遣いは、私たちの目的には問題ありません

更新ループを通過するたびに、さまざまな加速度をすべて合計し、その合計を現在の速度に加算する必要があります。あなたの状況では、重力と場合によっては羽ばたきの 2 つの加速が考えられます。重力は一定で負の値 (下向き) ですが、正 (上向き) の場合はタッピング中にのみ羽ばたきが発生します。

重力をループごとに -10 ピクセルに設定し、タップをループごとに +25 ピクセルに設定し、最初の高さを 500 に設定します。最初の定義は次のとおりです。

static final int gravity = -10;   // constant downward acceleration
static final int flapping = 25;   // upward acceleration whenever isFlapping is true

Boolean isFlapping = false;   // Is the bird flapping

int dY = 0; // current vertical speed
y = 500;    // current vertical position

フラッピングなしでループを通過するたびに、速度計算は次のようになります。

dY += gravity + flapping;

したがって、最初の速度計算はdY = 0 + (-10) + 0 = -10. 2回目dy = -10 + (-10) + 0 = -20。5回目dy = -40 + (-10) = -50。通過するたびに、下降速度は以前よりも 10 増加します。

高さはシンプル。通過するたびに、高さは垂直加速度の量だけ変化します。そう:

y += dY;

したがって、最初の高さはy = 500 + (-10) = 490. 2回目 y = 490 + (-20) = 470。そして5回目、y = 400 + (-50) = 350. 通過するたびに落下率が増加するため、鳥ははねるまでどんどん急降下します。

そこで羽ばたきの出番です。羽ばたきが発生しているループを通過するたびに、dY の計算に +25 が適用されます。鳥が 6 回目の繰り返しで羽ばたき始めたとします。dy の計算は でdy = -50 + (-10) + 25 = -35、高さは ですy = 350 + (-35) = 315。次回通過するdy = -35 + (-10) + 25 = -20と、高さは になりますy = 350 + (-20) = 295。まだ落ちていますが、もっとゆっくりです。その後の時間:dy = -20 + (-10) + 25 = -5それとy = 295 + (-5) = 290. その後の時間は、最終的に高さの増加を示していdy = -5 + (-10) + 25 = 10ますy = 290 + 10 = 300

とはいえ、満足のいく結果が得られるまでは、間違いなく数字で遊ぶ必要があります。

TLDR: 重力と羽ばたきを使用して高さを直接変更したくありません。代わりに、重力と羽ばたきを使用して各反復の速度を計算し、それを使用して高さを調整します。

于 2014-03-19T10:49:11.720 に答える