Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44

    qualcuno fermi questa pallina!!!

    ciao qualcuno mi può spiegare come funzionano i timer? io devo far fermare la pallina per esempio ogni 2 secondi, e stare ferma tipo un secondo, e poi ripartire.

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.Timer;

    /*
    Muove un cerchio da sinistra a destra, quando cozza la parete
    destra il moto si inverte ecc.
    */

    class MuoviCerchio extends Panel implements ActionListener
    {

    int raggio; /* raggio del cerchio */
    int millisec; /* ogni quanti millisecondi si muove */
    Timer timer; /* per regolare l'animazione */
    boolean versoDestra; /* da che parte va */
    int x_min; /* ascissa minima corrente del cerchio */

    public MuoviCerchio (int raggio_cerchio, int velocita)
    {
    raggio = raggio_cerchio;
    millisec = velocita;
    x_min = 0; /* cerchio appoggiato a parete sinistra */
    versoDestra = true; /* direzione di moto */
    timer = new Timer(millisec,this);
    timer.start();
    }

    /* azione da compiere quando scatta il timer, sposta il cerchio
    e poi invoca il ridisegno */
    public void actionPerformed(ActionEvent e)
    {
    Dimension d = getSize();
    if (versoDestra)
    {
    if (x_min>(d.width-2*raggio)) /* cozza parete destra */
    { versoDestra = false;
    x_min--;
    }
    else x_min++;
    }
    else
    {
    if (x_min<=0) /* cozza parete sinistra */
    { versoDestra = true;
    x_min++;
    }
    else x_min--;
    }
    repaint();
    }

    public void paint(Graphics g)
    {
    super.paint(g);
    Dimension d = getSize();
    g.setColor( Color.blue );
    g.fillArc(x_min, (d.height/2-raggio), 2*raggio, 2*raggio, 0, 360);
    }

    public static void main(String[] args)
    {
    Frame f = new Frame("MuoviCerchio");
    MuoviCerchio pp = new MuoviCerchio(30,50);
    pp.setBackground(Color.white);
    f.add(pp);
    f.setSize(new Dimension(300,100));
    f.setVisible(true);
    }
    }


    grazie in anticipo.

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

    Re: qualcuno fermi questa pallina!!!

    Originariamente inviato da emix0880
    ciao qualcuno mi può spiegare come funzionano i timer?
    javax.swing.Timer funziona in modo molto semplice (proprio come hai fatto): istanzi Timer e gli passi il tempo in millisecondi e l'oggetto che fa da "listener", poi lo avvii con start(). Ogni tot di tempo verrà generato un evento ActionEvent che sarà inviato ai listener registrati (solo 1 nel tuo caso).

    Originariamente inviato da emix0880
    io devo far fermare la pallina per esempio ogni 2 secondi, e stare ferma tipo un secondo, e poi ripartire.
    Beh, qui si tratta di fare una gestione "al di sopra" del timer. Cioè non è il timer che può fare una simile gestione "particolare" ma se tu che devi gestirla opportunamente.
    Si può fare in diversi modi, sia con 1 solo timer che con 2 timer (più complesso) ad esempio.

    Nel tuo codice il delay l'hai messo di 50 millisecondi, quindi in teoria si hanno 20 temporizzazioni al secondo. Se vuoi usare 1 solo timer basta che usi una semplice variabile di istanza che fa da contatore. Ad ogni evento del timer la incrementi di 1. Se l'oggetto deve muoversi per 2 secondi e stare fermo per 1 secondo, è semplice: per 40 conteggi lo fai muovere e per altri 20 non lo fai muovere. Il tuo contatore andrà da 0 a 59 (poi lo resetti a 0), fino a 39 lo fai muovere, mentre da 40 a 59 non aggiorni nulla e non fai repaint().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44
    ciao aldbin grazie per l, aiuto e la tempestività.
    ho modificato il codice cosi:
    if ((t>=0) && (t<= 39))
    { repaint();}
    else if (t==59){
    repaint();
    t=0;
    }

    gli effetti sono quelli desiderati, ma mi sembra che dopo la pausa la pallina riparte in modo non tanto fluido. è normale?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da emix0880
    ciao aldbin grazie per l, aiuto e la tempestività.
    ho modificato il codice cosi:
    if ((t>=0) && (t<= 39))
    { repaint();}
    else if (t==59){
    repaint();
    t=0;
    }

    gli effetti sono quelli desiderati, ma mi sembra che dopo la pausa la pallina riparte in modo non tanto fluido. è normale?
    Deduco (dal pezzetto che hai postato) che tutta la logica che aggiorna le coordinate la fai sempre in ogni caso ... mentre invece vedo che è condizionato dal contatore solo il repaint(). Ovviamente non va bene. Perché quando non fai il repaint() il resto lo fai lo stesso.

    Io farei una cosa del tipo:
    codice:
    public void actionPerformed(ActionEvent e)
    {
        if (t < 40)
        {
            logicaMovimento();    // fai un metodo che gestisce il movimento
            repaint();
        }
    
        if (++t == 60)
            t = 0;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44
    esatto quando la palla era ferma le x continuavano a avanzare e quando doveva ripartire si aggiorna alla x attuale e non a quella in cui si e fermata. grazie ancora...

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.