MUX101
Classe principale
//################################################################################
// INITIALISATION VARIABLE ET IMPORT LIBRAIRIE
//################################################################################
//on importe la librairie minim afin de pouvoir jouer les sons du dossier data
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;
//Pour l'utilisation du son, on définit lesvariables utilisées par minim
Minim minim;
AudioSample Do,re,mi,fa,sol,la,si,Do2,Do_d,fa_d,sol_d,la_d,re_d;
//////
//variables pour les couleurs
//////
float R = random(0, 255);
float G = random(0, 255);
float B = random(0, 255);
//////
//on initialise les variables déplacements
//////
int dx = 1; int dx2 = 1; int dx3 = 1; int dx4 = 1;
int dy = 0; int dy2 = 0; int dy3 = 0; int dy4 = 0;
//////
//variable clavier: on lance la balle si clavier = true, permet de jouer une mélodie sans interaction de la balle
//////
boolean clavier = false;
//On initialise les balles
Balle balle1 = new Balle(60, 360, color(R, G, B));
Balle balle2 = new Balle(540, 360, color(random(255), random(255), random(255)));
Balle balle3 = new Balle(540, 480, color(random(255), random(255), random(255)));
Balle balle4 = new Balle(60, 480, color(random(255), random(255), random(255)));
//on fait un tableau des flêches voulues avec la rotation de départ
// F0---F1---F2---F3
// | |
// F7---F6---F5---F4
Fleche[] fleches = {
new Fleche(60, 360, 90),
new Fleche(220, 360, 90),
new Fleche(360, 360, 90),
new Fleche(540, 360, 180),
new Fleche(60, 480, 0),
new Fleche(220, 480, 270),
new Fleche(360, 480, 270),
new Fleche(540, 480, 270)
};
//################################################################################
// SETUP ET DRAW
//################################################################################
void setup(){
size(600, 600);
minim = new Minim(this);//on démarre le moteur et on ajoute les sons
Do = minim.loadSample("DO.mp3", 512);
re = minim.loadSample("RE.mp3", 512);
mi = minim.loadSample("MI.mp3", 512);
fa = minim.loadSample("FA.mp3", 512);
sol = minim.loadSample("SOL.mp3", 512);
la = minim.loadSample("LA.mp3", 512);
si = minim.loadSample("SI.mp3", 512);
Do2 = minim.loadSample("DO_Octave.mp3", 512);
fa_d = minim.loadSample("fa_dièse.mp3", 512);
sol_d = minim.loadSample("sol_dièse.mp3", 512);
la_d = minim.loadSample("la_dièse.mp3", 512);
re_d = minim.loadSample("re_dièse.mp3", 512);
Do_d = minim.loadSample("Do_dièse.mp3", 512);
}
void draw(){
background(255);
stroke(0);
dessine();
piano();
//Dessin des flèches: Pour chaque élément du tableau flêches on la dessine
for(Fleche fleche : fleches){fleche.display();};
//on dessine les balles aux positions précédemment définies
balle1.display();
balle2.display();
balle3.display();
balle4.display();
if(clavier == true){// je fais bouger la balle que si on appuie sur espace
balle1.mouvement();
balle2.mouvement();
balle3.mouvement();
balle4.mouvement();
}
balle1.setSpeed(dx, dy);// on donne un déplacement à balle en x et en y
balle2.setSpeed(dx2, dy2);
balle3.setSpeed(dx3, dy3);
balle4.setSpeed(dx4, dy4);
son();// méthode jouant les sons de la balle lorsqu'elle passe une flêche
collision();// methode déplaçant les balles en fonction de la direction des flêches
}
//################################################################################
// METHODES DESSIN PIANO
//################################################################################
// fond noir sur la moitié supérieure
void dessine(){
fill(0);
rect(0, 0, 600, 300);
}
//piano
void piano(){
fill(255);
rect(65,25,55,250);//Do
rect(125,25,55,250);//re
rect(185,25,55,250);//mi
rect(245,25,55,250);//fa
rect(305,25,55,250);//sol
rect(365,25,55,250);//la
rect(425,25,55,250);//si
rect(485,25,55,250);//DO
fill(#555555);
rect(100,25,40,140);//les dièses
rect(160,25,40,140);
rect(280,25,40,140);
rect(340,25,40,140);
rect(400,25,40,140);
rect(520,25,20,140);
}
//################################################################################
// METHODES MOUVEMENT BALLE EN FONCTION DES FLECHES
//################################################################################
void collision(){
//////
//Mouvement de la balle en fonction du sens des flêches
//////pour chaque élément du tableau fleches je regarde si ma balle à 2 pixels prêts est sur la flêche, je regarde le sens de la flêche et j'applique un mouvement (ceci permet de palier au pb de frame qui saute si le calcul est trop long)
for(Fleche fleche : fleches){
if((balle1.getX() > fleche.getX() - 2) && (balle1.getX() < fleche.getX() + 2) && (balle1.getY() > fleche.getY() - 2) && (balle1.getY() < fleche.getY() + 2)){
switch((int)fleche.getRotation()) {// on caste car getRotation est de type float et on fait chaque cas de rotation de 90
case 0://en haut
dx = 0;
dy = -1;
break;
case 90://à droite
dx = 1;
dy = 0;
break;
case 180://en bas
dx = 0;
dy = 1;
break;
case 270:// à gauche
dx = -1;
dy = 0;
break;
}
} // on duplique le code pour les 3 autres balles
if((balle2.getX() > fleche.getX() - 2) && (balle2.getX() < fleche.getX() + 2) && (balle2.getY() > fleche.getY() - 2) && (balle2.getY() < fleche.getY() + 2)){
switch((int)fleche.getRotation()) {// on caste car getRotation est de type float et on fait chaque cas de rotation de 90
case 0://en haut
dx2 = 0;
dy2 = -1;
break;
case 90://à droite
dx2 = 1;
dy2 = 0;
break;
case 180://en bas
dx2 = 0;
dy2 = 1;
break;
case 270:// à gauche
dx2 = -1;
dy2 = 0;
break;
}
}
if((balle3.getX() > fleche.getX() - 2) && (balle3.getX() < fleche.getX() + 2) && (balle3.getY() > fleche.getY() - 2) && (balle3.getY() < fleche.getY() + 2)){
switch((int)fleche.getRotation()) {// on caste car getRotation est de type float et on fait chaque cas de rotation de 90
case 0://en haut
dx3 = 0;
dy3 = -1;
break;
case 90://à droite
dx3 = 1;
dy3 = 0;
break;
case 180://en bas
dx3 = 0;
dy3 = 1;
break;
case 270:// à gauche
dx3 = -1;
dy3 = 0;
break;
}
}
if((balle4.getX() > fleche.getX() - 2) && (balle4.getX() < fleche.getX() + 2) && (balle4.getY() > fleche.getY() - 2) && (balle4.getY() < fleche.getY() + 2)){
switch((int)fleche.getRotation()) {// on caste car getRotation est de type float et on fait chaque cas de rotation de 90
case 0://en haut
dx4 = 0;
dy4 = -1;
break;
case 90://à droite
dx4 = 1;
dy4 = 0;
break;
case 180://en bas
dx4 = 0;
dy4 = 1;
break;
case 270:// à gauche
dx4 = -1;
dy4 = 0;
break;
}
}
}
}
//////
//action au clic
//pour chaque élément du tableau flêches on évalue la position de la souris dans un carré de 55 pixels autour ( précision du clik)
//et on applique la rotation de la flêche
//////
void mouseClicked(){
for(Fleche fleche : fleches){
if((mouseX > fleche.getX() - 55) && (mouseX < fleche.getX() + 55) && (mouseY > fleche.getY() - 55) && (mouseY < fleche.getY() + 55)){
fleche.setRotation(fleche.getRotation() + 90);
}
}
//////
//limite de rotation des flèches du haut
//////
if(fleches[0].getRotation() > 180){fleches[0].setRotation(90);};// 90 au départ, donc si on dépasse 180 on réinit à 90. Donc on a une flêche D et une flêche B
if(fleches[1].getRotation() > 270){fleches[1].setRotation(90);};//on autorise 3 positiosn D,B,G si on reclik et on depasse 270 on met la valeur à 90
if(fleches[2].getRotation() > 270){fleches[2].setRotation(90);};//...
if(fleches[3].getRotation() > 270){fleches[3].setRotation(180);};
//////
//limite de rotation des flèches du bas, même système qu'au dessus
//////
if(fleches[4].getRotation() > 90){fleches[4].setRotation(0);};// 0 au départ donc si > 90 on réinit DONC H et G
if(fleches[5].getRotation() > 90 && fleches[5].getRotation() < 270){fleches[5].setRotation(270);};// si on est entre 90 et 270 on réinit à 270
if(fleches[5].getRotation() > 270){fleches[5].setRotation(0);}// donc on ne peut avoir que 2 positions H et D
if(fleches[6].getRotation() > 90 && fleches[6].getRotation() < 270){fleches[6].setRotation(270);};// ...
if(fleches[6].getRotation() > 270){fleches[6].setRotation(0);};
if(fleches[7].getRotation() > 0 && fleches[7].getRotation() < 270){fleches[7].setRotation(270);};
if(fleches[7].getRotation() > 270){fleches[7].setRotation(0);};
}
//################################################################################
// METHODES SON ET ACTION CLAVIER / SOURIS
//################################################################################
//////
// on joue un son lorsque la balle passe une flêche et on colorie la touche du piano
//////
void son(){
if(clavier == true){
if((balle1.getX()==60 && balle1.getY()==360)||(balle2.getX()==60 && balle2.getY()==360)||(balle3.getX()==60 && balle3.getY()==360)||(balle4.getX()==60 && balle4.getY()==360)){
Do.trigger();
fill(#FA606A);
rect(65,25,55,250);
fill(#555555);
rect(100,25,40,140);
}
if((balle1.getX()==220 && balle1.getY()==360)||(balle2.getX()==220 && balle2.getY()==360)||(balle3.getX()==220 && balle3.getY()==360)||(balle4.getX()==220 && balle4.getY()==360)){
re.trigger();
fill(#FA606A);
rect(125,25,55,250);
fill(#555555);
rect(100,25,40,140);
rect(160,25,40,140);
}
if((balle1.getX()==380 && balle1.getY()==360)||(balle2.getX()==380 && balle2.getY()==360)||(balle3.getX()==380 && balle3.getY()==360)||(balle4.getX()==380 && balle4.getY()==360)){
mi.trigger();
fill(#FA606A);
rect(185,25,55,250);
fill(#555555);
rect(160,25,40,140);
}
if((balle1.getX()==540 && balle1.getY()==360)||(balle2.getX()==540 && balle2.getY()==360)||(balle3.getX()==540 && balle3.getY()==360)||(balle4.getX()==540 && balle4.getY()==360)){
fa.trigger();
fill(#FA606A);
rect(245,25,55,250);
fill(#555555);
rect(280,25,40,140);
}
if((balle1.getX()==60 && balle1.getY()>=480)||(balle2.getX()==60 && balle2.getY()>=480)||(balle3.getX()==60 && balle3.getY()>=480)||(balle4.getX()==60 && balle4.getY()>=480)){
Do2.trigger();
fill(#FA606A);
rect(485,25,55,250);
fill(#555555);
rect(520,25,20,140);
}
if((balle1.getX()==220 && balle1.getY()>=480)||(balle2.getX()==220 && balle2.getY()>=480)||(balle3.getX()==220 && balle3.getY()>=480)||(balle4.getX()==220 && balle4.getY()>=480)){
si.trigger();
fill(#FA606A);
rect(425,25,55,250);
fill(#555555);
rect(400,25,40,140);
}
if((balle1.getX()==380 && balle1.getY()>=480)||(balle2.getX()==380 && balle2.getY()>=480)||(balle3.getX()==380 && balle3.getY()>=480)||(balle4.getX()==380 && balle4.getY()>=480)){
la.trigger();
fill(#FA606A);
rect(365,25,55,250);
fill(#555555);
rect(340,25,40,140);
rect(400,25,40,140);
}
if((balle1.getX()==540 && balle1.getY()>=480)||(balle2.getX()==540 && balle2.getY()>=480)||(balle3.getX()==540 && balle3.getY()>=480)||(balle4.getX()==540 && balle4.getY()>=480)){
sol.trigger();
fill(#FA606A);
rect(305,25,55,250);
fill(#555555);
rect(280,25,40,140);
rect(340,25,40,140);
}
}
}
//////
//action du clavier : on change la couleur de la touche du piano et on joue un son
////// lettres autorisées (min ou maj): q,s,d,f,j,k,l,m et z,e,t,u,i,p
void keyPressed(){
if (key == 32){//espace
clavier = true;//sert pour faire avancer les balles
}
if (key == 10){//entrée
clavier = false;//arrête les balles si on veut jouer simplement au piano par exemple
}
if(key == 'q' || key =='Q'){
Do.trigger();
fill(#FA606A);
rect(65,25,55,250);
fill(#555555);
rect(100,25,40,140);
}
if(key == 'z' || key =='Z'){
Do_d.trigger();
fill(#52B5F5);
rect(100,25,40,140);
}
if(key == 's' || key =='S'){
re.trigger();
fill(#FA606A);
rect(125,25,55,250);
fill(#555555);
rect(100,25,40,140);
rect(160,25,40,140);
}
if(key == 'e' || key =='E'){
re_d.trigger();
fill(#52B5F5);
rect(160,25,40,140);
}
if(key == 'd' || key =='D'){
mi.trigger();
fill(#FA606A);
rect(185,25,55,250);
fill(#555555);
rect(160,25,40,140);
}
if(key == 'f' || key =='F'){
fa.trigger();
fill(#FA606A);
rect(245,25,55,250);
fill(#555555);
rect(280,25,40,140);
}
if(key == 't' || key =='T'){
fa_d.trigger();
fill(#52B5F5);
rect(280,25,40,140);
}
if(key == 'j' || key =='J'){
sol.trigger();
fill(#FA606A);
rect(305,25,55,250);
fill(#555555);
rect(280,25,40,140);
rect(340,25,40,140);
}
if(key == 'u' || key =='U'){
sol_d.trigger();
fill(#52B5F5);
rect(340,25,40,140);
}
if(key == 'k' || key =='K'){
la.trigger();
fill(#FA606A);
rect(365,25,55,250);
fill(#555555);
rect(340,25,40,140);
rect(400,25,40,140);
}
if(key == 'i' || key =='I'){
la_d.trigger();
fill(#52B5F5);
rect(400,25,40,140);
}
if(key == 'l' || key =='L'){
si.trigger();
fill(#FA606A);
rect(425,25,55,250);
fill(#555555);
rect(400,25,40,140);
}
if(key == 'm' || key =='M'){
Do2.trigger();
fill(#FA606A);
rect(485,25,55,250);
fill(#555555);
rect(520,25,20,140);
}
if(key == 'p' || key =='P'){
Do_d.trigger();
fill(#52B5F5);
rect(520,25,20,140);
}
}
//////
//On peut aussi cliquer avec la souris pour jouer de la musique au piano
//////
void mousePressed(){
if((mouseX>65 && mouseX<120 && mouseY>165 && mouseY<275) || (mouseX>65 && mouseX<100 && mouseY>25 && mouseY<=165) ){
Do.trigger();
fill(#FA606A);
rect(65,25,55,250);
fill(#555555);
rect(100,25,40,140);
}
if(mouseX>100 && mouseX<140 && mouseY>25 && mouseY<165){
Do_d.trigger();
fill(#52B5F5);
rect(100,25,40,140);
}
if((mouseX>125 && mouseX<180 && mouseY>165 && mouseY<275) || (mouseX>140 && mouseX<160 && mouseY>25 && mouseY<=165) ){
re.trigger();
fill(#FA606A);
rect(125,25,55,250);
fill(#555555);
rect(100,25,40,140);
rect(160,25,40,140);
}
if(mouseX>160 && mouseX<200 && mouseY>25 && mouseY<165){
re_d.trigger();
fill(#52B5F5);
rect(160,25,40,140);
}
if((mouseX>185 && mouseX<240 && mouseY>165 && mouseY<275) || (mouseX>200 && mouseX<240 && mouseY>25 && mouseY<=165) ){
mi.trigger();
fill(#FA606A);
rect(185,25,55,250);
fill(#555555);
rect(160,25,40,140);
}
if((mouseX>245 && mouseX<300 && mouseY>165 && mouseY<275) || (mouseX>245 && mouseX<280 && mouseY>25 && mouseY<=165) ){
fa.trigger();
fill(#FA606A);
rect(245,25,55,250);
fill(#555555);
rect(280,25,40,140);
}
if(mouseX>280 && mouseX<320 && mouseY>25 && mouseY<165){
fa_d.trigger();
fill(#52B5F5);
rect(280,25,40,140);
}
if((mouseX>305 && mouseX<360 && mouseY>165 && mouseY<275) || (mouseX>320 && mouseX<340 && mouseY>25 && mouseY<=165) ){
sol.trigger();
fill(#FA606A);
rect(305,25,55,250);
fill(#555555);
rect(280,25,40,140);
rect(340,25,40,140);
}
if(mouseX>340 && mouseX<380 && mouseY>25 && mouseY<165){
sol_d.trigger();
fill(#52B5F5);
rect(340,25,40,140);
}
if((mouseX>365 && mouseX<420 && mouseY>165 && mouseY<275) || (mouseX>380 && mouseX<400 && mouseY>25 && mouseY<=165) ){
la.trigger();
fill(#FA606A);
rect(365,25,55,250);
fill(#555555);
rect(340,25,40,140);
rect(400,25,40,140);
}
if(mouseX>400 && mouseX<440 && mouseY>25 && mouseY<165){
sol_d.trigger();
fill(#52B5F5);
rect(400,25,40,140);
}
if((mouseX>425 && mouseX<480 && mouseY>165 && mouseY<275) || (mouseX>440 && mouseX<480 && mouseY>25 && mouseY<=165) ){
si.trigger();
fill(#FA606A);
rect(425,25,55,250);
fill(#555555);
rect(400,25,40,140);
}
if((mouseX>485 && mouseX<540 && mouseY>165 && mouseY<275) || (mouseX>485 && mouseX<520 && mouseY>25 && mouseY<=165) ){
Do2.trigger();
fill(#FA606A);
rect(485,25,55,250);
fill(#555555);
rect(520,25,20,140);
}
if(mouseX>520 && mouseX<540 && mouseY>25 && mouseY<165){
Do_d.trigger();
fill(#52B5F5);
rect(520,25,20,140);
}
}
Classe Balle
class Balle{
int x, y, dx, dy;
color couleur;
//////
//Constructeur
//////
Balle(int x, int y, color couleur) {
this.x = x;
this.y = y;
this.couleur = couleur;
}
//////
//Fonctions get pour retourner la position en x ou en y da la balle
//////
int getX(){
return x;
}
int getY(){
return y;
}
//////
//Fonctions déterminant la vitesse de la balle
//////
void setSpeed(int dx, int dy){
this.dx = dx;
this.dy = dy;
}
//////
//Dessin de la balle
//////
void display(){
fill(couleur);
ellipse(x, y, 40, 40);
}
//////
//Mouvement de la balle
//////
void mouvement(){
this.x = x + this.dx;
this.y = y + this.dy;
}
}
Classe Fleche
class Fleche{
int x, y;
float rotation;
//////
//Constructeur
//////
Fleche(int x, int y, float rotation){
this.x = x;
this.y = y;
this.rotation = rotation;
}
//////
//Fonctions get
//////
int getX(){
return x;
}
int getY(){
return y;
}
float getRotation(){
return rotation;
}
//////
//Fonctions Set
//////
void setRotation(float rotation){
this.rotation = rotation;
}
//////
//Dessin de la flèche: permet d'appliquer un sens de la flêche grâce à translate/rotate
//////
void display(){
pushMatrix();//on met dans une matrice
strokeWeight(2);//épaisseur
translate(x, y);//on translate sur x et y
rotate(radians(rotation));//on applique la rotation
line(0, 0, 0, -50);//on dessine la flêche, le corps
line(0, -50,-10, -40); // une extrémité
line(0, -50, +10, -40);// puis l'autre
popMatrix();//on l'enlève de la matrice
}
}
Ajouter un commentaire