Bonjour à tous,
Je suis débutant sur Processing, et pour un projet, j'aurai besoin de détecter une collision entre ma balle et les parois que j'ai dessiné.
J'ai créé une classe Mur pour les blocs noir avec le dessin complet et une classe Balle pour ma balle rouge.
Ma balle bouge grace aux touches du clavier.
J'ai commencé à créer des conditions definissant les zones des différents carré noir, mais cela me prendrait des heures... Il doit surement y avoir un autre moyen de tester si la balle touche une des parois noir?
Si vous avez besoin de plus de détails.
Merci d'avance.
Hors ligne
tu pourrais analyser les pixels de ton image. si le pixel est noir, tu changes la direction de ta balle.
Hors ligne
TU dessines comment ton parcours ?
Le plus simple serait d'estimer la position suivante de ta boule, si elle est dans le blanc tu la laisses se réaliser, sinon tu empèches le mouvement.
Hors ligne
Mon parcours est une classe dans laquelle je dessine avec des rect. Je vais essayer ça voir si ça fonctionne. Merci
Hors ligne
un truc qui est utilisé dans les jeux plateforme a l'ancienne c'est un tableau deux dimensions ou tu mets une valeur ( type 1 ou 0, dans ce cas la suffit d'un tableau booléen ) et selon la valeur c'est rempli ou non
je te conseille de jeter un oeil a l'exemple Topic>GUI>Buttons il montre comment détecter si quelque chose est dans un cercle ou non
Hors ligne
Bonjour,
La méthode pour y arriver n'est pas triviale. Le fait que tu utilises des classes montre que tu es sur la bonne voie. Voici ce que j'ai fait pour un élément de mur :
Element mur; Balle balle; void setup() { size(200, 200); rectMode(CORNERS); mur = new Element(new PVector(width / 2 - 20, height / 2 - 20), new PVector(width / 2 + 20, height / 2 + 20)); balle = new Balle(new PVector(0, 0), 20); noStroke(); } void draw() { background(255); PVector pos = mur.misAJour(balle.accesseurPosition(), balle.accesseurDiametre() / 2); mur.affichage(); balle.misAJourPosition(pos); balle.affichage(); } void keyPressed() { if (key == CODED) { if (keyCode == LEFT) { balle.deplacementX(-4); } if (keyCode == RIGHT) { balle.deplacementX(4); } if (keyCode == UP) { balle.deplacementY(-4); } if (keyCode == DOWN) { balle.deplacementY(4); } } } class Balle { PVector position; int diametre; Balle(PVector _position, int _diametre) { position = _position; diametre = _diametre; } void affichage() { fill(255, 0, 0); ellipse(position.x, position.y, diametre, diametre); } void misAJourPosition(PVector nouvellePosition) { position = nouvellePosition; } void deplacementX(int x) { position.x += x; } void deplacementY(int y) { position.y += y; } PVector accesseurPosition() { return position; } int accesseurDiametre() { return diametre; } } class Element { PVector coinNO, coinSE, coinNE, coinSO; Element(PVector _coinNO, PVector _coinSE) { coinNO = _coinNO; coinSE = _coinSE; coinNE = new PVector(coinSE.x, coinNO.y); coinSO = new PVector(coinNO.x, coinSE.y); } void affichage() { fill(0); rect(coinNO.x, coinNO.y, coinSE.x, coinSE.y); } PVector misAJour(PVector objet, int tailleObjet) { // Paroi Est if ((objet.x - tailleObjet < coinSE.x) && (objet.y >= coinNO.y) && (objet.y <= coinSE.y) && (objet.x > coinNO.x)) { objet.x = coinSE.x + tailleObjet; } // Paroi Ouest if ((objet.x + tailleObjet > coinNO.x) && (objet.y >= coinNO.y) && (objet.y <= coinSE.y) && (objet.x < coinSE.x)) { objet.x = coinNO.x - tailleObjet; } // Paroi Sud if ((objet.y - tailleObjet < coinSE.y) && (objet.x >= coinNO.x) && (objet.x <= coinSE.x) && (objet.y > coinNO.y)) { objet.y = coinSE.y + tailleObjet; } // Paroi Nord if ((objet.y + tailleObjet > coinNO.y) && (objet.x >= coinNO.x) && (objet.x <= coinSE.x) && (objet.y < coinSE.y)) { objet.y = coinNO.y - tailleObjet; } // Coin Nord-Ouest if ((objet.x < coinNO.x) && (objet.y < coinNO.y) && (PVector.dist(objet, coinNO) < tailleObjet)) { PVector direction = PVector.sub(objet, coinNO); direction.normalize(); direction.mult(tailleObjet); objet = PVector.add(coinNO, direction); } // Coin Nord-Est if ((objet.x > coinNE.x) && (objet.y < coinNE.y) && (PVector.dist(objet, coinNE) < tailleObjet)) { PVector direction = PVector.sub(objet, coinNE); direction.normalize(); direction.mult(tailleObjet); objet = PVector.add(coinNE, direction); } // Coin Sud-Est if ((objet.x > coinSE.x) && (objet.y > coinSE.y) && (PVector.dist(objet, coinSE) < tailleObjet)) { PVector direction = PVector.sub(objet, coinSE); direction.normalize(); direction.mult(tailleObjet); objet = PVector.add(coinSE, direction); } // Coin Sud-Oest if ((objet.x < coinSO.x) && (objet.y > coinSO.y) && (PVector.dist(objet, coinSO) < tailleObjet)) { PVector direction = PVector.sub(objet, coinSO); direction.normalize(); direction.mult(tailleObjet); objet = PVector.add(coinSO, direction); } return objet; } }
Il reste à faire une ArrayList de tout les éléments de ton mur.
Je ne sais pas comment tu génères ton QRCode. Mais si c'est une image tu peux construire une méthode pour transformer une image en ArrayList.
Bon courage.
Hors ligne
Bonjour,
la méthode regardant si la prochaine position est noire (en regardant les points de l'écran fonctionne) .
Je l'ai utilisée pour mon jeu de l'abeille cf ici le jeu : http://educatif.eau-et-rivieres.asso.fr … php?Rub=11
Je regarde tout autour de mon objet pour détecter dans quelle direction je vais rencontrer la couleur du mur bleu et hop
Utilisé pour détecter les collisions de l'abeille et des produits chimiques avec les murs bleus du pac man
Hors ligne
Bon, puisque l'initiateur du fil de discussion n'a pas posé de plus amples questions, je joins le sketch réalisé.
Ce la donnera des idées à certain.
Hors ligne