Bonjour je travail sur une sorte de jeu pong un peu particulier, il s'agit d'un jeu pong tout seul et inversé, la balle se trouvant dans un arc non fermé, l'idée est que la balle soit renvoyé à l'extérieur de l'arc qui est mouvant les point sont soustrait d'un compteur chaque fois que la balle sortira de l'ecran, pour le moment je suis parvenu à obtenir ce que je souhaitais en terme de forme du jeu et d'animation, ce qui me pose problème par contre concerne le système de détection de collision, en effet j'aimerais que la raquette circulaire renvoie la balle comme dans le jeu original mais là, après pas mal de recherche je ne vois pas trop comment traiter le problème (avec une raquette plate c'est assez facile mais bon ici ???) quelqu'un aurait-il une idée en vous remerciant d'avance.
float angle = radians(250); float c=cos(angle); //float tailleBalle = 13; float nouvellePosXBalle = 250; float nouvellePosYBalle = 250; float deplacementXBalle = 2; float deplacementYBalle = -0.6; void setup(){ rotate(radians(90)); size(500,500); smooth(4); ellipseMode(CENTER); noLoop(); } void draw(){ background(255); action(); dessinerBalle(); mouvementBalle(); dessinerRaquette(); rebond(); } void keyPressed(){ loop(); } void mousePressed(){ loop(); } void action(){ if (key == CODED) { if (keyCode == LEFT) { c+=1; } if(keyCode == UP){ c=c; }else if (keyCode == RIGHT) { c-=1; } } } void rebond(){ if ( (nouvellePosXBalle+6 > width && deplacementXBalle > 0) || (nouvellePosXBalle-6 < 0 && deplacementXBalle < 0) ) { deplacementXBalle = -deplacementXBalle; } if ( (nouvellePosYBalle+6 > width && deplacementYBalle > 0) || (nouvellePosYBalle-6 < 0 && deplacementYBalle < 0) ) { deplacementYBalle = -deplacementYBalle; } } void dessinerBalle(){ //tailleBalle = tailleBalle +0.5; fill(200,0,0); noStroke(); ellipse(nouvellePosXBalle,nouvellePosYBalle,13,13); } void mouvementBalle(){ nouvellePosXBalle = nouvellePosXBalle + deplacementXBalle; nouvellePosYBalle = nouvellePosYBalle + deplacementYBalle; } void dessinerRaquette(){ translate(width/2,height/2); rotate(radians(c)); noFill(); stroke(200,0,0); strokeWeight(13); strokeCap(ROUND); arc(0,0,250,250,radians(-70),angle); }
Hors ligne
Bonjour,
Il existe un objet dans Processing qui est très utile pour ce type de problème :
https://www.processing.org/reference/PVector.html
Le PVector permet de stocker des coordonnées et de faire des opérations aisément d'addition de vecteurs etc.
Donc, ton code peut se simplifier. Voici une approche perfectible (il faut implémenter la sortie de le balle en fonction de l'angle) :
PVector position, vitesse, centre; float angle, taille; int rayonBalle, rayonRaquette, epaisseurRaquette; void setup() { size(500, 500); position = new PVector(200, 200); vitesse = new PVector(2, -0.6); centre = new PVector(width / 2, height / 2); angle = 0; taille = 360; rayonBalle = 7; rayonRaquette = 125; epaisseurRaquette = 14; smooth(4); ellipseMode(CENTER); noLoop(); } void draw() { background(255); action(); dessinerBalle(); mouvementBalle(); dessinerRaquette(); rebond(); } void keyPressed() { loop(); } void mousePressed() { loop(); } void action() { if (keyPressed) { if (key == CODED) { if (keyCode == LEFT) { angle += 2; } if (keyCode == RIGHT) { angle -= 2; } } } } void rebond() { if (position.dist(centre) > (rayonRaquette - rayonBalle - epaisseurRaquette / 2)) { float t = vitesse.mag(); PVector v = new PVector(position.x - centre.x, position.y - centre.y); float arc = PVector.angleBetween(vitesse, v); v.mult(-1); v.rotate(arc); v.normalize(); v.setMag(t); vitesse = v; taille -= 10; } } void dessinerBalle() { fill(200, 0, 0); noStroke(); ellipse(position.x, position.y, 2 * rayonBalle, 2 * rayonBalle); } void mouvementBalle() { position.add(vitesse); } void dessinerRaquette() { translate(centre.x, centre.y); rotate(radians(angle)); noFill(); stroke(200, 0, 0); strokeWeight(epaisseurRaquette); strokeCap(ROUND); arc(0, 0, 2 * rayonRaquette, 2 * rayonRaquette, 0, radians(taille)); }
Hors ligne
Salut Mushussu
Merci pour le code je vais le potasser , navré je n'ai pas été trop clair sur mon explication du jeu effectivement la balle rebondie à l'intérieur du cercle, mais la raquette ne change pas de taille par contre la balle oui (peut etre de quelques pixesl tout les 10 rebonds par exemple ou suivant un compteur je n'ai pas encore décidé ) donc l'objectif est de faire sortir la balle du cercle par le petit trou (c'est probablement pour cette raison que tu m'indiquais "il faut implémenter la sortie de le balle en fonction de l'angle" je suppose? le plus rapidement et donc marquer un point qui se soustraira d'un compteur affichant 999
Bref je vais essayer de comprendre le fonctionnement de Pvector, je te remercie d'avance de ne pas me donner la solution tout de suite J'épluche en ce moment la doc de référence sur le site de processing mais j'entrevois déjà l'intérêt de cette classe. (même si mon cerveau approche la fusion:)
Par contre j'en profite pour poser une autre question sous forme de piste différente qui m'est venue à l'esprit (en bon feignant) je m'étais demandé s'il n'était pas possible de faire détecter par la balle la couleur de la raquette bon je sais que mon code est simpliste et ne fonctionne pas en rebond mais je le place quand même
int nouvellePosXBalle = 250; int nouvellePosYBalle = 250; int deplacementXBalle = 2; int deplacementYBalle = -1; int c; void setup(){ background(255); size(400,400); frameRate(15); } void draw(){ background(255); dessinArc(); dessinCercle(); rebond(); color c = get(nouvellePosXBalle,200); println(red(c)); } void dessinCercle(){ // fill(200,0,0); // noStroke(); stroke (128,0,0); strokeWeight(2); ellipse(nouvellePosXBalle,200,10,10); nouvellePosXBalle = nouvellePosXBalle + deplacementXBalle; } void rebond(){ if ( (nouvellePosXBalle+5 > width && deplacementXBalle > 0 ) || (nouvellePosXBalle-5 < 0 && deplacementXBalle < 0) ) { deplacementXBalle = -deplacementXBalle; } if(c==25){ nouvellePosXBalle = -deplacementXBalle; } } void dessinArc(){ noFill(); stroke(25,0,0); strokeWeight(13); arc(width/2,height/2, 250, 250, radians(-180), radians(0)); }
Juste pour savoir si c'est une piste envisageable.
Merci pour tout
Hors ligne