Ciao a tutti...
Vorrei sviluppare un'animazione per il mio progetto di un gioco da tavolo con java.
Classico tabellone, classici dadi random che si tirano e classico movimento della pedina.
Riesco bene a togliere la pedina dalla posizione iniziale e posizionarla in quella di arrivo.
Riesco meno bene a simulare il movimento in tutte le caselle intermedie...
Ho provato a implementare un timer. Le caselle sono jpanels in un array. Le pedine jlabel con imageicons. Il metodo muovi prende come parametri il giocatore (la sua posizione nell'arraylist per la verità), la posizione iniale nel tabellone e quella finale. Lo scorrimento lo gestisco nell'ActionPerformed della classe, in modo che ad ogni "colpo" del timer calcoli la casella successiva, tolga la pedina dalla casella corrente (remove), la metta in quella successiva (add) e aggiorni il tutto (repaint). Ciò che fa il metodo muovi quando viene invocato è inizializzare le variabili, start del timer, ciclare a "vuoto" con un while fino a che in qualche modo (appunto grazie all'actionperformed) la posizione corrente corrisponda a quella finale e stop del timer.
Mi pare che abbia senso... Ma invece a quanto pare no.
Invocare il muovi vuol dire impallare tutto, senza nessuna eccezione lanciata, e con il mio lieve sospetto che da quel while non riesca proprio ad uscirne.
Pareri?
codice:
public class Tabellone extends JPanel implements ActionListener... {
...
private JPanel caselle[] = new JPanel[20]; //ben caratterizzato nel costruttore
private ArrayList <JLabel> simboli = new ArrayList <JLabel> (); //ben caratterizzato nel costruttore
private Timer timer = new Timer(500,this); //timer.addActionListener(this); nel costruttore
private int giocatore,corr;
...
public void muovi(int giocatore, int iniziale, int finale) {
this.giocatore = giocatore;
timer.start();
corr = iniziale;
while (corr != finale);
timer.stop();
}
...
public void actionPerformed(ActionEvent e) {
int succ;
if (corr == 19)
succ = 0;
else
succ = corr + 1;
caselle[corr].remove((Component)simboli.get(giocatore));
caselle[succ].add(simboli.get(giocatore));
repaint();
corr = succ;
}