Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    problema con lancio missile

    Ragazzi, aiuto... stò facendo un misero giochino in java (tipo space invaders) ma mi sono fermato perchè non riesco a fare un metodo che permetta al missile di avanzare verso l'alto della finestra. Per semplificare vi metto tutto il codice:

    Codice PHP:
    import java.awt.*;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.util.*;

    public class 
    Astro3
    {
        public static 
    void main(String[]args)
        {
            
    Frame1 frame = new Frame1();
            
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
    frame.setVisible(true);
        }
    }
    class 
    Frame1 extends JFrame
    {
        public 
    Frame1()
        {
            
    Toolkit kit Toolkit.getDefaultToolkit();
            
    Dimension d kit.getScreenSize();
            
    larghezzaSchermo d.width;
            
    altezzaSchermo d.height;
            
    setResizable(false);
            
    setSize(LARGHEZZAALTEZZA);
            
    setLocation((larghezzaSchermo-LARGHEZZA)/2,(altezzaSchermo-ALTEZZA)/2);
            
    Container contenitore this.getContentPane();
            
    Pannello1 pannello = new Pannello1();
            
    pannello.setBackground(Color.BLACK);
            
    contenitore.add(pannello);
            
        }
        
        private 
    int larghezzaSchermo;
        private 
    int altezzaSchermo;
        public static final 
    int LARGHEZZA 800;
        public static final 
    int ALTEZZA 600;
    }
    class 
    Pannello1 extends JPanel
    {
        public 
    Pannello1()
        {
            
    Movimenti mov_nav = new Movimenti();
            
    this.addKeyListener(mov_nav);
            
    astronave = new Astronave();
            
    xx 400;
            
    yy 500;
            
    navicella astronave.getNavicella();
            
    spari = new ArrayList();
            
        }
        public 
    boolean isFocusable()
        {
            return 
    true;
        }
        
        public 
    void add(int xint y)
        {
            
    xx xx x;
            
    yy yy y;
        }
        
        public 
    void paintComponent(Graphics g)
        {
            
    super.paintComponent(g);
            
    g2 = (Graphics2D)g;
            
            
    g2.drawImage(navicella,xx,yy,null);
            
            for(
    int i 0spari.size(); i++)
            {
                
    Missile m = (Missile)spari.get(i);
                
    Image M m.getMissile();
                
    int xM m.getMissileX();
                
    int yM m.getMissileY();
                
    int vM m.getMissileV();
                
    g2.drawImage(M,xM,yM,null);
                

                
    repaint();
            }
            
    repaint();
        }
        
        private class 
    Movimenti implements KeyListener
        
    {
            public 
    Movimenti()
            {
                
    avanzamento 4;
            }
            public 
    void keyPressed(KeyEvent event)
            {
                
    int keyCode event.getKeyCode();
                
                if (
    keyCode == KeyEvent.VK_LEFT)
                {
                    
    add(-avanzamento,0);
                }
                else if (
    keyCode == KeyEvent.VK_RIGHT)
                {
                    
    add(avanzamento,0);
                }
                else if (
    keyCode == KeyEvent.VK_Z)
                {
                    
    Missile missile = new Missile(xx,yy);
                    
    spari.add(missile);
                }
            }
            public 
    void keyReleased(KeyEvent event)
            {
                
            }
            public 
    void keyTyped(KeyEvent event)
            {
                
            }
            private 
    int avanzamento;
        }
        
        private 
    Astronave astronave;
        private 
    Image navicella;
        private 
    Graphics2D g2;
        private 
    int xx;
        private 
    int yy;
        private 
    ArrayList spari;

    }
    class 
    Astronave
    {
        public 
    Astronave()
        {
            
    Toolkit kit Toolkit.getDefaultToolkit();
            
    navicella kit.getImage("navicella.gif");
        }
        public 
    Image getNavicella()
        {
            return 
    navicella;
        }
        
        private 
    Image navicella;
    }
    class 
    Missile
    {
        public 
    Missile(int axint ay)
        {
            
    coordinateMissileX ax;
            
    coordinateMissileY ay;
            
    Toolkit kit Toolkit.getDefaultToolkit();
            
    missile kit.getImage("missile1.gif");
            
    velocitàMissile 2;
        }
        public 
    Image getMissile()
        {
            return 
    missile;
        }
        public 
    int getMissileX()
        {
            return 
    coordinateMissileX;
        }
        public 
    int getMissileY()
        {
            return 
    coordinateMissileY;
        }
        public 
    int getMissileV()
        {
            return 
    velocitàMissile;
        }
        
        private 
    Image missile;
        private 
    int coordinateMissileX;
        private 
    int coordinateMissileY;
        private 
    int velocitàMissile;

    Immagini allegate Immagini allegate

    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: problema con lancio missile

    Originariamente inviato da miticogilles
    stò facendo un misero giochino in java (tipo space invaders) ma mi sono fermato perchè non riesco a fare un metodo che permetta al missile di avanzare verso l'alto della finestra.
    Se questo oggetto deve muoversi per "conto suo" devi chiaramente gestire una apposita temporizzazione, con un thread o un timer.

    Dovresti gestire la cosa forse più in generale, ovvero una classe es. Sprite con le sottoclassi per i vari elementi da gestire. E fare in modo che ognuno abbia un suo "comportamento" es. avanza() che gestisce la progressione dello stato e magari un altro metodo che "sappia" dove/come disegnarsi su un Graphics. Gestito in modo "polimorfico".
    Il tutto temporizzato, cioè ogni tot di tempo fai avanzare di stato tutti gli oggetti che possono muoversi per conto loro e alla fine chiedi un repaint.

    E nota, a proposito di repaint, fare un repaint() in paintComponent() non è affatto una buona cosa!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    grazie per la spiegazione... ma una domanda??
    Se creo i metodi lanciaMissili() nella classe Missili come faccio a dirgli di disegnarli nel pannello... la classe Missili non sa niente del metodo paintComponent(). Forse devo costruire un nuovo missile (quando premo "z") con questa chiamata:
    Codice PHP:
    Missile M = new Missile(xx,yy,g2); 
    dove g2 e la Graphics2D utilizzata nel metodo paintComponent()?
    Dico bene?
    Oppure, come faccio a dire alla classe Missile di disegnarmi il missile nel pannello?

    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
    Se creo i metodi lanciaMissili() nella classe Missili come faccio a dirgli di disegnarli nel pannello... la classe Missili non sa niente del metodo paintComponent().
    Vero ... ma Sprite potrebbe definire un disegna(Graphics2D g), che implementi nelle varie sottoclassi.

    La tua classe del pannello, enumera i vari Sprite e invoca disegna() su ognuno ... potrebbe anche non sapere che cosa sono questi oggetti!!
    Insomma ... la soluzione pulita e corretta è sfruttare classi/interfacce e polimorfismo .... detto in generale la "programmazione ad oggetti"!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    un'ultima cosa:
    hai detto che fare un rapaint() nel metoto paintComponent() non va bene... posso chiederti perchè?

    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
    hai detto che fare un rapaint() nel metoto paintComponent() non va bene... posso chiederti perchè?
    È come un gatto che gira e rigira mentre cerca di afferrare la propria coda ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    ho provato a fare come hai detto ma il codice mi viene compilato ma quando lo vado ad eseguire mi rimanda una serie di errori esagerata.
    Ho rifatto la classe Astronave così:

    Codice PHP:

    class Astronave
    {
        public 
    Astronave(Graphics2D gra2Dint xint y)
        {
            
    xN x;
            
    yN y;
            
    grafica2D gra2D;
            
    Toolkit kit Toolkit.getDefaultToolkit();
            
    navicella kit.getImage("../navicella.gif");
        }
        public 
    Image getNavicella()
        {
            return 
    navicella;
        }
        public 
    void disegna()
        {
            
    grafica2D.drawImage(navicella,xN,yN,null);
        }
        private 
    Image navicella;
        private 
    Graphics2D grafica2D;
        private 
    int xN;
        private 
    int yN;

    e nel metodo paintComponent del pannello ho messo:

    Codice PHP:
    public void paintComponent(Graphics g)
        {
            
    super.paintComponent(g);
            
    g2 = (Graphics2D)g;
            
            
    astronave.disegna();
             
    repaint();
            
         } 
    Dove ho sbagliato????

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

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da miticogilles
    Codice PHP:
    class Astronave
    {
        public 
    Astronave(Graphics2D gra2Dint xint y)
        { 
    Dove ho sbagliato????
    No, non devi passare il Graphics2D al costruttore!!! Il Graphics2D non è un qualcosa di "costante" cioè che può perdurare per molto tempo!!! Devi passarlo ogni volta a disegna() dal paintComponent().

    E ripeto che repaint() non va bene in paintComponent().

    Devi usare un thread o meglio un timer (quello di Swing) per cui ad intervalli di tempo: a) fai "avanzare" le varie entità (quelle che si muovono "da sole") e b) alla fine invochi repaint().

    Nel paintComponent() devi solo scansionare una lista di queste entità ed invocare il disegna() su ognuna.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    credo di avere capito... preparo l'esempio e lo metto on-line appena finito e testato.

    Grazie.... sei stato gentilissimo, paziente ed asaustivo... non so come ringraziarti.

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

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.