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

    Come rendere sensibile il programma alle frecce direzionali?

    Salve a tutti,
    ho un problema: devo realizzare per scuola un semplice videogioco con Java, ed ho pensato a Snake! Il problema principale, per ora, è che non un modo per rendere il pallino nel pannello sensibile alle freccie direzionali... Vi posto il codice...

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.*;
    
    /*************************************************************
     * 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 static Font f = new Font("Times New Roman",Font.ITALIC,80);
        private Thread th;
        //private int xg,yg;
        private int[] x = new int [500];
        private int[] y = new int [500];
        //private int pos = 1;
        //private int np = 1;
    
        private boolean sinistra, destra, su, giu;
    
        /**
         * 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();
                  //pos++;
                  //np++;
                  // cfr. InputEvent
                  b_mouse = e.getModifiers();  // bottone del mouse (16=sx,4=dx)
                  s = "";
                  repaint(); // richiama paint()
                  } // [m] mouseClicked
    
                //---- gestione dell'entrata del mouse ----
                public void mouseEntered(MouseEvent e)
                  {
                  setBackground(new Color(255,255,255));
                  s = "Per iniziare digita 'start'";
                  repaint(); // richiama paint()
                  } // [m] mouseEntered
    
                //---- gestione dell'uscita del mouse ----
                public void mouseExited(MouseEvent e)
                  {
                  setBackground(new Color(255,255,255));
                  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();
                  //xg = x;
                  //yg = y;
                  repaint(); // richiama paint()
                  } // [m] mouseMoved
                }
            );
    
            addKeyListener(new KeyAdapter()  // da verificare perchè non vanno le frecce direzionali...
            {
                @Override
                public void keyPressed(KeyEvent q)
                {
    				if (q.getKeyCode() == KeyEvent.VK_LEFT)
    				{
                        if ((su || giu))
                        {
                            sinistra = true;
                            destra = giu = su = false;
                            x_mouse--;
                        }
                    }
                    else if (q.getKeyCode() == KeyEvent.VK_RIGHT)
                    {
                        if (su || giu)
                        {
                            destra = true;
                            sinistra = giu = su = false;
                            x_mouse++;
                        }
                    }
                    else if (q.getKeyCode() == KeyEvent.VK_UP)
                    {
                        if (destra || sinistra)
                        {
                            su = true;
                            giu = destra = sinistra = false;
                            y_mouse++;
                        }
                    }
                    else if (q.getKeyCode() == KeyEvent.VK_DOWN)
                    {
                        if (destra || sinistra)
                        {
                            giu = true;
                            su = destra = sinistra = false;
                            y_mouse--;
                        }
                    }
                }
            });
    
    
    
        } // [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();
    
        } // [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.blue);
            //for(int i=0;i<=pos;i++)
            	g.fillOval(x_mouse+150,y_mouse+150,10,10);  // piccolo cerchio pieno
            	//g.fillOval(x_mouse+145,y_mouse+145,10,10);
            	//g.fillOval(x_mouse+140,y_mouse+140,10,10);
            //g.setColor(Color.red);
            //g.drawLine(10,10,400,500);
            g.setColor(Color.red);
            g.drawString(s,100,200);
        } // [m] paint
    
        //#### 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()
                        {
                          for (;;)  // ciclo infinito
                              {
                              s = "";
                              //x_mouse++; // così all'inizio resta fermo...
                              //y_mouse++;
                              repaint();
                              try {
                                  sleep(50);
                                  }
                              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,400,550);  // contenitore top-level
            Pannello p = new Pannello(50,50,300,380);  // pannello su cui disegnare
            Campo c    = new Campo(50,450,300,20);     // campo comandi
    
            // settaggio colore dei componenti
            f.setBackground(new Color(200,100,100));
            f.setTitle("XSnake - versione 1.0");
            p.setBackground(new Color(230,210,190));
            p.setFocusable(true);   // dovrebbe rendere sensibile la pressione sulle freccie direzionali ma...?
            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();
            p.setFocusable(true);
    
            // gestione comandi scritti sul campo testo
            String s;
            do  {
                s = c.leggiStringa("");
                p.esegui(s);
                } while (!s.equals("fine"));
    
        } // [m] main
    
    } // [class] Progetto
    Ho provato anche ad aggiungere il comando "p.setFocusable(true);" ma niente da fare...
    Se potete aiutarmi ne sarei grato, grazie.
    Sen.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    6
    Qualcuno mi può rispondere???

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.