Introduction
Ce billet fait suite au billet: http://blog.developpez.com/ducodeetdulibre/p12426/developpement/journal-de-bord-creation-dun-rts-en-html5-jour-11
Dans ce jour 12, on va gérer des sprites d’animation et en profiter pour réorganiser la gestion du son de manière plus propre.
Ajout d’une méthode animate
On va ajouter une méthode animate qui permettra à la fois de modifier l’image affichée mais également de jouer le bon son
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | animate:function(action){ //on commence par effacer la zone oLayer_perso.clearRect(((this.x-currentX)*widthCase),((this.y-currentY)*heightCase),widthCase-2,widthCase-2); var tmpImg; if(action=='attack'){ tmpImg=this.idImg+'_attack'; this.playSound('attack',this.action); }else if(action=='walking'){ //si le précédent sprite était A //on prend le B (pour créer une animation) if(this.tmpIdImg==this.idImg+'_walking2'){ tmpImg=this.idImg+'_walking'; }else{ tmpImg=this.idImg+'_walking2'; } //on arrête tout son (on marche) this.stopSound(); //on stoque le sprite affiché pour la prochaine animation this.tmpIdImg=tmpImg; }else if(action=='dead'){ this.playSound('dead',this.action); return; }else if(action=='wood'){ tmpImg=this.idImg; this.playSound('wood',this.action); }else if(action=='mining'){ tmpImg=this.idImg; this.playSound('mining',this.action); }else if(action=='stand'){ tmpImg=this.idImg; } oImages.drawImageOnLayer(tmpImg,((this.x-currentX)*widthCase),((this.y-currentY)*heightCase),widthCase-2,widthCase-2,'perso'); this.action=action; }, |
Pour recentrer le son sur l’unité, on a du recréé des méthodes de gestion de son que voici:
Note: on stoque la précédente animation afin lorsqu’une animation/action se déroule en plusieurs temps, on lise le son en entier plutot que de saccader celui-ci.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | playSound:function(action,lastAction){ //si la précédente action était la même, on fait rien if(action==lastAction){ return; } this.stopSound(); this.oAudio=new Audio(); this.oAudio.src=oSound.getSrc(action); this.oAudio.play(); }, stopSound:function(){ if(!this.oAudio){ return; } this.oAudio.pause(); }, |
Appelez au bon moment cette nouvelle méthode
Après avoir supprimer les précédentes méthodes appellées oSound.resetPlaying() et oSound.stopPlaying()
On doit désormais appelé les bonnes méthodes d’animation pour avoir un état cohérent de chaque unité et éviter de jouer un son inutile.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | if(iAttack){ oUnit.animate('attack'); //on decremente l'enemie de la puissance d'attaque oUnit2.life-=oUnit.attak; if(oUnit2.life <=0){ oUnit.animate('walking'); oUnit2.animate('dead'); //si unite dead, on l'efface du jeu oUnit2.clear(); oGame.removeUnit(oUnit2); } |
Le github
Le projet GitHub : https://github.com/imikado/rtshtml5