Pregunta

Estoy desarrollando un juego de Android. En esto tengo dos imágenes en movimiento en la pantalla, puedo arrastrar estas imágenes, pero mi requisito adicional es detener la imagen cuando toco la imagen. No estoy encontrando ningún evento para detener la imagen, y luego reiniciar el movimiento en la misma posición donde la imagen se ha detenido.

¿Puede algún cuerpo decirme la solución? Gracias.

Estoy usando OnTouch para arrastrar y mover la imagen.

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;
    }
¿Fue útil?

Solución

Según su código y enlace de su comentario, hay algunas cosas que deben cambiarse para lograr su objetivo. En primer lugar, deberá poder diferenciar entre un solo movimiento de grifos y arrastrar. El primero 'pausará' una imagen/droide, mientras que el segundo le permitirá arrastrarla.

Una forma de hacerlo sería mantener una bandera que determine la acción. Algo como esto:

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

Para evitar que la imagen/droide haga más movimientos, debe agregar algún método para establecer la velocidad en dirección horizontal y vertical a '0'. Alternativamente, podría establecer una bandera que indique si desea actualizar la posición.

Según el enfoque que adopta, es posible que también deba cambiar la lógica de actualización para tener en cuenta el estado 'pausado'. Si simplemente elige establecer la velocidad en (0,0), entonces probablemente no tendrá que hacer nada, ya que el desplazamiento dará como resultado '0' para ambas direcciones.

En el fragmento de código, supongo que hay un método setPause (boolean) e ispaused (). Estos deberían funcionar en una bandera o en los valores de velocidad directamente.

Por ejemplo, usando una bandera:

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

O directamente usando los valores de velocidad:

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
}

Tenga en cuenta que no he probado ninguno de los códigos ni tiene la intención de ser un ejemplo completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top