//BLOCK SWAP par Walter Siracusa LG_GRILLE=8, HT_GRILLE=9; //Largeur, hauteur de la grille (en cases) CASE=50; //Largeur et hauteur d'une case (en pixels) NB_BLOC=7; //Nombre de pièces différentes NB_LINE=3; //Longueur minimale d'un alignement VT_FALL=10; //Vitesse de chute des pièces (sous-multiple de CASE) VT_SWAP=5; //Vitesse d'échange des pièces (sous-multiple de CASE) Destroying=false,Falling=false,Swapping=false; Score=0; //Nombre de pièces détruites Blk=new Object(); //Objet Blk pour gérer les échanges des pièces Blk.clic=false; //Booléen de clic sur une pièce Blk.state=1; //Etats de sélection/échange des pièces GAME_TIME=120000 // = 2 minutes Timer0=getTimer(); //Timer pour gérer la durer de la partie //Association des sons Snd_swap=new Sound(); //Echange Snd_swap.attachSound("swap.mp3"); Snd_unswap=new Sound(); //Re-échange Snd_unswap.attachSound("unswap.mp3"); Snd_line=new Sound(); //Alignement Snd_line.attachSound("line.mp3"); Snd_zik=new Sound(); //Musique de fond Snd_zik.attachSound("zik.mp3"); Snd_zik.start(); //Joue la musique de fond //Création des grilles Tab=new Array(); //N° des clips "bloc" (entre 1 et NB_BLOC) Tab2=new Array(); //N° des occurrences des clips "bloc" (profondeur) for(i=0;i=NB_LINE){ aligne=true; //Destruction des pièces for(i3=i1;i3<=i2;i3++){ Tab[i3][j]=0; //Tab2[i3][j]=0; _root["bloc"+Tab2[i3][j]].gotoAndPlay(2); //Anime destruction } Score+=nb; } i1=i2+1; //Repart de la fin de l'alignement } } } //Parcours toutes les colonnes (sauf la case 0 de chacune d'elles) for (i=0;i=NB_LINE){ aligne=true; //Destruction des pièces for(j3=j1;j3<=j2;j3++){ Tab[i][j3]=0; //Tab2[i][j3]=0; _root["bloc"+Tab2[i][j3]].gotoAndPlay(2); //Anime destruction } Score+=nb; } j1=j2+1; //Repart de la fin de l'alignement } } } } return aligne; } onMouseDown=function(){ if(!Swapping && !Destroying && !Falling){ Blk.i=Math.floor(_xmouse/CASE); //Abscisse Blk.j=Math.floor(_ymouse/CASE)+1; //Ordonnée if(Blk.i>=0 && Blk.i0 && Blk.jDroite => i2->Gauche else Blk.dir=-1; //i1->Gauche => i2->Droite }else{ //Verticalement Blk.h=false; if(Blk.j1Bas => i2->Haut else Blk.dir=-1; //i1->Haut => i2->Bas } Blk.mov=CASE; //Déplacement terminé quand Blk.mov = 0 Blk.state=3; //=>SwapBlock() Snd_swap.start(); }else Blk.state=1; //Echange non autorisé, fin de SelectBlock() } } function MoveBlock(){ Swapping=true; if(Blk.h){ //=> Horizontalement Blk.clip1._x+=(VT_SWAP*Blk.dir); //Déplace la 1er pièce à droite ou gauche Blk.clip2._x-=(VT_SWAP*Blk.dir); //Déplace la 2e pièce à droite ou gauche }else{ //=> Verticalement Blk.clip1._y+=(VT_SWAP*Blk.dir); //Déplace la 1er pièce en haut ou bas Blk.clip2._y-=(VT_SWAP*Blk.dir); //Déplace la 2e pièce en haut ou bas } Blk.mov-=VT_SWAP; } function SwapTab(tab,i1,j1,i2,j2){ //Echange dans un tableau 2D tmp=tab[i1][j1]; tab[i1][j1]=tab[i2][j2]; tab[i2][j2]=tmp; } function SwapBlock(){ if(Blk.state==3){ //Echange les pièces if(Blk.mov>0) MoveBlock(); //Déplacement en cours else{ //Déplacement terminé Swapping=false; SwapTab(Tab,Blk.i1,Blk.j1,Blk.i2,Blk.j2); //Pièces échangées SwapTab(Tab2,Blk.i1,Blk.j1,Blk.i2,Blk.j2); if(Analyse()){ //L'échange créer un alignement Blk.state=1; //=> Fin de SwapBlock() Snd_line.start(); }else{ //L'échange ne créer rien... SwapTab(Tab,Blk.i1,Blk.j1,Blk.i2,Blk.j2); //Pièces échangées SwapTab(Tab2,Blk.i1,Blk.j1,Blk.i2,Blk.j2); Blk.dir=-Blk.dir; //Inverse les directions Blk.mov=CASE; Blk.clip1.swapDepths(Blk.clip2); Blk.state=4; //=> Re-échange les pièces Snd_unswap.start(); } } }else if(Blk.state==4){ //Re-échange les pièces if(Blk.mov>0) MoveBlock(); //Déplacement en cours else { //Déplacement terminé Blk.state=1; //=> Fin de SwapBlock() Swapping=false; } } } function InDestroying(){ Destroying=false; for(prop in _root){ if(prop.slice(0,4)=="bloc"){ //Occurrence d'un clip bloc clip=_root[prop]; //Destruction en cours ? if(clip._currentframe>1 && clip._currentframe<=11){ //Anime disparition Destroying=true; //Destruction en cours break; //Inutile de tester les autres blocs } } } } function FallBlock(){ hole=false; //Booléen de présence d'une case vide for(j=HT_GRILLE-1;j>0;j--){ //Parcours le tableau de bas en haut... for(i=0;i Remplir la ligne n° 0 } function FillLine0(){ for(i=0;i0){ //Chute en cours Falling=true; clip._y+=VT_FALL //Déplace le clip vers le bas clip.fall-=VT_FALL; //Diminue le compteur de chute } } } } onEnterFrame=function(){ //Position du curseur if(_xmouse>0 && _xmouse<400 && _ymouse>0 && _ymouse<400){ //Aire de la grille cursor._x=Math.floor(_xmouse/CASE)*CASE; cursor._y=Math.floor(_ymouse/CASE)*CASE; } InDestroying(); if(!Destroying){ //Pas de destruction en cours => Faire chuter les blocs FallBlock(); InFalling(); if(!Falling){ //Pas de chute en cours => Sélection/Swap/Analyse if(Blk.clic && Blk.state<3) SelectBlock(); //Sélection (state 1/2) else if(Blk.state>2) SwapBlock(); //Inverse/Re-inverse (state 3/4) if(!Swapping) Analyse(); } } //Temps écoulé timer=getTimer(); //Timer courant //counter._width=400-(400/(GAME_TIME/(timer-Timer0))); //Largeur proportionnelle counter._width=400-((400*(timer-Timer0))/GAME_TIME); //Largeur proportionnelle if(timer>Timer0+GAME_TIME) EndGame(); //=> Fin de la partie } function EndGame(){ cursor._visible=false; //Cache le curseur attachMovie("score","score",Depth++,{_x:60,_y:175}); //Clip score score.txt_score.text=Score+" pièces détruites"; //Score onEnterFrame=function(){}; _root.gotoAndPlay(3); }