Aprendiendo a desplazar imagenes

Iniciado por Z@@K, 15 Julio 2014, 19:07 PM

0 Miembros y 1 Visitante están viendo este tema.

Z@@K

Hola de nuevo!!!

Bueno, les explico, yo soy nuevo programando en Java y me interesa mucho adentrarme en el mundo de la programación... Además ya pasé con éxito la prueba de iniciación en la creación de mi propio "Hola mundo!" así que no me detendré ahora.

Estoy aprendiendo a crear graficos 2D y mostrarlos en un JPanel el cual se agrega a un JFrame, bla bla bla etc

Bueno, si quiero utilizar el teclado de direcciones del pc (arriba, abajo, izquierda y derecha) para darle movimiento a uno de estos graficos (o a una imagen insertada) he aprendido a utilizar la interfaz "KeyListener" junto con la clase "KeyEvent" y una que otra linea de código.

El problema que encuentro en esto es que si mantengo una tecla de dirección presionada el método keyPressed se activa una vez, luego hace una pausa y luego se activa continuamente.

¿como puedo hacer para que desde el momento que que presiona la tecla y la mantenga presionada el método keyPressed se mantenga dando una respuesta continua y no haga esa odiosa pausa?

Que pasen un agradable día.
Gracias por la atención.

Saludos!

Zoik

Hola, prueba con alguno de los demás métodos de KeyEvent

Código (java) [Seleccionar]

public void keyReleased(KeyEvent e) {
//detecta evento al soltar tecla
}

public void keyTyped(KeyEvent e) {
//detecta evento al tocar tecla
}

Z@@K

Hola!!!
Soy yo nuevamente : P
Gracias Zoik!, pero fijate que ya solucioné este problema : )

Explicaré como fue solucionado para todos los novatos que se pasen por aquí.

Yo estaba tratando de hacer un juego llamado Ping Pong en Java, de un solo jugador...
ustedes saben, aquel viejo juego de una pelotita revotando por todos lados y un pedazo de tabla intentando impedir que caiga en lo mas profundo de la ventana...

Bueno, el caso es que al fin había terminado el juego por mi propia cuenta (estaba bien feliz), el código es el siguiente:

Código (java) [Seleccionar]

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.event.KeyEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class PingPong extends javax.swing.JPanel implements java.awt.event.KeyListener{
    int arriba;
    int abajo;
    int x;
    int y;
    boolean continuar = true;
    Mover motor;
    PingPong(){
        motor= new Mover();
        x=18;
        y=98;
        arriba=82;
        abajo=arriba + 40;
        setFocusable(true);
        addKeyListener(this);
    }
   
    public static void main(String[] agrs){
        JFrame isaac = new JFrame("Hola");
        PingPong daniel = new PingPong();
        isaac.add(daniel);
        isaac.setSize(420, 250);
        isaac.setDefaultCloseOperation(3);
        isaac.setVisible(true);
        daniel.motor.start();
       
    }
   
    public void keyReleased(KeyEvent e) {}
   
    public void keyTyped(KeyEvent e) {}
   
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_DOWN)
            arriba+=18;
        if(e.getKeyCode()==KeyEvent.VK_UP)
            arriba-=18;
        if(arriba<10)
            arriba=10;
        if(arriba>162)
            arriba=162;
        abajo=arriba + 40;
        repaint();
    }
   
    public void paint(Graphics g){
        super.paint(g);
        g.fillRect(0, 0, 400, 250);
        g.clearRect(0, 10, 382, 192);//Area de movimiento
        g.fillRect(10, arriba, 8, 40);//La tabla
        g.fillRect(x, y, 8, 8);
        //System.out.println(arriba + ", " + abajo);
       
    }
    class Mover extends Thread{
        int velocidad;
        int movimientoX;
        int movimientoY;
        int countLoop=0;
        Mover(){
           
            velocidad=10;
            movimientoX=4;
            movimientoY=-4;
        }
        public void run(){
            while(continuar){
                try{
                    Thread.currentThread().sleep(velocidad);
                    moverBola();
                    repaint();
                    countLoop++;
    System.out.println(countLoop*velocidad/1000);
                    if(x+8<=0){
                        JOptionPane.showMessageDialog(null, "Game Over...\nYou last for " + countLoop*velocidad/1000 + " Seconds!");
                        this.stop();
                    }
                       
                }
                catch (InterruptedException ex) {
                        Logger.getLogger(PingPong.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
       
       
        public void moverBola(){
            y+=movimientoY;
            x+=movimientoX;
            check();
        }
       
        public void check(){
            if(y<=10 || y>=194)
                movimientoY=-movimientoY;
            if(x==374)
                movimientoX=-movimientoX;
            if(x==18 && movimientoX<0)
                if(y<abajo && (y+8)>arriba){
                    movimientoX=-movimientoX;
                }
        }
       
       
    }
}


//La linea 88 y 89 de este código no las entiendo, pero siempre las utilizo despues
//del try cuando aplico ese Thread por que
//si no el IDE me dice que las agregue (Las utilizo por que las aprendí de otro
//código de un juego que me encontré hace un par de semanas)

Yo se que visualmente el jueguito está horrible jajaja, pero yo lo hice solo para poner en practica lo aprendido y no le puse mucha importancia a como quedara visualmente...

bueno, el problema era que yo puse en el código que cada vez que el jugador presionara las teclas de arriba o abajo se sumaría o restarían 18 a la posición vertical de la tabla, pero me dí cuenta probando el juego que si el jugador mantenía la tecla de arriba o de abajo presionada con el objetivo de que la tabla corriera continuamente, la tabla primeramente daba un paso y hasta después corría continuamente : (

En ese entonces fue cuando les consulté que podía hacer...
Hasta que en una pagina encontré que explicaban como hacer exactamente este jueguito con el nombre de: "Minitenis" y pude verificar como aplicaron otra lógica para que el movimiento de la tabla sea siempre continuo.

Les comparto la página donde encontré la creacion de "Minitenis":

http://edu4java.com/es/game/game0.html

La lógica que aplican en el desarrollo de este sencillo juego es que cuando el jugador presiona arriba o abajo, el código que está en el método "keyPressed" cambia la cantidad que se está sumando continuamente (mediante un while) a la posición vertical de la tabla de cero a uno o menos uno (en dependencia de si se aprieta arriba o abajo) y el método "keyReleased" convierte esta cantidad nuevamente a cero...

si no me entendieron pueden ver el código en el link que les mostré, y verán lo ordenado y genial que está comparado con el mío.... jajajaja... bueno, con algo se empieza ;)

Saludos a todos!!!!!
Muchas gracias por su atención.