Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di sgogghy
    Registrato dal
    Sep 2010
    Messaggi
    237

    animazione

    ciao a tutti,
    siccome non ho trovato una sezione di presentazione mi presenti quì...Ciao a tutti sono Sgogghy.
    ok adesso passo al mio problema:
    ho appena incominciato un progetto in java per l'università (e ho appena incominciato a conoscere java), il primo ostacolo che ho incontrato è l'animazione di una figura.

    Questo è il mio pannello:

    package splash;
    import java.awt.*;
    import javax.swing.*;

    public class MyPanel extends JPanel {
    Image img1, img2;

    public MyPanel (){
    Toolkit tk=Toolkit.getDefaultToolkit();
    img1= tk.getImage ("/home/sgogghy/Immagini/tux.jpg");
    img2= tk.getImage ("/home/sgogghy/Scrivania/Icon_SpaceInvaders.png");
    MediaTracker mt= new MediaTracker(this);
    mt.addImage(img1, 1);
    mt.addImage(img2, 1);
    try {mt.waitForAll();}
    catch (InterruptedException e) {}
    }
    public void paint(Graphics g) {
    g.drawImage(img1, 1, 1, null);
    g.drawImage(img2, 1, 1, null);
    }
    }

    Ho provato con dei cicli for e con dei cicli while nella classe PAINT ma manca cmq qualcosa e non so cosa.
    Ho provato anche a cercare su internet ma non capisco mai come utilizzare le informazioni che mi vengono date.
    Spero di trovare quì la risposta...

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Quando posti del codice utilizza gli appositi tag CODE: oltre al fatto che è scritto nel regolamento del forum, rende il listato leggibile per chi ti può aiutare.

    Iniziare a studiare Java partendo dalle API grafiche non mi sembra per nulla una buona idea: immagino tu abbia già nozioni di programmazione, ma senza una conoscenza delle basi del linguaggio incontrerai sicuramente delle grosse difficoltà e, molto probabilmente, spesso non avrai la più pallida idea di quello che stai in realtà facendo.

    Comunque, per quanto riguarda il tuo programma... Dando per scontato che il tuo pannello sia correttamente inserito in una finestra, da quel che riesco a vedere il problema è nel metodo paint(): tutte le volte che aggiorni il pannello vengono ridisegnate entrambe le immagini, mentre tu invece devi disegnarne una sola.
    Quello che farei (ma probabilmente ci saranno soluzioni migliori) è creare un Thread che, ogni x millisecondi, vada a memorizzare dentro una variabile di istanza l'immagine da disegnare, aggiornando subito dopo il pannello: il metodo paint() con la sua drawImage() farà riferimento a questa variabile.

  3. #3
    Utente di HTML.it L'avatar di sgogghy
    Registrato dal
    Sep 2010
    Messaggi
    237
    Grazie per le correzioni, non sono abituato a scrivere nei forum di solito trovo sempre quello che mi serve.
    Ho iniziato a studiare java all'università ma è stato un corso di neanche 2 mesi e una piccola parte di grafica (infatti sono rimasto stupito che il progetto fosse solo sulla parte grafica).
    Ci hanno spiegato la sintassi del linguaggio ma (chiaramente) all'università ci hanno concesso poca pratica e ho dovuto sgalvirmi da solo.

    Cmq ho provato a fare un thread come mi hai consigliato:

    codice:
    package splash; 
    import java.awt.*; 
    import javax.swing.*; 
    import javax.swing.ImageIcon;
    public class MyPanel extends JPanel implements Runnable{    
    Image img1, img;     
    Thread t;     
    int lung;    
     int i=0;     
     public MyPanel (){         
                             Toolkit tk=Toolkit.getDefaultToolkit();        
                             img1= tk.getImage ("/home/sgogghy/Immagini/tux.jpg");          
                             MediaTracker mt= new MediaTracker(this);         
                             mt.addImage(img1, 1);                  
                             try {mt.waitForAll();}         
                             catch (InterruptedException e) {}     
                            } 
      
    public void init(){     
    img = new ImageIcon ("/home/sgogghy/Scrivania/Icon_SpaceInvaders.png").getImage(); }  
    public void start() {     
                               if (t == null) {        
                               t = new Thread(this);        
                               t.start();}  
                              }  
    public void pause(int time) {     
                                           try { t.sleep(time); }      
                                           catch (InterruptedException e) {}   
                                          }  
    public void run (){     
                             for (i=0;i<1000;i++) // ho pensato ad un piccolo spostamento     
                            {     
                              repaint();     
                              pause(1000);}
                            } 
    public void paint(Graphics g) {  
                                             g.drawImage(img1, 1, 1, null);       
                                             g.drawImage(img, i, 1, null);
                                            }
    }
    il risultato che ottengo è la visualizzazione di img1 ma non di img.
    Dove sbaglio?

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    In realtà io avrei creato una nuova classe che estendesse Thread... ma penso possa andare bene anche come hai fatto tu.

    Premettendo che immagino che ci sia un chiamante esterno che invoca il metodo start() di MyPanel... come da documentazione, creare un nuovo Thread passandogli un target "Runnable" in fase di costruzione implica che, quando invocherai il metodo start(), esso richiami direttamente il run() del target, senza eseguire i suoi (eventuali) init() e start().
    (EDIT: anche perchè, poichè Runnable prevede il solo run(), il Thread non potrebbe sapere se possiede anche questi due metodi).
    In realtà il codice che avevi scritto nel primo post era corretto: quello che dovevi aggiungere era un meccanismo che facesse in modo che le due immagini venissero mostrate in maniera alternata.
    Semplicemente, potresti utilizzare un contatore che viene incrementato di uno ad ogni esecuzione del Thread, il quale esegue una repaint() e poi si rimette in sleep; nel metodo paint(), se tale contatore è pari visualizza la prima immagine, mentre se è dispari visualizza la seconda.

  5. #5
    Utente di HTML.it L'avatar di sgogghy
    Registrato dal
    Sep 2010
    Messaggi
    237
    no va bè a me basta anche semplicemente muovere un immagine soltanto non è necessario che si muovano tutte e due, per questo non usato la tua idea (che mi era venuta in mente).
    Però nell'ultimo codice che ho inserito, non capisco come mai non si veda l'immagine che vorrei muovere.
    Nel metodo init() è giusto come ho inserito l'immagine?
    Questo è il mio main:

    codice:
     package splash; 
    import java.applet.*; 
    import java.awt.*;  
    public class Main {        
                             public static void main(String[] args) {        
                             Finestra window1 = new Finestra();         
                             window1.CreaFinestra();        
                             MyPanel p = new MyPanel();                 
                             p.start();                         } 
                             }
    Nella classe CreaFinestra, oltre alla dimensione e tutto il resto per la finetsra, c'è l'istruzione
    codice:
    this.add(new MyPanel());

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ok, ora ho capito cosa vuoi fare.
    Il problema è nelle istruzioni

    codice:
    MyPanel p = new MyPanel();
    p.start();
    Stai creando e invocando start() su un nuovo pannello, non su quello che stai visualizzando nella Finestra window1.
    Carica l'immagine "img" nel costruttore, così come hai fatto per "img1": come ti ho detto, il metodo init() che hai inserito nel pannello non viene mai invocato (implementi un Runnable, non un Thread)

  7. #7
    Utente di HTML.it L'avatar di sgogghy
    Registrato dal
    Sep 2010
    Messaggi
    237
    ok ho capito.
    L'immagine adesso si vede ma è ferma.
    Come devo invocare start() per farla muovere?

  8. #8
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Immagino che il metodo CreaFinestra() (per standard sarebbe meglio rinominarlo creaFinestra(), con l'iniziale minuscola) della classe Finestra invochi anche una setVisible(true): potresti chiamare la start() sul pannello subito prima di questa istruzione

  9. #9
    Utente di HTML.it L'avatar di sgogghy
    Registrato dal
    Sep 2010
    Messaggi
    237
    si funziona!
    Grazie mille sei stato utilissimo.
    Però adesso ho tante altre domande
    Invece che estendere alla classe JApplet avessi esteso alla classe Thread, avrei dovuto creare anche il metodo init() con l'acquisizione dell'immagine all'interno?..estendendo alla classe Thread ho notate anche che il mi da errore sul metodo repaint(), come faccio allora a ridisegnare ad ogni ciclo?

  10. #10
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    (Perchè estendere "alla" classe? Si dice estendere "la" classe! )

    Allora, che c'entri una JApplet nella tua applicazione lo scopro ora... stai parlando della classe "Finestra", di cui non hai mai postato il codice?
    Una applet e un thread sono due cose distinte: la prima è una mini-applicazione fatta per girare all'interno di un browser (tecnologia ormai caduta parecchio in disuso e, da un punto di vista personale, con pochi rimpianti); il secondo è un sottoprocesso "leggero" (lightweight) che permette di introdurre i concetti di parallelismo e concorrenza in una macchina virtuale Java.
    Non è che "scegli" se estendere l'una o l'altro... l'impiego delle due tecnologie non è alternativo, e dipende da cosa vuoi realizzare e come vuoi realizzarlo.

    Una presentazione del ciclo di vita di una applet la trovi qua (vedi anche le pagine seguenti, che trovi seguendo il link "Next" in basso):

    http://www.cafeaulait.org/course/week5/27.html

    Un Thread non ha un metodo init(): ce lo puoi mettere tu, se vuoi, ma non è previsto dalle specifiche e quindi non verrà mai richiamato automaticamente. Dove mettere il caricamento dell'immagine dipende da questioni progettuali, non esiste una risposta a priori.

    In merito all'errore che dici di riscontrare sul repaint()... ho bisogno di vedere il codice coinvolto e tutti i dettagli sull'errore (messaggio e stacktrace)

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.