Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1

    [JAVA] Far muovere un oggetto alla pressione di un tasto

    Salve a tutti
    Ho fatto una ricerca sul forum (Google) e l'argomento è stato trattato in un topic che però è andato perdendosi...quindi vorrei riaprire la discussione (spero di non errare ) per chi come me si avvicina all'animazione in Java.

    Veniamo al dunque...da qualche giorno sto trattando con la GUI. Roba molto semplice...giusto per prendere confidenza con i comandi [Per intenderci l'ultimo programmino che ho fatto creava al click del mouse delle forme casuali (casuale era il colore, la dimensione e la posizione)].

    Ora vorrei fare il passo successivo ossia l'animazione...quindi l'utilizzo di trasformazioni affini. Vorrei partire da un concetto semplice come quello di far muovere un cubetto in un frame. Ho cercato qualcosa in rete (ho anche riesumato dispense di un mio professore) ma il materiale nn mi aiuta a capire le basi...

    comunque questa è l'impostazione da cui parto...

    codice:
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.geom.*;
    
    public class Spostamento extends JPanel implements KeyListener {
    
    	
    	public static void main(String[] args) {
    		JFrame f = new JFrame();
    		f.setTitle("Prova di Animazione");
    		f.setSize(500,500);
    		f.setResizable(false);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		Spostamento p = new Spostamento();
    		f.getContentPane().add(p);
    		f.addKeyListener(p);
            
    		f.setVisible(true);
    	}
    
    	public void paint (Graphics g){
    		super.paint(g);
    		Graphics2D g2 = (Graphics2D) g;
    		g2.fillRect(... , ... , 100, 100);
    	}
    
    
    	public void keyPressed(KeyEvent arg0) {
    		
    		
    	}
    	
    }
    L'idea era di gestire il movimento nel metodo keyPressed (giusto no?) in modo tale che il metodo paint si occupi soltanto del disegno della formina. Ma avrei qualche domanda...

    1- Nel metodo keyPressed devo gestire una trasformazione affine. Quindi avrò bisogno di un oggetto Graphics2D...ma credo di non aver capito come istanziarlo

    2 - Quando disegno l'oggetto devo dare anche la locazione x e y (al posto dei puntini nel codice)...ma se lo sposto come faccio? stavo pensando semmai di spostare l'origine al centro del cubetto ogni volta che esegue un movimento e impostare in pain le coordinate x=0 e y=0 in modo tale di non fare pasticci o no?

    Grazie in anticipo

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Ma far muovere l'oggetto alla pressione del tasto in che modo?in che posizione?secondo quale logica?così a caso?

  4. #4
    L'idea era di farlo muovere attraverso le frecce dalla tastiera...quindi freccia su il quadratino si muove in su etc.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il codice da cui parti è un mezzo disastro...

    1) Crea una classe che gestisce la finestra, e che estends JFrame;
    2) Da questa classe crei un istanza di una tua classe Pannello, che estende JPanel;
    3) La classe Pannello deve avere per forza le coordinate del rettangolo, quindi ha 2 campi di istanza: x,y;
    4) Devi implementare public void paintComponent(Graphics g); per gestire il disegno sul tuo pannello, e richiamare (prima di compiere operazioni al suo interno) il metodo della classe genitore.
    5) Alla classe Pannello aggiungi il keyListener. Banalmente all'interno del costruttore, oppure implementi KeyListener e definisci i suoi metodi.

    Se vuoi farlo muovere solo al click, devi usare degli if per verificare quale tasto è premuto.

    Non dimenticare una cosa molto importante, il focus sul tuo Pannello. Nel suo costruttore inserisci le linee:
    codice:
    setFocusable(true);
    requestFocusInWindow();
    Ora hai sicuramente dettagli a sufficienza per scriverlo. Se hai bisogno chiedi.

  6. #6
    Grazie mille patrick per la dritta solo due cose...
    1 - l'ultima cosa a cui accenni il focus...cos'è? :| mai usato...
    2 - altra cosa (magari per un futuro ma vorrei cominciare a capire come potrei farla) sarebbe l'impossibilità di far uscire il quadratino dal frame...ossia farlo "sbattere" contro le pareti del frame

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da WilliamsFolder
    1 - l'ultima cosa a cui accenni il focus...cos'è? :| mai usato...
    http://docs.oracle.com/javase/tutori...isc/focus.html

    In parole povere, quando digiti qualcosa, quel qualcosa lo "sente" chi in quel momento ha il focus attivo.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da WilliamsFolder
    Grazie mille patrick per la dritta solo due cose...
    1 - l'ultima cosa a cui accenni il focus...cos'è? :| mai usato...
    2 - altra cosa (magari per un futuro ma vorrei cominciare a capire come potrei farla) sarebbe l'impossibilità di far uscire il quadratino dal frame...ossia farlo "sbattere" contro le pareti del frame
    Alla 1, ti hanno già risposto.

    Per quanto riguarda la 2 è molto semplice. Prima di chiamare repaint() per disegnare la nuova posizione, guardi le coordinate del quadrato, e verifichi siano minori o uguali a quelle del JPanel (metodi getWidth() e getHeight()).
    Se come riferimento usi il frame devi fare i conti con bordi ed eventuali menu ad esempio. Usando il pannello non dovresti avere intralci. ^^

  9. #9
    grazie a tutti per le dritte domani provo a stendere qualcosa e vediamo come va :P grazie ancora

  10. #10
    Allora per ora ho fatto questo...ma il pannello non si muove

    Classe Pannello extends JPanel

    (per il movimento ho fatto una cosa rozza giusto per vedere se funziona XD)

    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class Pannello extends JPanel implements KeyListener {
    	
    	//coordinate dell'elemento
    	private static int x;
    	private static int y;
    	
    	//costruttore
    	public Pannello(int a, int b){
    		super();
    		Pannello.x = a;
    		Pannello.y = b;
    		this.setFocusable(true);
    		this.requestFocusInWindow();
    	}
    	
    	public void paint(Graphics g){
    		super.paint(g); //richiamo il metodo della classe genitore
    		Graphics2D g2 = (Graphics2D) g; //cast in Graphics2D di un oggetto Graphcis
    		g2.setColor(Color.red);
    		
    		g2.fillRect(x, y, 100, 100);
    	}
    	
    //definisco cosa succede alla pressione di un tasto
    	
    	public void keyPressed(KeyEvent ke) {
    		
    		switch(ke.getKeyCode()){
    		
    		case KeyEvent.VK_UP:
    			Pannello.y = (Pannello.y) - 1;
    			repaint();
    			break;
    		case KeyEvent.VK_DOWN:
    			Pannello.y = (Pannello.y) + 1;
    			repaint();
    			break;
    		case KeyEvent.VK_RIGHT:
    			Pannello.x = (Pannello.x) + 1;
    			repaint();
    			break;
    		case KeyEvent.VK_LEFT:
    			Pannello.x = (Pannello.x) - 1;
    			repaint();
    			break;
    		}
    	
    	}
    	
    	public void keyReleased(KeyEvent arg0) {}
    	public void keyTyped(KeyEvent arg0) {}
    
    	
    	
    }
    Classe Finestra Extends JFrame
    codice:
    import javax.swing.*;
    
    import java.awt.*;
    
    public class Finestra extends JFrame {
    	
    	public Finestra(int a, int b){
    		super();
    		this.setSize(400,400);
    		Pannello p = new Pannello(a,b);
    		this.add(p);
    		this.addKeyListener(p);
    		this.setVisible(true);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setResizable(false);
    		
    	}
    
    public static void main (String[] args){
    	Finestra f = new Finestra(0,0);
    	
    }
    	
    
    }

    Il problema è che non ho definito una delle due classi "interna" all'altra? sembra che non "senta" proprio i tasti...

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.