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)
Hors ligne
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...
Hors ligne