Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab
> Nouveau : partage de liens / une carte des membres

apéro codelab #14 à Rennes, vendredi 3 février 2012, appel à participation

#1 2010-07-29 19:13:43 Minim : multiple AudioPlayer

videoactif
membre
Lieu: Morteau
Date d'inscription: 2010-01-27
Messages: 52

Minim : multiple AudioPlayer



Bonjour,
J'essaie de faire une anim reactive, où lorsque une boule touche une cible , un son est emis.
Ça marche niquel, sauf quand j'en utilise plusieurs, le son se lance sans s'arrété, alors que si j'en ai qu'un le son est lu niquel...

ci joint mon applet pour que vous voyez le bug en direct live
et ci dessus mon code :

import ddf.minim.*;
import ddf.minim.signals.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
Minim minim;
AudioPlayer player;
AudioPlayer player2;
Balle maBalle;
Cible maCible;
Cible maCible2;
boolean toucher=false;
void setup(){
  size(640,480);
  frameRate(30);
   colorMode(HSB,360,1,1,1);
  minim = new Minim(this);
  maBalle=new Balle(100.0,100.0,20,0.3,0,0,color(360,1,1));
  maCible=new Cible(100.0,400.0,50);
  maCible2=new Cible(300.0,400.0,100);
  player = minim.loadFile("er-kick.wav",2048);
player2 = minim.loadFile("2.wav",2048);


  }
void draw(){
  background(208);
 if(maCible.contact(maBalle)){
   player.cue(0);
   player.play();
 }
 if(maCible2.contact(maBalle)){
   player2.cue(0);
   player2.play();
 }
maCible.display();
maCible2.display();
maBalle.display();

    maBalle.mouvement();
    
}
void stop()
{
  // always close Minim audio classes when you are done with them
  player.close();
   player2.close();
  minim.stop();
  
  super.stop();
}

classe Balle

// classe balle, qui contient tout les comportement d'une balle ( affichage, mouvement, contact )
class Balle
{
  // variable utile pour les balles
  float px,py;
  float taille;
  float vitesseVerticale;
  float vitesseHorizontale;
  float gravite;
  float accelerationHorizontale;
  color couleur;
  boolean toucher;


  // objet constructeur de balle

  Balle(float ix,float iy, float itaille,float iaccelerationHorizontale,float iVitesseHorizontale,float iVitesseVerticale,color icouleur){
    px=ix;
    py=iy;
    taille=itaille;
    couleur=icouleur;
    gravite=taille/100;
    accelerationHorizontale=iaccelerationHorizontale;
    vitesseHorizontale=iVitesseHorizontale;
    vitesseVerticale=iVitesseVerticale;
    toucher=false;

  }
  // affichage de la balle
  void display(){
    noStroke();
    fill(couleur);
    ellipse(px,py,taille,taille);
  }
  // deplacement de la balle, et reaction si collision avec un coté ou le bas de la fenètre, ainsi que gestion de la vitesse
  void mouvement(){
    py+=vitesseVerticale;
    vitesseVerticale+=gravite;
    px+=vitesseHorizontale;
    if(py>height){
      vitesseVerticale=vitesseVerticale*-0.9;
      py=height-taille/2;
    }
    if(px>width||px<0){
      if (abs(vitesseHorizontale)>3){
        vitesseHorizontale*=-0.9;
        accelerationHorizontale*=-1;
      } 
      else {
        vitesseHorizontale*=-1;
        accelerationHorizontale*=-1;
      }
    }
    if (abs(vitesseHorizontale)<3){
      vitesseHorizontale+=accelerationHorizontale;
    }
    if(px<0){
      px=10;
    }
    else if(px>width){
      px=width-10;

    } 
  }

  // detection de collision avec une autre balle, allant dans le sens inverse, si dans va dans le même sens pas de collision
  void contact(Balle secondeBalle,int i, int j){
    if(vitesseHorizontale*secondeBalle.vitesseHorizontale<0&&((width-px>10 || px>10) || (width-secondeBalle.px<10 || secondeBalle.px<10))){
      float disX = px - secondeBalle.px;
      float disY = py - secondeBalle.py;
      if(sqrt(sq(disX) + sq(disY)) < (taille/2+secondeBalle.taille/2 )) {
        
        vitesseHorizontale*=-1;
        secondeBalle.vitesseHorizontale*=-1;
        px+=vitesseHorizontale;
        secondeBalle.px+=secondeBalle.vitesseHorizontale;
        py+=vitesseVerticale;
        secondeBalle.py+=secondeBalle.vitesseVerticale;

      } 
    }
  }
}

classe Cible

class Cible{
  float posX;
  float posY;
  float taille;
  Balle Maballe;
  float disX;
  float disY;
  boolean toucher;
  
  Cible(float xT,float yT,float tailleT){
    posX=xT;
    posY=yT;
    taille=tailleT;
    toucher=false;
  }
  void display(){
    noFill();
    stroke(0,0,0,1);
    ellipse(posX,posY,taille,taille);
  }
  boolean contact(Balle maBalle){
     disX = posX - maBalle.px;
      disY = posY - maBalle.py;
      if(sqrt(sq(disX) + sq(disY)) < (taille/2+maBalle.taille/2 )&&!maBalle.toucher) {
      maBalle.toucher=true;
      toucher=true;
      
      
     }else if(sqrt(sq(disX) + sq(disY)) > (taille/2+maBalle.taille/2 )){
       maBalle.toucher=false;
       toucher=false; 
     }else{
       toucher=false;
     }
       
return toucher;
}
}

Vous pouvez réutilisez le code si vous le souhaitez.
Merci de m'avoir lue

Dernière modification par videoactif (2010-07-29 19:14:29)


Programming is like sex: one mistake and you’re providing support for a lifetime.  Michael Sinz

Hors ligne

 

#2 2010-07-30 10:23:35 Re : Minim : multiple AudioPlayer

videoactif
membre
Lieu: Morteau
Date d'inscription: 2010-01-27
Messages: 52

Re: Minim : multiple AudioPlayer



J'ai testé avec l'objet AudioSample, qui semble plus approprié a ce que je fait , mais le résultat est le même, dès que j'inclus deux fonction contact entre mes cible et la balle, le son lié a la  cible se lance en continu...


Programming is like sex: one mistake and you’re providing support for a lifetime.  Michael Sinz

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2012