Déplacement vers un point aléatoire qui change à chaque tour
Bonjour!
J'ai un petit casse-tête à soumettre:
Le contexte:
Un aquarium contient des éléments ( cailloux, algues, poissons) qui barbotent gaiement dans l'eau. Les poissons (éléments mobiles) se déplacent vers une destination calculée aléatoirement à l'aide d'une méthode go().
Un timer (classe Time) applique dans une boucle infinie la méthode go() sur un aquarium. La méthode go() est donc "relancée à chaque tic".
Le problème:
La destination aléatoire est recalculée à chaque "tic". La méthode de déplacement (move) n'est appelée qu'une fois avant que tout soit relancé et la destination recalculée... Le poisson n'a jamais la possibilité d'arriver à destination.
La contrainte principale c'est que target(), qui calcule cette position, ne peut être appliquée que sur un MobileItem ( et bien sur il y a dans le vector parcouru des "non MobileItem" en plus des MobileItems.
J'ai l'impression d'avoir tout essayé dans tous les sens : des while, des if, rien y fait. Je désespère, alors je fait appel à vous. J'espère que quelqu'un pourra m'aider un peu.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public void go(){ // fait bouger (move) les objets vers une destination (target)
Point destination = null;
for(int i=0; i < this.items.size() ; i++){ // on parcourt la collection d'objet
if(this.items.elementAt(i) instanceof MobileItem){ // si l'objet est mobile
destination = ((MobileItem) this.items.elementAt(i)).target(null); // on définit une destination aléatoire pour l'objet
((MobileItem) this.items.elementAt(i)).move(destination); // l'objet se déplace vers la destination
}
try{
Thread.sleep(100);
}
catch(InterruptedException e){}
this.repaint();
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
public boolean move(Point destination){ // cette fonction déplace l'item vers une destination, et retourne un booléen indiquand s'il est arrivé à destination
if( this.position.x != destination.x){
if(this.position.x < destination.x){
this.position.x += 5;
}
else
this.position.x -= 5;
}
// même chose pour les y
if (this.position == destination)
return true;
else
return false;
} |