1

静止しているが、砲塔を動かしてミサイルを発射する戦車を作成する必要があります。

これは私にとって初めての Android アプリケーションであり、ゲーム開発も行っていないため、いくつかの問題に遭遇しました...

ここで、LunarLander サンプル コードの Android チュートリアルを読んで、タンクと移動砲塔を作成しました。したがって、このコードは LunarLander コードに基づいています。

しかし、ミサイルの発射に問題があり、SPACE ボタンが押されています。

private void doDraw(Canvas canvas) {

canvas.drawBitmap(backgroundImage, 0, 0, null);
// draws the tank
canvas.drawBitmap(tank, x_tank, y_tank, new Paint());
// draws and rotates the tank turret
canvas.rotate((float) mHeading, (float) x_turret + mTurretWidth, y_turret);
canvas.drawBitmap(turret, x_turret, y_turret, new Paint());

// draws the grenade that is a regular circle  from ShapeDrawable class
bullet.setBounds(x_bullet, y_bullet, x_bullet + width, y_bullet + height);
bullet.draw(canvas);

}

UPDATE GAME メソッド

private void updateGame() throws InterruptedException {

long now = System.currentTimeMillis();

if (mLastTime > now) 
return;
double elapsed = (now - mLastTime) / 1000.0;
mLastTime = now;


// dUP and dDown, rotates the turret from 0 to 75 degrees.
if (dUp)
mHeading += 1 * (PHYS_SLEW_SEC * elapsed);

if (mHeading >= 75) mHeading = 75;

if (dDown)
mHeading += (-1) * (PHYS_SLEW_SEC * elapsed);
if (mHeading < 0) mHeading = 0;


if (dSpace){
//  missile Logic, a straight trajectorie for now
x_bullet -= 1;
y_bullet -= 1;

}

}

ゲームを実行するメソッド run...

public void run() {
            while (mRun) {
                Canvas c = null;
                try {
                    c = mSurfaceHolder.lockCanvas(null);
                    synchronized (mSurfaceHolder) {
                        if (mMode == STATE_RUNNING) 
                         updateGame();
                        doDraw(c);
                    }
                } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } finally {
                    // do this in a finally so that if an exception is thrown
                    // during the above, we don't leave the Surface in an
                    // inconsistent state
                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }

問題は、砲塔から画面の最後まで SPACE キーを 1 回押すだけで弾丸が発射されるようにするにはどうすればよいかということです。

ここで私を助けてくれませんか、私はここで暗闇の中にいるようです...

ありがとう、

ニクサ

4

1 に答える 1

0

コメントから、あなたの問題は、弾丸を放物線で動かしてよりリアルに見せたいということのように思えます。でソリューションの半分が得られdistance = time * velocityますが、 も必要velocity = time * accelerationです。各更新でこれが必要です:

x_bullet += elapsed * vx_bullet;
y_bullet += elapsed * vy_bullet;
vx_bullet += elapsed * ax_bullet;  // ax_bullet = 0 unless you want simple wind resistance
vy_bullet += elapsed * ay_bullet;  // ay_bullet = gravity

重力定数は、グラフィック スケールによって異なります。実生活では 9.8 m/s^2 ですが、1 メートルあたりのピクセル数に応じて調整する必要があります。速度ベクトルは、戦車の初速に従って初期化されます。初速が に保存されmuzzle_vel、正の x 軸からの砲塔の角度が である場合、次のthetaようになります。

vx_bullet = muzzle_vel * Math.cos(theta);
vy_bullet = muzzle_vel * Math.sin(theta);

軌道をより現実的にするために多くの微調整がありますが、これで始めることができます。

于 2011-03-23T02:33:17.020 に答える