Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135

    [JAVA] Spostare un'immagine in diagonale con l'interfaccia KeyListener

    Salve a tutti!
    Non riesco a fare muovere in diagonale (in maniera continua) un'oggetto (immagine .gif) in un applet, implementando l'interfaccia KeyListener. Ho implementato il seguente codice:

    codice:
    private class DirectionKeyListener implements KeyListener
        {
    
          //Spostiamo l'immagine a seconda dell'evento della tastiera
          public void keyPressed (KeyEvent event)
          {
    
           switch (event.getKeyCode())
                {
                    case KeyEvent.VK_UP:
                                    if (y > 0)
                                    y -= JUMP;
                                    break;
                   
                   case KeyEvent.VK_DOWN:
                                    if (y < APPLET_HEIGHT-IMAGE_SIZE)
                                    y += JUMP;
                                    break;
                   case KeyEvent.VK_LEFT:
                                    if (x > 0)
                                    x -= JUMP;
                                    break;
                                    
                   case KeyEvent.VK_RIGHT:
                                    if (x < APPLET_WIDTH-IMAGE_SIZE)
                                    x += JUMP;
                                    break;    
                }      
        
             repaint();
          }
    Voglio che lasciando premuti i tasti, ad esmpio, [UP]+[LEFT] l'immagine si muova in maniera continua in diagonale, mentre invece con il mio codice non lo fa, ma si muove solo di una casellina (JUMP) per volta. Che cosa devo aggiungere al mio codice????
    Linux Slackware 11 - Kernel 2.6.18

  2. #2
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    PER FAVORE AIUTATEMI!!!!!!!!!!!
    Linux Slackware 11 - Kernel 2.6.18

  3. #3
    Credo che l'evento KeyPressed indichi la pressione del tasto, per cui il metodo che hai scritto viene eseguito una sola volta, nel momento in cui il tasto viene premuto... Una volta per ogni tasto, insomma.
    L'unica soluzione che mi viene al tuo problema e' di usare un thread, ma di sicuro ne esiste una piu' semplice...
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  4. #4
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Grazie del consiglio.
    Ma perchè se io tengo premuto il tasto [UP] l'oggetto si sposta correttamente, mentre ciò non avviene se lo voglio spostare in diagonale (si sposta solo di una casellina e poi si blocca, non muovendosi di seguito)?????
    Linux Slackware 11 - Kernel 2.6.18

  5. #5
    Uhm... Probabilmente allora non e' come dico io.
    Oppure dipende dalla ripetizione automatica dei tasti.
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  6. #6
    Ho provato a implementare il tuo metodo.
    A me si muove di una casella in diagonale, dopo di che continua a muoversi verso l'alto.
    Quindi dipende dalla ripetizione dei tasti.

    Ora provo a modificarlo introducendo un timer...
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  7. #7
    Ecco un esempio funzionante!

    codice:
    package caralu;
    
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    public class Caralu extends JFrame {
        
        static int JUMP = 1;
        static int APPLET_HEIGHT=480;
        static int APPLET_WIDTH=640;
        static int IMAGE_SIZE=50; // Sarebbe meglio avere dimensioni separate
        static int MILLISECONDI=100; // Ogni quanti ms vuoi che si muova l'immagine?
        
        int x; // posizione orizzontale corrente
        int inc_x; // aggiungi alla posizione orizzontale corrente
        int y; // posizione verticale corrente
        int inc_y; // aggiungi alla posizione verticale corrente
        
        JLabel ics, ipsilon; // Mi spiace, non so come si visualizza un'immagine...
        JPanel u;
        Timer timer;
        
        public Caralu(int x0, int y0) {
            x=x0;
            y=y0;
            inc_x=inc_y=0;
            
            ics = new JLabel("");
            ipsilon = new JLabel("");
            
            u = new JPanel();
            u.add(ics);
            u.add(ipsilon);
            
            addKeyListener(new DirectionKeyListener());
            u.addKeyListener(new DirectionKeyListener());
            ics.addKeyListener(new DirectionKeyListener());
            ipsilon.addKeyListener(new DirectionKeyListener());
            
            timer = new Timer(MILLISECONDI, new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    int x1 = x + inc_x;
                    int y1 = y + inc_y;
                    if ((x1>0) && (x1<APPLET_WIDTH))
                        x=x1;
                    if ((y1>0) && (y1<APPLET_HEIGHT))
                        y=y1;
                    aggiorna();
                }
            });
        }
        
        public void aggiorna() {
            ics.setText(String.valueOf(x));
            ipsilon.setText(String.valueOf(y));
        }
        
        public Dimension getPreferredSize() {
            return new Dimension(APPLET_WIDTH, APPLET_HEIGHT);
        }
        
        public static void main(String[] args) {
            Caralu c= new Caralu(100,100);
            c.setContentPane(c.u);
            c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            c.pack();
            c.show();
            c.timer.start();
        }
        
        
        private class DirectionKeyListener extends KeyAdapter {
            
            //Spostiamo l'immagine a seconda dell'evento della tastiera
            public void keyPressed(KeyEvent event) {
                
                switch (event.getKeyCode()) {
                    case KeyEvent.VK_UP:
                        inc_y=-JUMP;
                        break;
                    case KeyEvent.VK_DOWN:
                        inc_y=JUMP;
                        break;
                    case KeyEvent.VK_LEFT:
                        inc_x=-JUMP;
                        break;
                    case KeyEvent.VK_RIGHT:
                        inc_x=JUMP;
                        break;
                }
            }
            
            public void keyReleased(KeyEvent event) {
                
                switch (event.getKeyCode()) {
                    case KeyEvent.VK_UP:
                    case KeyEvent.VK_DOWN:
                        inc_y=0;
                        break;
                    case KeyEvent.VK_LEFT:
                    case KeyEvent.VK_RIGHT:
                        inc_x=0;
                        break;
                }
            }
        }
        
    }
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  8. #8
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Grazie mille per l'aiuto...
    Non ho ancora avuto modo di testare il tuo codice ma lo farò a breve, sembra ben sviluppato.
    Linux Slackware 11 - Kernel 2.6.18

  9. #9
    Prego.

    P.S. Se non ricordo male mi sono dimenticato di sottrarre IMAGESIZE nei controlli "di frontiera"...

    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.