Foro de elhacker.net

Programación => Java => Mensaje iniciado por: bengy en 22 Diciembre 2015, 05:13 am



Título: problema con graphics java
Publicado por: bengy en 22 Diciembre 2015, 05:13 am
quiero mostrar el desplazamiento de un punto hacia un punto final

entonces desarrolle este codigo
Código
  1. public class Point {
  2.  
  3.    public static void putPixel(Graphics g2, int x, int y) {
  4.        Graphics2D g = (Graphics2D)g2;
  5.        g.setColor(Color.black);
  6.        g.drawLine(x, y, x, y);
  7.    }
  8. }



Título: Re: problema con graphics java
Publicado por: crack81 en 22 Diciembre 2015, 06:08 am
Hola puedes dar mas informacion de lo que quieres ya que tengo una idea pero a lo mejor no es lo quieres aconsejo ser mas preciso

segundo no revulevas componentes de awt con los de swing aun que en algunos casos funcione no es lo correcto hay otros detalles pero espero seas mas preciso con la explicacion.


Edito:
Bueno me di a la tarea de mostrar un ejemplo muy burdo espero esto se asemeje a lo que buscas si no lo es hazlo saber

en teoria es un circulo que se mueve de un punto a otro ojo la implentacion es muy simple y tendra sus detalles

Espero alguno moderador agrege las etiquetas geshi por que yo no puedo

public class AnimationFrame extends JPanel implements Runnable {

    private int xinicial = 0, yinicial = 0;
    private int xfinal = 0, yfinal = 0;
    private boolean terminar = false;
    private final byte tamanoPelota=30;

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

    @Override
    public void run() {

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

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

        JFrame ventana = new JFrame("animacion corriendo");
        ventana.setBounds(0, 0, 500, 500);
       
        //le pasamos las coordenas de donde iniciar y las coordeandas donde terminara
        AnimationFrame animacion = new AnimationFrame(0, 0, 200, 200);
        ventana.add(animacion);
        ventana.setVisible(true);
        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Thread t1 = new Thread(animacion);
        t1.start();
        t1.join();
        System.out.println("Hilo terminado");

    }

}



Título: Re: problema con graphics java
Publicado por: bengy en 22 Diciembre 2015, 14:12 pm
no quiero utilizar hilos, no quiero saber nada de hilos ejjeje gracias por entenderme

lo que yo pretendo hacer es que el pixel simule que avance, mi idea es la siguiente:
dibujo un punto
pasa 3 milesegundos y borro
dibujo el punto siguiente
 pasa 3 milesegundos y borro
y asi sucesivamente hasta que llegue al punto final
entonces yo quiero mostrar todo el avance y no solamente el punto final dibujado

nota: mi codigo solo muestra el punto final dibujado


Título: Re: problema con graphics java
Publicado por: 0xFer en 22 Diciembre 2015, 17:55 pm
No veo que se dibuje algo, de todas formas no debes meter algún repaint() dentro del método paint() vamos que así no terminará de pintar.

Te dejo este esqueleto para hacer juegos en java( utiliza hilos), está muy bien hecho: http://javapragmatico.blogspot.mx/2009/04/esqueleto-basico.html


Título: Re: problema con graphics java
Publicado por: bengy en 23 Diciembre 2015, 00:20 am
se dibuja solo el punto final es muy chiquitito
lo modifique comentando el codigo pruebalo porfavor

Código
  1.    class AnimationFrame extends JPanel {
  2.  
  3.  
  4.        public AnimationFrame() {
  5.            setPreferredSize(new Dimension(500, 500));
  6.        }
  7.  
  8.        public void runAnimation() {
  9.            repaint();
  10.        }


Título: Re: problema con graphics java
Publicado por: 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
  1. public class AyudaForo extends JPanel{
  2.  
  3.    private static int xinicial = 0, yinicial = 0;
  4.    private static int xfinal = 0, yfinal = 0;
  5.    private static boolean terminar = false;
  6.    private static final byte tamanoPelota=30;
  7.    public static AyudaForo animacion = new AyudaForo(0,0,200,200);
  8.  
  9.    public AyudaForo(int xinicial, int yinicial, int xfinal, int yfinal) {
  10.        this.xinicial = xinicial;
  11.        this.yinicial = yinicial;
  12.        this.xfinal = xfinal;
  13.        this.yfinal = yfinal;
  14.    }
  15.  
  16.    public void paint(Graphics g) {
  17.        super.paint(g);
  18.        pintarPunto(g, xinicial, yinicial);
  19.    }
  20.  
  21.    public void pintarPunto(Graphics g2, int x, int y) {
  22.        g2.setColor(Color.blue);
  23.        g2.fillOval(x, y, tamanoPelota, tamanoPelota);
  24.    }
  25.  
  26.    public static void run() {
  27.  
  28.        while (!terminar) {
  29.            xinicial++;
  30.            yinicial++;
  31.            if (xinicial == xfinal && yinicial == yfinal) {
  32.                break;
  33.            }
  34.            try {
  35.                Thread.sleep(10);
  36.            } catch (InterruptedException ex) {
  37.                ex.printStackTrace();
  38.            }
  39.            animacion.repaint();
  40.        }
  41.    }
  42.  
  43.    public static void main(String[] args) throws InterruptedException {
  44.  
  45.        JFrame ventana = new JFrame("animacion corriendo");
  46.        ventana.setBounds(0, 0, 500, 500);
  47.        ventana.add(animacion);
  48.        ventana.setVisible(true);
  49.        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  50.        run();
  51.        System.out.println("Hilo terminado");
  52.  
  53.    }
  54.  
  55. }
  56.  

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
  1. public static void run() {
  2.           //Aquí utiliza tu algoritmo para ir modificando las variables que te había mencionado
  3.  
  4.            try {
  5.                Thread.sleep(10);
  6.            } catch (InterruptedException ex) {
  7.                ex.printStackTrace();
  8.            }
  9.            animacion.repaint();
  10.  
  11.    }

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


Título: Re: problema con graphics java
Publicado por: bengy en 23 Diciembre 2015, 02:01 am
pero mi algoritmo lleva while asi que no se incrementa de 1 en 1


creo que mi problema es el while


Título: Re: problema con graphics java
Publicado por: crack81 en 23 Diciembre 2015, 02:17 am
y eso que tiene ver que uses while el codigo que publique se puede tambien aumentar en otros valores no solo en uno explicate un poco mas detalladamente por favor.


Título: Re: problema con graphics java
Publicado por: 0xFer en 23 Diciembre 2015, 03:28 am
Es muy simple, sólo tienes que llamar al método repaint() cada vez que modifiques las coordenadas del punto para que se dibuje en donde apunten las coordenadas. Cada vez que se repita el proceso llamas a Sleep y así.


Título: Re: problema con graphics java
Publicado por: bengy en 23 Diciembre 2015, 04:04 am
quiero por cada iteracion pintar y borrar y luego pintar etc  


Título: Re: problema con graphics java
Publicado por: bengy en 28 Diciembre 2015, 17:18 pm
hola de nuevo y gracias por su ayuda !!!

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


Título: Re: problema con graphics java
Publicado por: bengy en 29 Diciembre 2015, 05:04 am
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


Título: Re: problema con graphics java
Publicado por: crack81 en 29 Diciembre 2015, 06:18 am
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


Título: Re: problema con graphics java
Publicado por: bengy en 29 Diciembre 2015, 06:41 am
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?


Título: Re: problema con graphics java
Publicado por: crack81 en 29 Diciembre 2015, 07:51 am
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.


Título: Re: problema con graphics java
Publicado por: bengy en 29 Diciembre 2015, 08:40 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
  1. public class AyudaForo extends JPanel{
  2.  
  3.    private static int xinicial = 0, yinicial = 0;
  4.    private static int xfinal = 0, yfinal = 0;
  5.    private static boolean terminar = false;
  6.    private static final byte tamanoPelota=30;
  7.    public static AyudaForo animacion = new AyudaForo(0,0,200,200);
  8.  
  9.    public AyudaForo(int xinicial, int yinicial, int xfinal, int yfinal) {
  10.        this.xinicial = xinicial;
  11.        this.yinicial = yinicial;
  12.        this.xfinal = xfinal;
  13.        this.yfinal = yfinal;
  14.    }
  15.  
  16.    public void paint(Graphics g) {
  17.        super.paint(g);
  18.        pintarPunto(g, xinicial, yinicial);
  19.    }
  20.  
  21.    public void pintarPunto(Graphics g2, int x, int y) {
  22.        g2.setColor(Color.blue);
  23.        g2.fillOval(x, y, tamanoPelota, tamanoPelota);
  24.    }
  25.  
  26.    public static void run() {
  27.  
  28.        while (!terminar) {
  29.            xinicial++;
  30.            yinicial++;
  31.            if (xinicial == xfinal && yinicial == yfinal) {
  32.                break;
  33.            }
  34.            try {
  35.                Thread.sleep(10);
  36.            } catch (InterruptedException ex) {
  37.                ex.printStackTrace();
  38.            }
  39.            animacion.repaint();
  40.        }
  41.    }
  42.  
  43.    public static void main(String[] args) throws InterruptedException {
  44.  
  45.        JFrame ventana = new JFrame("animacion corriendo");
  46.        ventana.setBounds(0, 0, 500, 500);
  47.        ventana.add(animacion);
  48.        ventana.setVisible(true);
  49.        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  50.        run();
  51.        System.out.println("Hilo terminado");
  52.  
  53.    }
  54.  
  55. }
  56.  

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
  1. public static void run() {
  2.           //Aquí utiliza tu algoritmo para ir modificando las variables que te había mencionado
  3.  
  4.            try {
  5.                Thread.sleep(10);
  6.            } catch (InterruptedException ex) {
  7.                ex.printStackTrace();
  8.            }
  9.            animacion.repaint();
  10.  
  11.    }

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


Título: Re: problema con graphics java
Publicado por: bengy en 11 Enero 2016, 04:19 am
como puedo detener y luego seguir con la animacion?


Título: Re: problema con graphics java
Publicado por: 0xFer en 11 Enero 2016, 05:00 am
No logro comprender tu pregunta, ¿Quieres hacer algo como esto?

Código
  1. if(AnimacionActiva == true){
  2.    ActualizarDatosDeObjetos();
  3.    DibujarObjetos();
  4. }

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

Código
  1. public void paint(Graphics g) {
  2.    super.paint(g);
  3.    if( AnimacionActiva == true )    
  4.        pintarPunto(g, xinicial, yinicial);
  5. }

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.


Título: Re: problema con graphics java
Publicado por: bengy en 15 Enero 2016, 01:12 am
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
  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.event.KeyEvent;
  4. import java.awt.event.KeyListener;
  5. import javax.swing.JFrame;
  6. import javax.swing.JPanel;
  7.  
  8. public class AyudaForo extends JPanel{
  9.  
  10.    private static int xinicial = 0, yinicial = 0;
  11.    private static int xfinal = 0, yfinal = 0;
  12.    private static boolean estado = true;
  13.    private static final byte tamanoPelota=30;
  14.    public static AyudaForo animacion = new AyudaForo(0,0,200,200);
  15.  
  16.    private KeyListener listener;
  17.  
  18.    public AyudaForo(int xinicial, int yinicial, int xfinal, int yfinal) {
  19.        this.xinicial = xinicial;
  20.        this.yinicial = yinicial;
  21.        this.xfinal = xfinal;
  22.        this.yfinal = yfinal;
  23.         listener = new MyKeyListener();
  24.        addKeyListener(listener);
  25.        setFocusable(true);
  26.    }
  27.  
  28.    public void paint(Graphics g) {
  29.        super.paint(g);
  30.        pintarPunto(g, xinicial, yinicial);
  31.    }
  32.  
  33.    public void pintarPunto(Graphics g2, int x, int y) {
  34.        g2.setColor(Color.blue);
  35.        g2.fillOval(x, y, tamanoPelota, tamanoPelota);
  36.    }
  37.  
  38.    public static void run() {
  39.  
  40.        while (estado) {
  41.            xinicial++;
  42.            yinicial++;
  43.            if (xinicial == xfinal && yinicial == yfinal) {
  44.                break;
  45.            }
  46.            try {
  47.                Thread.sleep(10);
  48.            } catch (InterruptedException ex) {
  49.                ex.printStackTrace();
  50.            }
  51.            animacion.repaint();
  52.        }
  53.    }
  54.     public class MyKeyListener implements KeyListener {
  55.  
  56.        @Override
  57.        public void keyTyped(KeyEvent e) {
  58.        }
  59.  
  60.        @Override
  61.        public void keyPressed(KeyEvent e) {
  62.  
  63.            if ("Intro".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
  64.                estado = true;
  65.                run();
  66.            }
  67.            if ("Q".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
  68.                estado = false;
  69.            }
  70.        }
  71.  
  72.        @Override
  73.        public void keyReleased(KeyEvent e) {
  74.        }
  75.    }
  76.  
  77.    public static void main(String[] args) throws InterruptedException {
  78.  
  79.        JFrame ventana = new JFrame("animacion corriendo");
  80.        ventana.setBounds(0, 0, 500, 500);
  81.        ventana.add(animacion);
  82.        ventana.setVisible(true);
  83.        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  84.        System.out.println("Hilo terminado");
  85.  
  86.    }
  87.  
  88. }
  89.  

con la tecla Q para la animacion


Título: Re: problema con graphics java
Publicado por: 0xFer en 15 Enero 2016, 01:43 am
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
  1. @Override
  2.        public void keyPressed(KeyEvent e) {
  3.  
  4.            if ("Intro".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
  5.                estado = true;
  6.                Runnable miRunnable = new Runnable()
  7.                {
  8.                    public void run()
  9.                    {
  10.                        try
  11.                        {
  12.                            animacion.run();
  13.                        }
  14.                        catch (Exception e)
  15.                        {
  16.                            e.printStackTrace();
  17.                        }
  18.                    }
  19.                 };
  20.  
  21.                 Thread hilo = new Thread (miRunnable);
  22.                 hilo.start();
  23.  
  24.            }
  25.            if ("Q".equals(KeyEvent.getKeyText(e.getKeyCode()))) {
  26.                estado = false;
  27.            }
  28.        }

Si quieres saber más sobre el EDT (http://chuwiki.chuidiang.org/index.php?title=El_EDT_(Event_Dispatch_Thread)_de_Java)


Título: Re: problema con graphics java
Publicado por: bengy en 15 Enero 2016, 02:22 am
 like si funciona gracias

gracias amigo sigue adelante y se feliz


Título: Re: problema con graphics java
Publicado por: 0xFer en 15 Enero 2016, 02:56 am
Hombre es que cuando no usas hilos tienes doble problema, especialmente cuando estas programando con gráficos es importante usar hilos, el problema que tienes ahora con el EDT es un claro ejemplo de lo que te hablo, es que ya de por si el EDT es un hilo que se ejecuta por debajo sin que te des cuenta junto con otros hilos que se suelen ejecutar cuando dibujas, por ejemplo un circulo por pantalla.

En los juegos se suele programar el tiempo en el que se va a pintar algo por la pantalla( por ejemplo que un alíen aparezca sólo por 10 segundos) y si no usas hilos entonces la velocidad de ejecución dependerá de la computadora en donde se esté ejecutando el juego, vas a tener que calcular cuánto tiempo se tarda en ejecutar cada instrucción en tu computadora, probablemente puedas hacer lo que querías con ese método( nadie hace eso) pero, ¿y si ahora quieres ejecutar tu juego en otra computadora? entonces vas a tener que hacer nuevamente los cálculos para que tu juego se ejecute correctamente en una computadora con una velocidad de procesamiento diferente a la tuya, vamos que hacer esto para muchas computadoras es una completa locura. Por suerte, los Hilos entran al rescate.

Todos los programas que estas usando ahora mismo usan hilos, si no fuera así entonces sólo sería posible tener una aplicación abierta al mismo tiempo, vamos que, si quieres ser un buen programador debes familiarizarte con ello.