View Full Version : [JAVA] striscie impazzite :(
australopiteci
03-02-2005, 18:15
salve a tutti, mi servirebbe una mano. In quest'applet invece di creare un animazione di punti che si muovono in direzioni casuali, mi crea delle striscie....
sto impazzendo AIUTO:muro:
australopiteci
03-02-2005, 18:43
Mi sono dimenticato il codice...sono impazzito ;)
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
import java.util.Random;
import javax.swing.*;
import java.util.ArrayList;
public class CatchForms extends JApplet
{
private final int AMPIEZZA_CAS = 10;
/*altezza dell'applet*/
private final int ALTEZZA = 400;
/*larghezza dell'applet*/
private final int LARGHEZZA = 400;
/*ritardo impostato nel clock*/
private final int DELAY = 500;
/*direzioni consentite*/
private final int NORD = 0;
private final int NORD_EST = 1;
private final int EST = 2;
private final int SUD_EST = 3;
private final int SUD = 4;
private final int SUD_OVEST = 5;
private final int OVEST = 6;
private final int NORD_OVEST = 7;
/*flag per far partire il gioco*/
private boolean inizioFlag;
/*numero di forme presenti nell applet*/
private int NUMERO_FORME;
//timer che verrà usato per generare il movimento
private Timer timerAnimazione;
/*array in cui ad ogni indice corrisponde una forma*/
private int[] direzione;
private ArrayList<Point> oggetti;
/**
* Richiamato dal browser o dall'appletviewer per informare il JApplet che
* è stato caricato nel sistema. E' sempre richiamato prima che il metodo
* start sia richiamato per la prima volta.
*/
public void init()
{
/*imposta la dimensiona dell'applet*/
setSize(ALTEZZA, LARGHEZZA);
/*imposta il colore dello sfondo*/
setBackground(Color.black);
/*crea un generatore di numeri casuali*/
Random genera = new Random();
/*imposta la flag per la partenza del gioco a false*/
inizioFlag = false;
/*crea un oggetto di tipo Timer*/
timerAnimazione = new Timer (DELAY, new AnimationActionListener() );
/*fai partire il timer*/
timerAnimazione.start();
NUMERO_FORME = 4;
direzione = new int[NUMERO_FORME];
oggetti = new ArrayList<Point> ();
/*crea un ascoltatore di eventi del mouse*/
addMouseListener (new inizioMouseListener () );
/*inizializza le posizioni di ogni forma all'avvio dell'applet*/
for ( int i = 0; i < NUMERO_FORME; i++)
{
oggetti.add (new Point( (10 + i) * AMPIEZZA_CAS, (10 + i) * AMPIEZZA_CAS) );
direzione[i] = Math.abs(genera.nextInt()) % 8;
}
}
/**
* metodo paint dell'applet.
* disegna le figure geometriche nella loro posizione attuale
* @param page l'oggetto Graphics per questo applet
*/
public void paint(Graphics page)
{
if (inizioFlag == true){
int xAux,yAux;
Point puntoAux;
for ( int i = 0; i < oggetti.size (); i++)
{
puntoAux = (Point)oggetti.get (i);
xAux = (int) puntoAux.getX ();
yAux = (int) puntoAux.getY ();
page.setColor(Color.red);
page.fillRect(xAux,yAux,10, 10);
}
}
}
/**
* metodo paint dell'applet.
* disegna le figure geometriche nella loro posizione attuale
* @param page l'oggetto Graphics per questo applet
*/
private class inizioMouseListener implements MouseListener
{
public void mouseEntered (MouseEvent event)
{
inizioFlag = true;
repaint ();
}
public void mousePressed (MouseEvent event) {};
public void mouseClicked (MouseEvent event) {};
public void mouseReleased (MouseEvent event) {};
public void mouseExited (MouseEvent event) {};
}
/**
*classe interna utilizzata per creare l'animazione del movimento delle
*form
*/
private class AnimationActionListener implements ActionListener
{
public void actionPerformed (ActionEvent event)
{
/*variabile temporanea utilizzata per scambiare le direzioni */
int aux ;
/*per ogni forma modifica la posizione in base alla direzione*/
for ( int i = 0; i < oggetti.size (); i++)
{
int xTemp,yTemp;
Point puntoTemp;
puntoTemp = (Point)oggetti.get (i);
xTemp = (int) puntoTemp.getX ();
yTemp = (int) puntoTemp.getY ();
/*muovi nella direzione scelta*/
switch(direzione[i])
{
case NORD:
{
yTemp -= AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
case EST:
{
xTemp += AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
case SUD:
{
yTemp += AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
case OVEST:
{
xTemp -= AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
case NORD_EST:
{
xTemp += AMPIEZZA_CAS;
yTemp += AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
case SUD_EST:
{
xTemp += AMPIEZZA_CAS;
yTemp -= AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
case SUD_OVEST:
{
xTemp -= AMPIEZZA_CAS;
yTemp -= AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
case NORD_OVEST:
{
xTemp -= AMPIEZZA_CAS;
yTemp += AMPIEZZA_CAS;
puntoTemp.setLocation(xTemp,yTemp);
}
break;
}
}
repaint();
}
}
}
australopiteci
04-02-2005, 09:06
dai aiutatemi! ... ditemi almeno se posso udsare gli arraylist o se con questi arraylist non fa
end.is.forever
04-02-2005, 10:21
Vedi delle "linee" perchè non ridisegni lo sfondo e ogni volta aggiungi i punti senza cancellare quelli del frame precedente; questo succede perchè estendi JApplet, la quale ridefinisce il metodo update di Component eliminando il ridisegno del background.
Una prima soluzione molto semplice è cambiare
public class CatchForms extends JApplet
con
public class CatchForms extends Applet
e vedi che non hai più il problema.
Se invece ti serve che sia una JApplet puoi ridefinire update aggiungendo questo
public void update( Graphics page )
{
page.setColor( getBackground() );
page.fillRect( 0 , 0 , page.getClipBounds().width , page.getClipBounds().height );
page.setColor( getForeground() );
paint( page );
}
anche così funziona; non so quale dei due sia più efficiente però perchè non conosco bene JApplet, forse c'è un modo per fargli ridisegnare il background senza dover ridefinire il metodo.
australopiteci
04-02-2005, 10:37
end.is.forever: GRAZIE GRAZIE GRAZIE GRAZIE GRAZIE GRAZIE 10000000000000000000000 :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.