Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2013-05-02 15:27:04 Collision entre deux objets

julienes
membre
Date d'inscription: 2013-05-02
Messages: 11

Collision entre deux objets



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é.

http://codelab.fr/up/qrcode-1.jpg

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

 

#2 2013-05-06 09:17:53 Re : Collision entre deux objets

gundorf
membre
Date d'inscription: 2012-04-12
Messages: 36

Re: Collision entre deux objets



tu pourrais analyser les pixels de ton image. si le pixel est noir, tu changes la direction de ta balle.

Hors ligne

 

#3 2013-05-07 01:45:25 Re : Collision entre deux objets

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: Collision entre deux objets



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

 

#4 2013-05-07 09:42:59 Re : Collision entre deux objets

julienes
membre
Date d'inscription: 2013-05-02
Messages: 11

Re: Collision entre deux objets



Mon parcours est une classe dans laquelle je dessine avec des rect. Je vais essayer ça voir si ça fonctionne. Merci

Hors ligne

 

#5 2013-05-07 10:32:46 Re : Collision entre deux objets

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: Collision entre deux objets



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

 

#6 2013-05-08 08:46:07 Re : Collision entre deux objets

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Collision entre deux objets



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

 

#7 2013-05-15 21:37:35 Re : Collision entre deux objets

EricRG
membre
Lieu: Lorient
Date d'inscription: 2008-03-11
Messages: 171
Site web

Re: Collision entre deux objets



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


J'étudie Godot Engine. Mon site internet est : https://ericrogergarcia.legtux.org/

Hors ligne

 

#8 2013-05-17 14:24:59 Re : Collision entre deux objets

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Collision entre deux objets



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

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024