Bonjour.
Comment dois-je faire pour détecter un obstacle dans le programme suivant.
Merci.
PVector deplacement,position,mur,obstacle; void setup(){ size(500,500); deplacement=new PVector(-2,3); position=new PVector(random(0,500),random(0,500)); mur=new PVector(random(10,480),random(10,480)); obstacle=new PVector(random(10,120),random(20,200)); } void draw(){ background(255); collision_mur(); collision_obstacle(); mouvement(); display(); } void collision_mur(){ if(position.x<0||position.x>width) { deplacement.x=deplacement.x*-1; } if(position.y<0||position.y>height) { deplacement.y=deplacement.y*-1; } } void collision_obstacle(){ } void mouvement(){ position.add(deplacement); } void display(){ fill(255,0,0); rect(mur.x,mur.y,obstacle.x,obstacle.y); fill(0,255,0); ellipse(position.x,position.y,20,20); }
Hors ligne
Voilà une piste, mais l'utilisation de classe faciliterais la vision de la programmation :
PVector deplacement, position, positionPrecedente, mur, obstacle; color c; void setup() { size(500, 500); deplacement=new PVector(-2, 3); position=new PVector(random(0, 500), random(0, 500)); positionPrecedente = new PVector(position.x, position.y); mur=new PVector(random(10, 480), random(10, 480)); obstacle=new PVector(200, 100); } void draw() { background(255); mur.x = mouseX; mur.y = mouseY; collision_mur(); collision_obstacle(); mouvement(); display(); } void collision_mur() { if (position.x<0 || position.x>width) { deplacement.x=deplacement.x*-1; } if (position.y<0||position.y>height) { deplacement.y=deplacement.y*-1; } } void collision_obstacle() { c = color(255, 0, 0); if ((position.x > mur.x) && (position.x < mur.x + obstacle.x) && (position.y > mur.y) && (position.y < mur.y + obstacle.y)) { c = color(225); if ((positionPrecedente.x > mur.x) && (positionPrecedente.x < mur.x + obstacle.x)) { deplacement.y *= -1; } else { deplacement.x *= -1; } } } void mouvement() { positionPrecedente = position.get(); position.add(deplacement); } void display() { fill(c); rect(mur.x, mur.y, obstacle.x, obstacle.y); fill(0, 255, 0); ellipse(position.x, position.y, 20, 20); }
Hors ligne
bonjour.
Je te remercie pour ton programme,mais je ne comprends pas à quoi sert exactement positionprécédende?.
Merci.
Hors ligne
Avec uniquement la variable position, nous ne pouvons tester que la présence de l'objet dans le mur. Il nous manque la précision de la face du mur qui est touchée.
Pour cela, nous introduisons la variable positionPrecedente qui va nous donner la direction du déplacement.
Le test est très simple, si la position précédente est dans la bande verticale définie par les côtés gauche et droit du mur. Alors la face franchie est soit celle du haut soit celle du bas, donc c'est le deplacement.y qui est modifié.
Sinon, c'est deplacement.x.
Elle est superflue, mais permet une meilleure lisibilité, nous pourrions écrire cela :
PVector deplacement, position, mur, obstacle; color c; void setup() { size(500, 500); deplacement=new PVector(-2, 3); position=new PVector(random(0, 500), random(0, 500)); mur=new PVector(random(10, 480), random(10, 480)); obstacle=new PVector(200, 100); } void draw() { background(255); mur.x = mouseX; mur.y = mouseY; collision_mur(); collision_obstacle(); mouvement(); display(); } void collision_mur() { if (position.x<0 || position.x>width) { deplacement.x=deplacement.x*-1; } if (position.y<0||position.y>height) { deplacement.y=deplacement.y*-1; } } void collision_obstacle() { c = color(255, 0, 0); if ((position.x > mur.x) && (position.x < mur.x + obstacle.x) && (position.y > mur.y) && (position.y < mur.y + obstacle.y)) { c = color(225); if (((position.x - deplacement.x)> mur.x) && ((position.x - deplacement.x)< mur.x + obstacle.x)) { deplacement.y *= -1; } else { deplacement.x *= -1; } } } void mouvement() { position.add(deplacement); } void display() { fill(c); rect(mur.x, mur.y, obstacle.x, obstacle.y); fill(0, 255, 0); ellipse(position.x, position.y, 20, 20); }
Hors ligne