Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    6

    Come creare altri pallini indipendenti?

    Ciao, ho realizzato questo semplice programma di rimbalzo:

    codice:
    /**
     * Rimbalzi.java ver. 3.0
     * 12-05-2012
     * @author  D.Tremea - Feltre
     * Compito:
     * 		aggiungere altri pallini indipendenti tra di loro ...
     *
     */
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    
    
    /*********************************************************************
     * una Finestra e' il contenitore dei vari componenti grafici
     *
     */
    class Finestra extends JFrame
    {
        Finestra(int x0, int y0, int larghezza, int altezza)
        {
            // settaggio caratteristiche della finestra
            setBounds(x0,y0,larghezza,altezza);
            setTitle(getClass().getName());
            setResizable(true);
            setVisible(true);
    
            // aggiunta di un ascoltatore per poter chiudere il frame
            addWindowListener(new WindowAdapter()
                {
                    public void windowClosing(WindowEvent e)
                    {
                       System.out.println("Fine dell'applicazione\n");
                       System.exit(0);  // chiusura dell'applicazione
                    } // [m] windowClosing
                }
            );
    
        } // [c] Finestra
    
    } // [class] Finestra
    
    
    /*********************************************************************
     * un Pannello e' un componente su cui disegnare
     *
     */
    class Pannello extends JPanel
    {
        //#### (strutture) dati che memorizzano il disegno ####
        //private int x_mouse, y_mouse;  // ultimo clic del mouse
        private int b_mouse;           // ultimo bottone del mouse (16=sx, 4=dx)
        private String s = "";         // stringa scritta sul pannello
        private int x, y;
        private double a, V, vx, vy;
        final double gravity = 0.01;
        private int[] np = new int[10];
        private int[] X = new int[10];
        private int[] Y = new int[10];
    
        private static Font f = new Font("Times New Roman",Font.ITALIC,80);
        private Thread th;
    
        /**
         * costruttore
         */
        public Pannello(int x0, int y0, int lar, int alt)
    
        {
            // settaggi di configurazione
            setBounds(x0,y0,lar,alt);
            setBorder(new EtchedBorder());
            setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
    
            //#### gestione degli eventi intercettati dal pannello ####
    
            // il pannello viene reso sensibile ai clic del mouse
            addMouseListener(new MouseAdapter()
                {
                //---- gestione del clic del mouse ----
                public void mouseClicked(MouseEvent e)
                  {
                  //x_mouse = e.getX();
                  //y_mouse = e.getY();
                  // cfr. InputEvent
                  b_mouse = e.getModifiers();  // bottone del mouse (16=sx,4=dx)
                  //s = "X="+x_mouse+" Y="+y_mouse+"     ";
                  repaint(); // richiama paint()
                  } // [m] mouseClicked
    
                //---- gestione dell'entrata del mouse ----
                public void mouseEntered(MouseEvent e)
                  {
                  setBackground(new Color(230,210,190));
                  repaint(); // richiama paint()
                  } // [m] mouseEntered
    
                //---- gestione dell'uscita del mouse ----
                public void mouseExited(MouseEvent e)
                  {
                  setBackground(new Color(230,210,190));
                  repaint(); // richiama paint()
                  } // [m] mouseExited
    
                }
            );
    
            // il pannello viene reso sensibile ai movimenti del mouse
            addMouseMotionListener(new MouseMotionAdapter()
                {
                //---- gestione del movimento del mouse ----
                public void mouseMoved(MouseEvent e)
                  {
                  //int x = e.getX();
                  //int y = e.getY();
                  //s = "x="+x+" x="+y+"    ";
                  repaint(); // richiama paint()
                  } // [m] mouseMoved
                }
            );
    
        } // [c] Pannello
    
        /**
         * esecuzione di un comando
         */
        public void esegui(String cmd)
        {
            System.out.println("Comando da eseguire = ["+cmd+"]");  // DA FINIRE
            if (cmd.equals("start"))
                attiva();
            else
          	  System.out.println("Comando errato = ["+cmd+"]");
    
        } // [m] esegui
    
        /**
         * ridisegno della parte grafica
         * (questo metodo viene richiamato automaticamente quando la finestra
         * deve essere ridisegnata (ad esempio quando viene sovrapposta
         * da un'altra)
         */
    
    	public void paint(Graphics g)
        {
            super.paint(g);
            g.setColor(Color.red);
            	g.fillOval(x,y,15,15);
            g.setColor(Color.red);
            //g.drawLine(200,0,700,700);
            g.setColor(Color.blue);
            g.drawString(s,100,200);
        } // [m] paint
    
        public void inizio(int a, int V)
        {
        	x = 0; //(int)(Math.random()*700*380);
        	vx = Math.cos(a * 180 / 3.1415) * V;
        	y = 0; //(int)(Math.random()*700*380);
        	vy = Math.sin(a * 180 / 3.1415) * V;
        }
    
        //#### begin thread ####
        /**
         * - creazione del thread (new Thread())
         * - definizione del comportamento del thread (def. del metodo run())
         * - attivazione del thread (th.start())
         */
        public void attiva()
        {
           th = new Thread()
                    {
                    // ridefinizione del metodo run
                    public void run()
                        {
                        	inizio(45,20); 		// inizio(angolo,Velocità);
                        	repaint();
                          while(true)  // ciclo infinito
                              {
                              	x+=vx;
                              	y+=vy;
                              	vy+=gravity;
                              	if(x>=695 || x<0)
                              		vx =- vx;
    							if(y>=375 || y <0)
                    				vy = -vy;
                              repaint();
                              try {
                                  sleep(25);
                                  }
                              catch (InterruptedException e)
                                  {
                                  System.out.println("thread interrotto");
                                  return;
                                  }
                              } // for
                        }
                    };
    
            th.start();
        } // [m] attiva
        //#### end thread ####
    
    } // [class] Pannello
    
    
    /*********************************************************************
     * un Campo e' una finestra testo sulla quale si puo' scrivere
     *
     */
    class Campo extends JTextField
    {
        private static String stringaletta = "";
    
        /**
         * costruttore
         * Parametri:
         *   lar,alt : larghezza ed altezza
         */
        Campo(int x0, int y0, int lar, int alt)
        {
            setBounds(x0,y0,lar,alt);
            setFont(new Font("Monospaced",Font.PLAIN,11));
            setEditable(true);   // attiva il cursore
            setVisible(true);    // rende visibile
    
            // intercettamento dell'evento "tasto INVIO"
            addActionListener
                (new ActionListener()
                    {
                    // quando si batte INVIO stringaletta prende il testo
                    public void actionPerformed(ActionEvent e)
                        {
                        stringaletta = "";
                        stringaletta = getText();
                        setText(""); // serve?
                        }
                    }
                );
    
        }  // [c] Campo
    
        /**
         * lettura di una stringa
         * msg rappresenta la stringa iniziale proposta
         *
         */
        public String leggiStringa(String msg)
        {
            stringaletta = "";
            requestFocus();    // non attiva comunque il cursore
            setEditable(true);
            setText(msg);  // messaggio guida dell'input
            setCaretPosition(msg.length()); // 0 e' all'inizio
            while (stringaletta.equals(""))
                ;
            String rets = stringaletta;
            stringaletta = "";
            setEditable(false);
            return rets;
        } // [m] leggiStringa
    
        /**
         * lettura di una stringa
         *
         */
        public String leggiStringa()
        {
            return leggiStringa("");
        } // [m] leggiStringa
    
        /**
         * scrittura di una stringa sul campo testo (come messaggio)
         *
         */
        public void scriviStringa(String s)
        {
            setText(s);
        } // [m] scriviStringa
    
    } // [class] Campo
    
    
    class Progetto
    {
        public static void main(String[] args)
        {
            // creazione finestra e componenti
            Finestra f = new Finestra(10,20,800,550);  // contenitore top-level
            Pannello p = new Pannello(50,50,700,380);  // pannello su cui disegnare
            Campo c    = new Campo(50,450,700,20);     // campo comandi
    
            // settaggio colore dei componenti
            f.setBackground(new Color(200,100,100));
            f.setTitle("Rimbalzi - ver.3.0");
            p.setBackground(new Color(230,210,190));
            c.setBackground(new Color(210,230,250));
    
            // assemblaggio del sistema grafico: Finestra+Pannello+Campo
            f.setLayout(null);  // altrimenti il pannello invade tutta la finestra
            f.add(p);           // attacco del pannello alla finestra
            f.add(c);           // attacco del campo alla finestra
    
            // attivazione del thread associato al pannello
            //p.attiva();
    
            // visualizzazione
            f.setVisible(true);
            p.repaint();
    
            // gestione comandi scritti sul campo testo
            String s=null;
            boolean b = false;
    
            do  {
                  s = c.leggiStringa("");
                  b = s.equals("fine");
                  p.esegui(s);
                } while (b==false);
    
        } // [m] main
    
    } // [class] Progetto
    Quello che volevo realizzare adesso è: aggiungere altri pallini tutti tra di loro indipendenti, ma come?

  2. #2
    dando uno sguardo veloce al codice (sinceramente dopo 8 ore di lavoro non ho la lucidità per essere sicuro) credo che basti creare altri thread, visto che sono loro che simulano le palle.

    se hai scritto tu il resto del codice dovrebbe essere molto semplice

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    6
    Mmm, il problema però resta, visto che non so dove aggiungere altri g.fillOval(...), e rendere i pallini indipendenti tra di loro...

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    6
    Qualcuno può aiutarmi?

  5. #5
    Domanda, i pallini stanno tutti nello stesso piano o no? Possono scontrarsi? Cosa dovrebbe succedere se le traiettorie si incrociano?
    ...

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    6
    Non so risponderti perchè ancora non sono riuscito a farne più di uno...

  7. #7
    Puoi recuperare ampiamente il codice impiegato per disegnare un pallino solo. Potresti impilare tanti JPane trasparenti uno sopra l'altro ciascuno con un pallino in modo che sia il frame a occuparsi di occultare i pallini dietro.
    Così facendo devi solo preoccuparti di creare tanti thread quanto sono i pallini ed assegnare a ciascuno il JPane.

    Ma non sono molto esperto di Swing, una cosa del genere non l'ho mai dovuta realizzare.
    ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.