Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [java]LancioMissile

  1. #1

    [java]LancioMissile

    Stò studiando Java da autodidatta e sono arrivato allo studio delle interfacce grafiche.
    Ho però incontrato un problema in un esempio di un possibile giochetto che stavo facendo.
    E' molto semplice: c'è un'astronave che si muove a dx e a sx e quando si preme un tasto (ad esempio Z) vorrei che lanciasse il missile.
    Il problema inizia quando devo scrivere codice per far si che il missile, dalla posizione iniziale in cui è stato creato e disegnato inizi ad avanzare automaticamente verso l'alto.

    Qualcuno sa consigliarmi come poter gestire il movimento del missile?
    Se qualcuno avesse un esempio su cui studiare sarei molto grato!!
    Grazie

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java]LancioMissile

    Originariamente inviato da miticogilles
    Qualcuno sa consigliarmi come poter gestire il movimento del missile?
    Se qualcuno avesse un esempio su cui studiare sarei molto grato!!
    Intanto, per cominciare, devi usare un Timer (javax.swing.Timer, per la precisione). Poi comunque bisognerebbe anche vedere il codice che hai scritto.

    E se vuoi vedere un esempio di qualcosa "che si muove", allora guarda tra i miei Java Examples (vedi firma), sezione AWT/Swing - Graphics e in particolare l'esempio BallsMotion.java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie andbin, grazie ai tuoi esempi sono riuscito ad effettuare il lancio del missile. Mi rimane un piccolo problema e cioè che ogni volta che lancio un missile nuovo mi aumenta la sua velocità in quanto (credo) il Timer aggiunge la velocità a quella esistente. Come posso fare per risolvere questo problema???
    Per maggiori info pongo il listato con anche l'immagine del Missile e dell'Astronave per testare l'esempio.
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;     
    import javax.swing.*;
    import javax.swing.Timer;
    
    public class AstronaveTest
    {
    	public static void main(String[]args)
    	{
    		Finestra finestra = new Finestra();
    		finestra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		finestra.setVisible(true);
    	}
    }
    class Finestra extends JFrame
    {
    	public static final int LARGHEZZA = 800;
    	public static final int ALTEZZA = 600;
    	public Finestra()
    	{
    		setSize(LARGHEZZA,ALTEZZA);
    		setResizable(false);
    		
    		Container contenitore = this.getContentPane();
    		Pannello pannello = new Pannello();
    		contenitore.add(pannello);
    	}
    }
    
    class Pannello extends JPanel
    {
    	private Astronave astronave;
    	private int xx;
    	private int yy;
    	private Image imgAstronave;
    	private List<Missile>missiliList;
    	public Pannello()
    	{
    		AzioniTasti AT = new AzioniTasti();
    		addKeyListener(AT);
    		
    		//setto le variabili per la posizione iniziale dell'astronave
    		xx = 400;
    		yy = 500;
    		astronave = new Astronave();
    		imgAstronave = astronave.getImmagineAstronave();
    		missiliList= new ArrayList<Missile>();
    		
    	}
    	public boolean isFocusable()
    	{
    		return true;
    	}
    	public void spostaAstronave(int x, int y)
    	{
    		xx = xx + x;
    		yy = yy + y;
    	}
    	protected void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    		Graphics2D g2d = (Graphics2D)g;
    		
    		g2d.drawImage(imgAstronave,xx,yy,null);
    		
    		for(Missile m : missiliList)
    		{
    			m.draw(g2d);
    		}
    	}
    	private void moveM() {
            
            for (Missile m : missiliList) {
                m.move(-20);
            }
            repaint();
        }
    	private class AzioniTasti implements KeyListener
    	{
    		public final int velocità = 80;
    		private Timer timer;
    		private int avanzamento;
    		public AzioniTasti()
    		{
    			avanzamento = 4;
    		}
    		public void keyPressed(KeyEvent event)
    		{
    			int keyCode = event.getKeyCode();
    			if (keyCode == KeyEvent.VK_LEFT)
    			{
    				spostaAstronave(-avanzamento,0);
    				repaint();
    			}
    			else if (keyCode == KeyEvent.VK_RIGHT)
    			{
    				spostaAstronave(avanzamento,0);
    				repaint();
    			}
    			else if (keyCode == KeyEvent.VK_Z)
    			{
    				missiliList.add(new Missile(xx,yy));
    				timer = new Timer(velocità, new ActionListener()
    					{
    						public void actionPerformed(ActionEvent e)
    							{
    								moveM();
    							}
    					});
    					timer.start();
    			}
    		}
    		public void keyReleased(KeyEvent event)
    		{
    			
    		}
    		public void keyTyped(KeyEvent event)
    		{
    			
    		}
    	}
    }
    
    class Missile
    {
    	private int xM;
    	private int yM;
    	private Image missile;
    	public Missile(int xxx, int yyy)
    	{
    		this.xM=xxx;
    		this.yM=yyy;
    		Toolkit kit = Toolkit.getDefaultToolkit();
    		missile = kit.getImage("missile1.gif");
    	}
    	
    	public Image getMissile()
    	{
    		return missile;
    	}
    	public int getXX()
    	{
    		return xM;
    	}
    	public int getYY()
    	{
    		return yM;
    	}
    	public void draw(Graphics2D g2d)
    	{
    		g2d.drawImage(missile,xM,yM,null);
    	}
    	public void move(int yyy)
    	{
    		yM = yM + yyy;
    	}
    }
    
    class Astronave
    {
    	private Image immagineAstronave;
    	public Astronave()
    	{
    		Toolkit kit = Toolkit.getDefaultToolkit();
    		immagineAstronave = kit.getImage("navicella.gif");
    	}
    	public Image getImmagineAstronave()
    	{
    		return immagineAstronave;
    	}
    }
    Ecco le immagini del missile e della navicella


    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da miticogilles
    ogni volta che lancio un missile nuovo mi aumenta la sua velocità in quanto (credo) il Timer aggiunge la velocità a quella esistente.
    Eh sì ... perché crei e avvii un nuovo timer ogni volta che premi Z. Ovvio che così non è utile ....

    Tu vuoi avere più missili contemporaneamente (perché istanzi ogni volta un nuovo Missile). Ma non dovresti istanziare proprio lì il Timer! Insomma, potresti farlo 1 volta sola in un altro momento (inizializzazione).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    credi sia più giusto implementare un metodo nella classe Missile che faccia partire un Timer riferito a quell'istanza dell'oggetto Missile??? Anche così, avrei un timer.start() ogni volta che creo un missile.

    Devo ringraziarti per la pazienza e soprattutto perchè coi tuoi esempi e i tuoi consigli ho capito molte cose che prima mi erano un pò oscure!!!

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da miticogilles
    credi sia più giusto implementare un metodo nella classe Missile che faccia partire un Timer riferito a quell'istanza dell'oggetto Missile??? Anche così, avrei un timer.start() ogni volta che creo un missile.
    Se tutti i missili devono avere le stesse tempistiche ... insomma, muoversi in sincronia, allora è meglio se usi 1 singolo timer nel cui evento fai muovere tutti i missili.
    Ma appunto intendo proprio 1 sola istanza del Timer.

    Poi c'è un'altra questione. Dal codice ho visto che aggiungi solo alla lista. Ma dovrai pure anche prima o poi rimuovere i missili dalla lista .... no?
    Perché potresti avere 2 scenari:
    - Il timer è sempre in esecuzione, se c'è qualcosa nella lista .... muove, altrimenti nulla ovviamente (nessun ciclo in quel for).
    - Il timer lo fai partire solo quando la lista contiene 1 missile e poi lo fermi quando la lista diventa vuota. Questo si può fare ma richiederebbe qualche accorgimento in più.

    Originariamente inviato da miticogilles
    Devo ringraziarti per la pazienza e soprattutto perchè coi tuoi esempi e i tuoi consigli ho capito molte cose che prima mi erano un pò oscure!!!
    Prego, anzi grazie, mi fa piacere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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