Как приостановить движущийся объект в Android - PullRequest
0 голосов
/ 07 декабря 2011

Я занимаюсь разработкой игры для Android. в этом у меня есть два движущихся изображения на экране, я могу перетаскивать эти изображения, но мое дальнейшее требование - приостановить изображение, когда я касаюсь изображения. Я не нахожу события, чтобы приостановить изображение, а затем возобновить движение в том же месте, где было приостановлено изображение.

Может ли любое тело сказать мне решение. Спасибо.

Я использую onTouch для перетаскивания изображения.

public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            Parcelable state=null;
            // delegating event handling to the droid
            droid1.handleActionDown((int)event.getX(), (int)event.getY());
            droid2.handleActionDown((int)event.getX(), (int)event.getY());
            // check if in the lower part of the screen we exit
            if (event.getY() > getHeight() - 50) {

                thread.setRunning(false);
                ((Activity)getContext()).finish();
            } else {
                Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY());

            }
        } if (event.getAction() == MotionEvent.ACTION_MOVE) {
            // the gestures
            if (droid1.isTouched()) {
                // the droid was picked up and is being dragged
                droid1.setX((int)event.getX());
                droid1.setY((int)event.getY());

            }
            if (droid2.isTouched()) {
                // the droid was picked up and is being dragged
                droid2.setX((int)event.getX());
                droid2.setY((int)event.getY());
            }

        } if (event.getAction() == MotionEvent.ACTION_UP ) {
            // touch was released
            if (droid1.isTouched()) {
                droid1.setTouched(false);
            }
            if (droid2.isTouched()) {
                droid2.setTouched(false);
            }
        }


        return true;
    }

1 Ответ

0 голосов
/ 07 декабря 2011

Исходя из вашего кода и ссылки в вашем комментарии, есть несколько вещей, которые необходимо изменить для достижения вашей цели. Прежде всего, вам нужно будет уметь различать одно касание и движение перетаскивания. Первый «приостановит» изображение / дроида, а второй позволит вам перетаскивать его.

Один из способов сделать это - сохранить флаг, который определяет действие. Примерно так:

private boolean mIsDragging = false;

public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // delegating event handling to the droid
        droid1.handleActionDown((int)event.getX(), (int)event.getY());
        droid2.handleActionDown((int)event.getX(), (int)event.getY());
        ...
        mIsDragging = false;
    } if (event.getAction() == MotionEvent.ACTION_MOVE) {
        // the gestures
        if (droid1.isTouched()) {
            // the droid was picked up and is being dragged
            droid1.setX((int)event.getX());
            droid1.setY((int)event.getY());
        }
        if (droid2.isTouched()) {
            // the droid was picked up and is being dragged
            droid2.setX((int)event.getX());
            droid2.setY((int)event.getY());
        }
        mIsDragging = true;  
    } if (event.getAction() == MotionEvent.ACTION_UP ) {
        if (!mIsDragging) {
            // Not dragging means a 'click', thus toggle pausing
            if (droid1.isTouched()) {
                droid1.setPaused(!droid1.isPaused());
            }
            if (droid2.isTouched()) {
                droid2.setPaused(!droid2.isPaused());
            }
        }
        // Always reset on up action
        if (droid1.isTouched()) {
            droid1.setTouched(false);
        }
        if (droid2.isTouched()) {
            droid2.setTouched(false);
        }
        mIsDragging = false;
    }
    return true;
}

Чтобы фактически остановить изображение / дроида от дальнейших движений, вы должны добавить некоторый метод, чтобы установить скорость в горизонтальном и вертикальном направлении на «0». Кроме того, вы можете установить флаг, который указывает, хотите ли вы обновить позицию.

В зависимости от того, какой подход вы используете, вам также может потребоваться изменить логику обновления, чтобы учесть состояние «приостановлено». Если вы просто установите скорость (0,0), то вам, вероятно, не придется ничего делать, так как смещение приведет к «0» в обоих направлениях.

В фрагменте кода я предполагаю, что есть методы setPause (boolean) и isPaused (). Они должны работать либо с флагом, либо со значениями скорости напрямую.

Например, используя флаг:

private boolean mIsPaused = false;

public void setPaused(boolean pause) {
    mIsPaused = pause;
}

public boolean getPaused() {
    return mIsPaused;
}

...

public void update() {
    // Only update if we're not dragging and not 'paused'
    if (!touched && !mIsPaused) {
        x += (speed.getXv() * speed.getxDirection());
        y += (speed.getYv() * speed.getyDirection());
    }
}

Или напрямую, используя значения скорости:

private Speed mSpeed = new Speed(1,1);

public void setPaused(boolean pause) {
    pause ? mSpeed.setSpeed(0,0) : mSpeed.setSpeed(1,1);
}

public boolean getPaused() {
    return mSpeed.getX() == 0 && mSpeed.getY() == 0;
}

...

public void update() {
    // No change necessary as multiplying by '0' results in a zero displacement
}

Обратите внимание, что я не тестировал ни один из кодов и не собираюсь быть полным примером.

...