Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import flash.display.MovieClip;
- import flash.events.Event;
- import flash.geom.Point;
- // DEBUG
- // =====
- import utils.debug.Stats;
- addChild(new Stats());
- // INTIALISATION
- // Constante à multiplier à une valeur en radian pour la transformer en degrés
- const RAD2DEG:Number = 180 / Math.PI;
- const COLORS:Vector.<int> = new <int>[0x009900, 0xFF9900, 0x6699FF];
- // Constante min et max pour random sur la vitesse
- const SPEED_MIN:Number = 2;
- const SPEED_MAX:Number = 5;
- const SPEED_TIR:int = 5;
- // Tableau vector de vélocités correspondants aux Enemy
- var enemyVelocity:Vector.<Point> = new Vector.<Point>();
- // Tableau vector de vélocités correspondants aux Shoot
- var shootVelocity:Vector.<Point> = new Vector.<Point>();
- // Constante pour le nombre d'énemis
- const ENEMIES_NUM:int = 100;
- // Tableau vector pour stocker les Enemy
- var enemies:Vector.<Enemy> = new Vector.<Enemy>();
- // Tableau vector pour stocker les Shoot
- var shoot:Vector.<Shoot> = new Vector.<Shoot>();
- // Tableau vector pour stocker les Explosions
- var explosion:Vector.<Explosion> = new Vector.<Explosion>();
- // Filtre
- var myColor:ColorTransform = new ColorTransform();
- // Déclare une variable du type player
- var player:Player;
- // Déclare une variable du type shield
- var shield:Shield;
- var score=0;
- // Initialisation du Hud
- const HUD_TEXT : String = "SCORE : ";
- const SCORE_DEFAULT : uint = 0;
- // création du bouclier
- // affiche le bouclier dans mcGame
- function createShield (): Shield {
- // déclaration d'une variable locale à la fonction pour stocker une référence au movieclip Shield créé
- var lShield:Shield= new Shield();
- // on ajoute le shield créé au mcGame
- mcGame.addChild(lShield);
- return lShield;
- }
- // création du player
- // crée le movieclip player, l'ajoute au mcGame, et renvoie (return)
- function createPlayer (pX:Number, pY:Number): Player {
- // déclaration d'une variable locale à la fonction pour stocker une référence au movieclip Player créé
- var lPlayer:Player= new Player();
- lPlayer.x = pX;
- lPlayer.y = pY;
- // le Player possède un movieclip de nom d'occurrence mcEffect (regarder dans la bibliothèque)
- // qui servira de point d'émission du Shoot
- lPlayer.mcEffect.visible = false;
- // on ajoute le player créé au mcGame
- mcGame.addChild(lPlayer);
- shield.mcEffect.visible = false;
- // on renvoie la référence au movieclip player créé
- return lPlayer;
- }
- function createEnemies(pTarget:MovieClip, pNum: int = ENEMIES_NUM):void {
- // Déclare une variable locale à la fonction, du type Enemy.
- // On la déclare en dehors de la boucle for pour des raisons de performances
- var lEnemy:Enemy;
- var lSpeed:Number;
- var lVelocity:Point = new Point();
- // on créé une boucle qui va crééer pNum Enemy
- for (var i:int = 0; i < pNum; i++) {
- lEnemy = new Enemy();
- lEnemy.x = Math.random() * stage.stageWidth - stage.stageWidth/2;
- lEnemy.y = Math.random() * stage.stageHeight - stage.stageHeight/2;
- if(Math.abs(lEnemy.x)<player.width){
- lEnemy.x+=Math.abs(lEnemy.x-player.width);
- }
- if(Math.abs(lEnemy.y)<player.height){
- lEnemy.y+=Math.abs(lEnemy.y-player.height);
- }
- lEnemy.scaleX = Math.random() < 0.5 ? -1 : 1;
- lEnemy.scaleY = Math.random() < 0.5 ? -1 : 1;
- lSpeed = Math.floor((SPEED_MIN + Math.random() * (SPEED_MAX - SPEED_MIN))*10)/10;
- lVelocity = new Point(lSpeed, lSpeed);
- // on stock la vélocité de l'ennemi dans le tableau vector enemyVelocity.
- enemyVelocity.push(lVelocity);
- trace(enemyVelocity);
- // on paramètre notre filtre
- myColor.color = COLORS[Math.floor(Math.random() * COLORS.length)];
- // on applique le filtre sur le movielipc mcColor contenu dans mcEnemy contenu dans le movieclip référencé dans la variable lEnemy
- lEnemy.mcEnemy.mcColor.transform.colorTransform = myColor;
- /*CACHE AS BITMAP transforme les movieclip qui ne contiennent pas d'animation en simple bitmap
- Gros gain de performance.
- ATTENTION, ne pas appliquer sur les movieclips qui possèdent une animation (à l'intérieur) et n'appliquer
- que si ces movieclips ne font que des translations ou sont fixes (ne pas appliquer si le movieclip change de taille
- ou effectue une rotation.. Nous reviendrons sur cette optimisation plus tard en cours de flash ide.*/
- lEnemy.cacheAsBitmap = true;
- // on addChild l'Enemy créé au MovieClip référencé dans pTarget.
- pTarget.addChild(lEnemy);
- // on stock la référence à l'Enemy dans le tableau d'ennemis
- enemies.push(lEnemy);
- }
- }
- // création du hud
- // addChild directement sur le stage, ainsi le hud sera toujous au dessus du mcGame (et de ses enfants)
- function createHud (pScore:uint=SCORE_DEFAULT) : void {
- // déclaration d'une variable locale à la fonction pour stocker une référence au movieclip Hud créé
- var lHud:Hud = new Hud();
- // addChild sur le stage
- addChild(lHud);
- // Dans le champs texte de nom d'occurrence txtScore, on utilise la fonction .text pour affecter le score au champs
- lHud.txtScore.text = HUD_TEXT + pScore;
- }
- //
- // CONTRUCTION DU JEU
- shield = createShield();
- player = createPlayer(0,0);
- createEnemies(mcGame);
- createHud(SCORE_DEFAULT);
- //
- // ACTION
- function doActionEnemies():void {
- var lEnemy:Enemy; // variable locale à la fonction, type Enemy
- var lLength:int = enemies.length; // On compte le nombre d'Enemy dans le tableau d'Enemy pour le parcourir
- // La boucle va parcourir le tableau, récupérer les références au Enemy
- for (var i:int = 0; i < lLength; i++) {
- lEnemy = enemies[i];
- // on affecte les ccordonnées en fonction du scale et de la vitesse stockée dans tableau vector enemyVelocity
- lEnemy.x += lEnemy.scaleX * enemyVelocity[i].x;
- lEnemy.y += lEnemy.scaleY * enemyVelocity[i].y;
- // Teste la sortie de la scène, si Enemy sort, on inverse son scale en x
- if (lEnemy.x > stage.stageWidth/2) lEnemy.scaleX = -1;
- else if (lEnemy.x < -stage.stageWidth/2) lEnemy.scaleX = 1;
- // Teste la sortie de la scène, si Enemy sort, on inverse son scale en y
- if (lEnemy.y > stage.stageHeight/2) lEnemy.scaleY = -1;
- else if (lEnemy.y < -stage.stageHeight/2) lEnemy.scaleY = 1;
- }
- }
- // Orientation du player en fonction de la position de la souris.
- function doActionPlayer (): void {
- // mcGame.mouseX et mcGame.mouseY donnent les coordonnées de la souris par rapport ici au mcGame.
- player.rotation=Math.atan2(mcGame.mouseY - player.y, mcGame.mouseX - player.x) * RAD2DEG;
- }
- function creatShoot (pEvent:MouseEvent): void {
- //Initialisation Variable Local
- var lShoot:Shoot= new Shoot();
- var lMcEffect:MovieClip=player.mcEffect;
- var lPositionCanon:Point= new Point(player.x,player.y);
- var lVelocity:Point= new Point();
- var lSpeedX:Number;
- var lSpeedY:Number;
- //Calcule position/vecteur
- lPositionCanon = mcGame.globalToLocal(lMcEffect.localToGlobal(lPositionCanon));
- lShoot.x=lPositionCanon.x;
- lShoot.y=lPositionCanon.y;
- lSpeedX=SPEED_TIR * Math.cos(player.rotation/RAD2DEG);
- lSpeedY=SPEED_TIR * Math.sin(player.rotation/RAD2DEG);
- lVelocity.setTo(lSpeedX,lSpeedY);
- //Incrémentation tableau Velocity/Shoot
- shoot.push(lShoot);
- shootVelocity.push(lVelocity);
- //Affichage
- mcGame.addChild(lShoot);
- }
- function doActionShoots ():void{
- //Initialisation Variable Local
- var i:int;
- var j:int;
- var lMcExplosion:Explosion=new Explosion();
- var lEnemy:Enemy;
- var lPoint:Point=new Point();
- for(i=0;i<enemies.length;i++){
- lEnemy=enemies[i];
- lPoint.setTo(lEnemy.x,lEnemy.y);
- lPoint=mcGame.localToGlobal(lPoint);
- if(shield.mcEffect.hitTestPoint(lPoint.x,lPoint.y,true)){
- shield.mcContent.play();
- lEnemy.scaleY *= -1;
- lEnemy.scaleX *= -1;
- }
- }
- for(i=0;i<shoot.length;i++){
- for(j=0;j<enemies.length;j++){
- if(shoot[i].hitTestObject(enemies[j])){
- score=score+100;
- removeChild(getChildAt(numChildren-1));
- createHud(score);
- lMcExplosion.x=enemies[j].x;
- lMcExplosion.y=enemies[j].y;
- mcGame.addChild(lMcExplosion);
- explosion.push(lMcExplosion);
- shoot[i].parent.removeChild(shoot[i]);
- shoot.splice(i,1);
- shootVelocity.splice(i,1);
- enemies[j].parent.removeChild(enemies[j]);
- enemies.splice(j,1);
- break;
- }
- }
- }
- for(i=0;i<shoot.length;i++){
- shoot[i].x+=shootVelocity[i].x;
- shoot[i].y+=shootVelocity[i].y;
- }
- for(i=0;i<explosion.length;i++){
- if(explosion[i].currentFrame == (explosion[i].totalFrames)-1){
- explosion[i].parent.removeChild(explosion[i]);
- explosion.splice(i,1);
- }
- }
- }
- function destroyShoot():void{
- var i:int;
- for(i=0;i<shoot.length;i++){
- if ((shoot[i].x < -stage.stageWidth/2) || (shoot[i].x > stage.stageWidth/2) || (shoot[i].y > stage.stageHeight/2) || (shoot[i].y < -stage.stageHeight/2)){
- shoot[i].parent.removeChild(shoot[i]);
- shoot.splice(i,1);
- shootVelocity.splice(i,1);
- }
- }
- }
- // GameLoop appelée à chaque frame
- // C'est notre chef d'orchestre.
- // Cette fonction étant appelée à chaque frame, elle appelle à son tour doActionPlayer et doActionEnemies
- function gameLoop(pEvent:Event):void {
- if(score<ENEMIES_NUM*100 || explosion.length!=0){
- doActionPlayer();
- doActionEnemies();
- doActionShoots();
- destroyShoot();
- }else{
- removeChild(getChildAt(numChildren-1));
- removeEventListener(Event.ENTER_FRAME, gameLoop);
- removeEventListener(MouseEvent.CLICK, creatShoot);
- for(var i:int=0;i<shoot.length;i++){
- shoot[i].parent.removeChild(shoot[i]);
- }
- shoot.splice(0,shoot.length);
- shootVelocity.splice(0,shootVelocity.length);
- var mcWinScreen:WinScreen=new WinScreen();
- addChild(mcWinScreen);
- mcWinScreen.txtScore.text=HUD_TEXT + score;
- }
- }
- // Ecouteur ajouté à la scène, écoute l'événement Event.ENTER_FRAME et exécute la fonction gameLoop à la récecption de cet événement
- // à chaque frame donc...
- addEventListener(Event.ENTER_FRAME, gameLoop);
- addEventListener(MouseEvent.CLICK, creatShoot);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement