Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - niano

#11
Java / Simulación gráfica animada
26 Junio 2019, 08:30 AM
Hola, buenos días.

Estoy haciendo una especie de animación simulada con java y resulta que soy algo nuevo en esto de la programación gráfica, por lo que tengo muchas dudas. Voy a intentar subiros los fragmentos de código que me generan más dudas de la manera más resumida posible para ver si podéis echarme una mano, ya que el programa no funciona. Gracias a todos y todas de antemano.

Pues bien, la simulación lo que tiene que hacer es dibujar unos círculos en un panel que se deben ir moviendo según unos parámetros booleanos que introducimos en unas casillas de activación. El número de círculos que se deben dibujar se introducen en un cuadro de texto. En este enlace hay un vídeo con el resultado que debo conseguir.

Lo que creo que debo hacer es definir:

Una clase vector con las operaciones básicas que se pueden hacer con los vectores en dos dimensiones. Esto va bien.

Una clase circulo con los atributos de cada uno de los círculos (diámetro, color, posición, velocidad, aceleración), con un método pintar que dibuje un círculo a partir de un objeto de la clase graphics y otro método actualizar que en cada iteración actualice la posición de un círculo según sus propios atributos. También contiene otros métodos. Esto creo que también va más o menos bien.

Una clase Panel, que debe ser un panel gráfico sensible a los movimientos del ratón que contenga como atributos una colección de círculos y los datos de la IGU. Aquí empiezan mis problemas. Entiendo, en un principio, que Panel podría ser una subclase de java.awt.graphics2D y que podría utilizar la interfaz MouseMotionListener.

Un programa principal que contenga la definición y comportamiento de la interfaz. Mi idea es hacer esto con una subclase de JFrame, pero también ando algo perdido con esto.

Bueno, ahí va lo que en un principio había concebido para la clase Panel. Lo que ocurrió es me surgieron muchos problemas y lo fui modificando. Entre esos problemas, el NetBeans me obligaba a poner un abstract en la declaración de la clase. Pero no me daba buena espina eso, por lo que también fui probando con la clase java.awt.Canvas sin conseguir mucho. En cualquier caso, me gustaría hacerlo con graphics2D:


public class Panel extends java.awt.graphics2D implements MouseMotionListener
{
    //Atributos de la clase. No creo que tenga problemas aquí.
    circulo bolas[]; // Un array con las bolas;
    int nbolas; // El número de bolas
    boolean follow_mouse // Nos indica si la casilla Follow Mouse está activada o no.
    //...

    //Luego el constructor.
    public Panel (int Nbolas, boolean walls, boolean mouse, int ancho, int alto)
    {
        setSize(ancho, alto); // Dimensiono el panel
        bolas = new circulo (...);  // Reservo memoria para el array de círculos y construyo
                                              //esos círculos según el constructor de esa clase.
        // Y otras cosas así
        //...
    }
    //...

    public void paintComponent (Graphics g)
    {
        //Aquí hay un bucle en el que llamo al método [b]pintar [/b] para cada uno de los
        //circulos del array introduciéndolo el arguento g.
    }
    public void actualizarBolas (void);
    {
        //Aquí hay un bucle en el que llamo al método [b]actualizar[/b] para cada uno de
        //los circulos del array
    }

    //Los métodos de la interfaz.
    //Cuando el ratón se mueva y en el caso de que la casilla Follow Mousse esté activada
    //se debe cambiar el centro del movimiento
    public void mouseDragged (MouseEvent e)
    {
        if (follow_mouse==1)
        {
            Centro.cambiarx(e.getX());
            Centro.cambiary(e.getY());
        }
    }
    public void mouseDragged (MouseEvent e) {}
}


Y ahora un esbozo de la clase principal. Creo que aquí es donde la lío más. Me gustaría hacerlo con un JFrame, aunque si tuviese que cambiar de clase no me importaría con tal de que el programa funcionase. Esto lo fui también modificando de una manera un tanto arbitraria, pero nada. Ni siquiera fui capaz de visualizar el panel:


public class app extends JFrame implements ItemListener, ActionListener
{
    //Atributos:
    JCheckBox check1, check2;
    JTextField text;
    Panel p;
    Graphics g;
   
    //Constructor. No creo que esto esté bien:
    public app()
    {
        p=new Panel(....) // Construyo el panel con unos parámetros adecuados.
        Container c=getContentPane();
        check1=new JCheckBox("With walls");
        check2=new JCheckBox("Follow mouse");
        text=new JTextField (20);

        check1.addItemListener(this);
        check2.addItemListener(this);
        text.addActionListener(this);

        c.add(check1);
        c.add(check2);
        c.add(p);

       

    }
   
    //Los métodos de las interfaces:
    public void itemStateChanged (ItemEvent e)
    {
        if (e.getItemSelectable==check1)
        {
              p.cambiarWalls(check1.isSelected());
        }
        if (e.getItemSelectable==check2)
        {
              p.cambiarMouse(check2.isSelected());
        }

    }
    public void actionPerformed (ActionEvent e)
    {
        if (e.getSource==text)
        {
             //Aquí obtengo el texto que hay en el cuadro, lo paso a un int y vuelvo a
             //construir el panel p con los parámetros actuales.
        }
    }
    // El main.
    public static void main (String args[])
    {
        final JFrame f=new app();
        fsetBounds(50,50,500,500);
        f.setVisible(true);

        // Y ahora el bucle que crea la simulación. No estoy seguro de que esto vaya aquí,
        // pero  no sé dónde meterlo... :)
        while (1==1)
        {
             p.paintComponent(g);
             p.actualizarBolas();
             p.repaint();
        }
    }
}


A ver qué os parece. Yo estoy bastante perdido y falto de ideas.

Muchísimas gracias de antemano por vuestro tiempo.
#12
De acuerdo. Gracias por el consejo.

Saludos.
#13
Hola buenas.

Estupendo!!! Muchas gracias por vuestras respuestas, parece que ya lo he arreglado. He elegido la opción de eliminar la dependencia de la dll ya que quisiera poder ejecutar el programa en otras máquinas. He seguido las indicaciones y parece que ha funcionado.

Muchas gracias y un saludo.
#14
Hola, buenos días.

Me he instalado el CodeBlocks 17.12 en un Windows 10 hace unos días para crear, principalmente, aplicaciones de consola con C. Resulta que parece que compila bien el código que sea, ya que CodeBlocks lo ejecuta correctamente (supongo que en una especie de simulación o algo así). Sin embargo, cuando le doy directamente al ejecutable que se haya en la carpeta "...\bin\Debug" me sale un cuadro de diálogo cuyo mensaje no entiendo y que dice: "La ejecución de código no puede continuar porque no se encontró libgcc_s_dw2-1.dll. Este problema se puede solucionar reinstalando el programa". Le doy a la única opción, "Aceptar", y todo desaparece.

He desinstalado y reinstalado el CodeBlocks pero la cosa sigue igual. El proyecto está en una carpeta cuyo nombre no tiene espacios que se haya directamente en la raíz del disco duro.

¿Alguien sabe cómo puedo hacer para que el CodeBlocks me genere ese ejecutable correctamente?

Gracias de antemano por las respuestas. Un saludo.
#15
Hola

Muchas gracias por responder YreX-DwX. Ya lo he corregido y funciona perfectamente. He optado por la segunda opción ya que necesitaba la precisión de un double.

Saludos.
#16
Hola buenas.

Tengo un problema con un programa en el que pretendo utilizar el especificador de formato %g. Según tengo entendido la entrada puede hacerse por teclado introduciendo, por ejemplo, 2e-4. Lo que quiere decir 0.0002. Pues bien, introduzco el dato y luego al mostrarlo por pantalla me sale algo que no tiene nada que ver. El código es el siguiente:

main()
{
double x;
scanf("%g",&x);
printf("%g",x);
}

Como ya he dicho, al imprimir por pantalla el número que he introducido previamente por teclado me sale algo que no tiene nada que ver. Por ejemplo, meto 2e-4 y me imprime 1.#NAN . O sea, que algo no funciona bien. ¿Alguien sabe qué es lo que está pasando?

Agradezco de antemano cualquier ayuda. Un Saludo.