2D игра - Задача о стрельбе из ракет

Я должен сделать танк, который стоит на месте, но двигает башню и стреляет ракетами.

Поскольку это мое первое приложение для Android, и я не занимался разработкой игр, я столкнулся с несколькими проблемами...

Теперь я сделал танк и движущуюся башню после того, как прочитал руководство по Android для примера кода LunarLander. Итак, этот код основан на коде LunarLander.

Но у меня проблемы с запуском ракеты, когда нажата кнопка ПРОБЕЛ.

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

}

ОБНОВИТЬ метод ИГРЫ

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

Итак, вопрос: как сделать так, чтобы пуля стреляла одним нажатием клавиши ПРОБЕЛ от турели до конца экрана?

Не могли бы вы помочь мне здесь, я, кажется, здесь в темноте...

Спасибо,

Никса


person Nick    schedule 18.01.2011    source источник
comment
вы знаете gamedev.stackexchange.com?   -  person nkint    schedule 18.01.2011
comment
В чем проблема? Ваш триггер (dSpace) не работает? Или пули не видно? Или траектория неверная?   -  person Beta    schedule 19.01.2011
comment
Проблема в том, что dSpace работает, но я не могу заставить пулю двигаться от башни к краю экрана с помощью метода обновления.   -  person Nick    schedule 19.01.2011
comment
Продолжайте, что происходит с x_bullet и y_bullet? И какие значения эти переменные имеют изначально, и какие значения они должны иметь, когда пуля находится у края экрана?   -  person Beta    schedule 19.01.2011
comment
Изначально x_bullet и y_bullet такие же, как x_turret и y_turret... и при попадании в край экрана они должны быть равны x_bullet = 0, y_bullet, куда бы он ни попал по вертикали, в зависимости от угла поворота турели. Я знаю, что расстояние = время * скорость, поэтому я сделал x_bullet -= BULLET_SPEED * истекло... это работает, но не очень хорошо анимируется...   -  person Nick    schedule 19.01.2011
comment
Это слишком быстро, я хочу анимировать его медленнее, чтобы на экране действительно показывалась траектория пули ракеты...   -  person Nick    schedule 19.01.2011
comment
Таким образом, пуля действительно перемещается к краю экрана. Вы должны приложить больше усилий, чтобы разобраться с этими вещами самостоятельно, прежде чем публиковать.   -  person Beta    schedule 20.01.2011


Ответы (1)


Судя по комментариям, ваша проблема в том, что вы хотите, чтобы пуля двигалась по параболе, чтобы она выглядела более реалистично. У вас есть половина решения с 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 м/с ^ 2, но вам придется настроить это в соответствии с вашими пикселями на метр. Вектор скорости будет инициализирован в соответствии с начальной скоростью вашего танка. Если начальная скорость хранится в muzzle_vel, а угол поворота башни от положительной оси x равен theta, то у вас будет

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

Есть много настроек, чтобы сделать траекторию более реалистичной, но это должно помочь вам начать.

person Alex    schedule 23.03.2011