画面をタップ/クリックするとキャラクターが飛ぶシンプルなゲームを開発しています。タップし続けるとキャラクターが飛んでいきます (フラッピー バードやジェット パックに似たものもあります)。しかし、ジェットパックのように、動きはまったくスムーズではありません。
これが私のコードのサンプルです。
変数の初期化
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つの問題があります。
- 私の画面の高さは480で、スプライトの速度が上がり続けると思うので、スプライトはすぐに上(y = 0)と下(y = 480)の境界に触れます。
- 地面に触れると、スプライトを空中に持ち上げるのに非常に時間がかかるように見えます。
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)
}
}