problema con graphics java

Iniciado por .rn3w., 22 Diciembre 2015, 05:13 AM

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

.rn3w.

hola de nuevo y gracias por su ayuda !!!

vuelvo con otra duda, como puedo animar a varios objetos con movimiento simultaneamente???

.rn3w.

como puedo animar dos graficos al mismo tiempo?

intente pero lo que pasa es que se anima uno primero y luego el otro

ayudaaaaaaaaa porfavor

crack81

En el evento paint puedes poner ahi tus dos objetos a animar y lo  metres dentro de un bucle y llamas al repaint y para estor moviendo los objetos animados obviamente tu defines como se movera cada objeto ejemplo le puedes asignar unas coordenadas a cada a animacion y segun se llame a repaint podras ver las dos animaciones como si lo hicieran en paralelo
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

.rn3w.

gracias gracias por responder

lo que pasa es que la animacion tiene sleep(seg) entonces lo que sucede es que primero hace la primera animacion y luego se activa la segunda


como podria solucionarlo?

crack81

pues lo  primero que se me viene a la mente es usar hilos pero mejor muestra tu codigo a lo mejor se puede implementar de otra forma.
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

.rn3w.

#15
Cita de: 0xFer en 23 Diciembre 2015, 01:28 AM
¿Pero por qué no quieres utilizar hilos?, bueno de todos modos he modificado el código de @crack18 para que funcione sin hilos:
Código (java) [Seleccionar]

public class AyudaForo extends JPanel{

   private static int xinicial = 0, yinicial = 0;
   private static int xfinal = 0, yfinal = 0;
   private static boolean terminar = false;
   private static final byte tamanoPelota=30;
   public static AyudaForo animacion = new AyudaForo(0,0,200,200);

   public AyudaForo(int xinicial, int yinicial, int xfinal, int yfinal) {
       this.xinicial = xinicial;
       this.yinicial = yinicial;
       this.xfinal = xfinal;
       this.yfinal = yfinal;
   }

   public void paint(Graphics g) {
       super.paint(g);
       pintarPunto(g, xinicial, yinicial);
   }

   public void pintarPunto(Graphics g2, int x, int y) {
       g2.setColor(Color.blue);
       g2.fillOval(x, y, tamanoPelota, tamanoPelota);
   }

   public static void run() {

       while (!terminar) {
           xinicial++;
           yinicial++;
           if (xinicial == xfinal && yinicial == yfinal) {
               break;
           }
           try {
               Thread.sleep(10);
           } catch (InterruptedException ex) {
               ex.printStackTrace();
           }
           animacion.repaint();
       }
   }

   public static void main(String[] args) throws InterruptedException {

       JFrame ventana = new JFrame("animacion corriendo");
       ventana.setBounds(0, 0, 500, 500);
       ventana.add(animacion);
       ventana.setVisible(true);
       ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       run();
       System.out.println("Hilo terminado");

   }

}


en el método run hay dos variables xinicial,yinicial y son las coordenadas del punto, o sea que dentro de ese método debes implementar tu algoritmo para dibujar.

Código (java) [Seleccionar]

public static void run() {
          //Aquí utiliza tu algoritmo para ir modificando las variables que te había mencionado

           try {
               Thread.sleep(10);
           } catch (InterruptedException ex) {
               ex.printStackTrace();
           }
           animacion.repaint();
       
   }


debes llamar a repaint cada vez que hayas desplazado el punto, en el ejemplo sólo se llama una vez.

.rn3w.

como puedo detener y luego seguir con la animacion?

0xFer

#17
No logro comprender tu pregunta, ¿Quieres hacer algo como esto?

Código (java) [Seleccionar]
if(AnimacionActiva == true){
   ActualizarDatosDeObjetos();
   DibujarObjetos();
}


En el método paint puedes poner un condicional así;

Código (java) [Seleccionar]
public void paint(Graphics g) {
   super.paint(g);
   if( AnimacionActiva == true )    
       pintarPunto(g, xinicial, yinicial);
}


El mismo condicional debe ir en la parte donde actualizar las coordenadas o los datos de los objetos que dibujas. luego con AnimacionActiva = false; haces que todo se detenga, pero eso como que tiene más sentido si utilizas hilos, aprende a utilizarlos, para hacer juegos y animaciones son muy importantes.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

.rn3w.

al momento de activar la animacion con el boton Enter  solo muestra el inicio y el final de la animacion que prodra ser el error?

este es mi codigo

Código (java) [Seleccionar]
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class AyudaForo extends JPanel{

    private static int xinicial = 0, yinicial = 0;
    private static int xfinal = 0, yfinal = 0;
    private static boolean estado = true;
    private static final byte tamanoPelota=30;
    public static AyudaForo animacion = new AyudaForo(0,0,200,200);

    private KeyListener listener;

    public AyudaForo(int xinicial, int yinicial, int xfinal, int yfinal) {
        this.xinicial = xinicial;
        this.yinicial = yinicial;
        this.xfinal = xfinal;
        this.yfinal = yfinal;
         listener = new MyKeyListener();
        addKeyListener(listener);
        setFocusable(true);
    }

    public void paint(Graphics g) {
        super.paint(g);
        pintarPunto(g, xinicial, yinicial);
    }

    public void pintarPunto(Graphics g2, int x, int y) {
        g2.setColor(Color.blue);
        g2.fillOval(x, y, tamanoPelota, tamanoPelota);
    }

    public static void run() {

        while (estado) {
            xinicial++;
            yinicial++;
            if (xinicial == xfinal && yinicial == yfinal) {
                break;
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            animacion.repaint();
        }
    }
     public class MyKeyListener implements KeyListener {

        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
           
            if ("Intro".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
                estado = true;
                run();
            }
            if ("Q".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
                estado = false;
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    }

    public static void main(String[] args) throws InterruptedException {

        JFrame ventana = new JFrame("animacion corriendo");
        ventana.setBounds(0, 0, 500, 500);
        ventana.add(animacion);
        ventana.setVisible(true);
        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        System.out.println("Hilo terminado");

    }

}


con la tecla Q para la animacion

0xFer

El problema es que el EDT(Event Dispatch Thread) se queda atendiendo el evento del teclado( cuando se presiona "Intro") y como también es el que se encarga de pintar la ventana entonces hay que esperar a que termine el código del keyPressed y después pintar. La solución es que el código dentro del keyPressed debe lanzar un hilo para que el EDT se desocupe;

Código (java) [Seleccionar]
@Override
        public void keyPressed(KeyEvent e) {

            if ("Intro".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
                estado = true;
                Runnable miRunnable = new Runnable()
                {
                    public void run()
                    {
                        try
                        {
                            animacion.run();
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                 };
               
                 Thread hilo = new Thread (miRunnable);
                 hilo.start();
     
            }
            if ("Q".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
                estado = false;
            }
        }


Si quieres saber más sobre el EDT
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}