Annonce

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


#1 2016-03-24 12:29:56 Détection de collision

Serapheim
nouveau membre
Date d'inscription: 2016-03-24
Messages: 5

Détection de collision



Bonjour (ou bonsoir),

je travaille sur un projet pour mes cours avec Processing et je n'arrive pas à corriger mon code.

Voilà l'idée: j'ai récupéré un code d'un serpent qui suit la souris et je l'ai modifié pour qu'il soit en POO, jusque là tout fonctionne. Ensuite j'ai ajouté des "créatures" qui se déplacent aléatoirement dans l'écran et j'aimerai que lorsque mon serpent les touche elles changent de couleur. Mon professeur nous avais déjà montré un code de ce genre et je l'ai donc réutilisé. Le problème c'est que même si le code fonctionne (tout s'affiche) les "créatures" ne changent pas de couleur quand je les touche.

Ci-joint le fichier compressé et je colle aussi le code ici:

sketch principal :

Creature [] creatures;
Serpent serpent;

void setup () {

size (900, 750);

creatures = new Creature [20];
 
  for (int i=0; i<creatures.length; i++) {
   
    Creature creature = new Creature();
    creatures [i] = creature;
   
  }

serpent = new Serpent ();
}

void draw () {

background (255);

for (int i=0; i<creatures.length; i++) {
   
    Creature creature = creatures [i];
    creature.update();
   
  }
 
  for (int i=0; i<creatures.length; i++) {
   
    Creature creature = creatures [i];
    creature.checkEdges();
    creature.isHitBy();
    creature.display();
   
  }

serpent.display(0, mouseX - 8, mouseY - 8);
serpent.queue();

}

classe Creature :


class Creature {
 
  PVector location;
  PVector velocity;
  int maxSpeed;
  int radius;
  color couleur;
 
  Creature(){
   
    radius = 12;
    location = new PVector(width/2, height/2);
    velocity = new PVector(0, 0);
    maxSpeed = 6;
    couleur = color(#A3EAC9);

  }
  void update(){
   
    PVector acceleration = PVector.random2D();
    acceleration.mult(random(2));

    velocity.add(acceleration);
    velocity.limit(maxSpeed);
    location.add(velocity);
   
   
  }
  void display(){
   
    noStroke();
    stroke(0);
    strokeWeight(1);
    fill(couleur);
    ellipse(location.x, location.y, radius*2, radius*2);
   
  }
 
  void checkEdges() {

    if (location.x > width) {
      location.x = 0;
    }
    else if (location.x < 0) {
      location.x = width;
    }

    if (location.y > height) {
      location.y = 0;
    }
    else if (location.y < 0) {
      location.y = height;
    }
  }
    void editColor(){
    couleur = color(random(255), random(255), random(255));
  }
  boolean isHitBy(){
       
    if(location.x == mouseX && location.y == mouseY){
      //println("collision");
      editColor();
      return true;
     
    } else {
      return false;
    }
   
  }
 
}

classe Serpent :

class Serpent {
 
PVector location;
PVector velocity;

int maxSpeed;

float taille;
float [] x;
float [] y;

Serpent () {

location = new PVector (mouseX, mouseY);
velocity = new PVector (0, 0);

maxSpeed = 5;

taille = 15;
x= new float [20];
y= new float [20];

}

void display (int i, float xin, float yin) {
 
  float dx = xin - x[i];
  float dy = yin - y[i];
  float angle = atan2(dy, dx); 
  x[i] = xin - cos(angle) * taille;
  y[i] = yin - sin(angle) * taille;
 
  pushMatrix();
  translate(x[i], y[i]);
  rotate(angle);
 
  color c;
 
  if ( i % 3 == 1 )
    c = color(83, 124, 47, 255);
  else if ( i % 3 == 2 )
    c = color(142, 117, 93, 255);
  else
    c = color(219, 207, 71, 255);

  stroke( c );
  strokeWeight(15);
  line(0, 0, taille, 0);
 
  if ( i == 0 )
  {
   
   noStroke();
   fill(0, 255);
   ellipse(taille, -2, 3, 3);
   ellipse(taille, 2, 3, 3);
   
  }
 
   popMatrix();
}

void queue () {

  for(int i=0; i < x.length-1; i++) {
    display(i+1, x[i], y[i]);
  }
}

}

Merci d'avance smile

Dernière modification par Serapheim (2016-04-06 13:49:29)

Hors ligne

 

#2 2016-03-24 19:12:32 Re : Détection de collision

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

Re: Détection de collision



Bonjour,

Il y a plusieurs éléments à ajouter. D'abord dans ta classe Serpent ajouter une méthode qui donne la position du serpent :

 PVector position() {
    return new PVector(x[0], y[0]);
  }

Ensuite dans la classe Creature modifier la méthode isHitBy comme suit :

boolean isHitBy(PVector serpentPos) { 
    if (dist(serpentPos.x, serpentPos.y, location.x, location.y) < radius) {
      //println("collision");
      editColor();
      return true;
    } else {
      return false;
    }
  }

Pour finir dans la classe principale, tu peux modifier la méthode draw :

void draw () {
  //herbe.resize (width, height);
  //background(herbe);
  background (255);
  for (int i = 0; i < creatures.length; i++) {
    creatures[i].update();
    creatures[i].checkEdges();
    creatures[i].isHitBy(serpent.position());
    creatures[i].display();
  }
  serpent.display(0, mouseX, mouseY);
  serpent.queue();
}

Hors ligne

 

#3 2016-03-24 20:21:51 Re : Détection de collision

Serapheim
nouveau membre
Date d'inscription: 2016-03-24
Messages: 5

Re: Détection de collision



Parfait, ça fonctionne merci beaucoup ! big_smile

Hors ligne

 

#4 2016-04-06 13:51:26 Re : Détection de collision

Serapheim
nouveau membre
Date d'inscription: 2016-03-24
Messages: 5

Re: Détection de collision



Bonjour,

j'ai amélioré mon code et maintenant le serpent mange les créatures.
J'aimerai afficher le score du joueur avec un compteur mais j'ai un problème.
J'arrive à afficher le score mais le compteur reste à zéro.

J'ai joint le fichier à mon premier message (snake project.zip).

Merci smile

Hors ligne

 

#5 2016-04-06 14:49:38 Re : Détection de collision

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

Re: Détection de collision



Bonjour,

Tu as bien avancé.
Tu avais créé une méthode score dans la classe Creature. Or le score dépend du nombre d'instances de la classe Creature, donc est indépendant de celle-ci.
A la fin de la boucle draw(), il faut juste afficher le nombre de créatures maximum moins la taille de ton ArrayList.
Voici le fichier corrigé.
J'ai enlevé l'affichage du curseur.

Hors ligne

 

#6 2016-04-06 15:32:21 Re : Détection de collision

Serapheim
nouveau membre
Date d'inscription: 2016-03-24
Messages: 5

Re: Détection de collision



C'est génial merci ! Et merci pour le curseur je savais même pas que c'était faisable.
Je continue à l'améliorer smile

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2025