PDA

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 :)