Advertisement
NightFox

Source code for a Space Invaders type game [MAIN]

May 11th, 2013
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Space Inaveders
  3.     (c) 2013 Cesar Rincon
  4.     Escola Municipal d'Art i Diseny de Vilanova
  5. */
  6.  
  7.  
  8.  
  9. /*
  10.     Imports de clases externas propias
  11. */
  12. import emaid.commons.CTools;
  13. import emaid.space.CPlayer;
  14. import emaid.space.CEnemy;
  15. import emaid.space.CGamePlay;
  16. import emaid.space.CGui;
  17. import emaid.space.CGfxEffects;
  18. import emaid.space.CSound;
  19.  
  20. /*
  21.     Imports de clases de Flash
  22. */
  23. import flash.text.TextField;
  24. import flash.text.TextFormat;
  25.  
  26.  
  27.  
  28. /*
  29.     Variables globales
  30. */
  31. var Tools:CTools = new CTools();            // Objeto de la clase CTools
  32.  
  33. var player:CPlayer = new CPlayer();         // Objeto con el Sprite del player
  34. var enemy:CEnemy = new CEnemy();            // Objeto con el Sprite de los enemigos
  35. var game:CGamePlay = new CGamePlay();       // Objeto con todos los datos de gestion del juego
  36. var gui:CGui = new CGui();                  // Objeto con la GUI del juego
  37. var gfx:CGfxEffects = new CGfxEffects();    // Objeto con los efectos graficos
  38. var sfx:CSound = new CSound();              // Objeto con los efectos de sonido
  39.  
  40. /*
  41.     Bloque de Update
  42. */
  43.  
  44. // Define el Timer a 30 fps
  45. var myTimer:Timer = new Timer(1000/30);
  46. // Crea el listener
  47. myTimer.addEventListener(TimerEvent.TIMER, Update);
  48. // Funcion Update
  49. function Update(e:TimerEvent) {
  50.    
  51.     /*
  52.         >>> (Todo el codigo que se actualiza en cada frame, va aqui) <<<
  53.     */
  54.    
  55.     // Segun el thread, ejecuta las partes de codigo adecuadas
  56.     switch (game.thread) {
  57.        
  58.         // Espera a que se pulse espacio para iniciar la ronda
  59.         case 0:
  60.             // Si se presiona espacio, cambia de thread
  61.             if (WaitForSpaceKey()) {
  62.                 // Crea la parrilla inicial de enemigos
  63.                 CreateEnemyGrid(0, 0, 4, 8);
  64.                 // Reordena los Sprites
  65.                 SortSprites();
  66.                 // Calcula la posicion de la parrilla y colocala ahi
  67.                 enemy.gridX = ((stage.stageWidth / 2) - (enemy.gridWidth / 2));
  68.                 enemy.gridY = -enemy.gridHeight;
  69.                 PlaceEnemyGrid(enemy.gridX, enemy.gridY);
  70.                 // Siguiente Thread
  71.                 game.thread = 1;   
  72.             }
  73.             break;
  74.            
  75.         // Baja la parrilla de enemigos
  76.         case 1:
  77.             // Mientras la parrilla no este en su sitio...
  78.             if (enemy.gridY < 60) {
  79.                 // Baja un poco la parrilla
  80.                 enemy.gridY += 2;
  81.                 // Posicionala
  82.                 PlaceEnemyGrid(enemy.gridX, enemy.gridY);
  83.             } else {
  84.                 enemy.gridY = 60;                   // Ajuste de posicion
  85.                 game.playerCanShoot = true;         // El jugador puede disparar
  86.                 game.enemyCanShoot = true;          // Y los enemigos tambien
  87.                 player.inmune = false;              // El player ya no es inmune
  88.                 game.thread = 2;                    // Siguiente thread
  89.             }
  90.             break;
  91.            
  92.         // Ejecucion normal de la partida
  93.         case 2:
  94.             MoveEnemyGrid();                        // Mueve la parrilla de enemigos
  95.             // Verifica si los quedan enemigos
  96.             if (enemy.enemyNum == 0) {              // Si has eliminado a todos los enemigos.. prepara el cambio de ronda
  97.                 game.playerCanShoot = false;        // El jugador no puede disparar
  98.                 game.enemyCanShoot = false;         // Los enemigos tampoco
  99.                 player.inmune = true;               // El player es inmune
  100.                 game.thread = 3;                    // Salta al siguiente thread
  101.             }
  102.             // Verifica si el player ha muerto
  103.             if (player.dead) {
  104.                 game.thread = 4;                    // Salta al siguiente thread
  105.             }
  106.             break;
  107.            
  108.         // Espera a que la pantalla este limpia de disparos y explosiones
  109.         case 3:
  110.             // Si ya no hay disparos ni explosiones activas...
  111.             if (player.canShoot && (gfx.explosionNum == 0) && (enemy.shootNum == 0)) {
  112.                 // Suma una ronda
  113.                 game.round ++;
  114.                 UpdateGuiRound();
  115.                 // Crea el Mensage de espera
  116.                 CreatePressSpace();
  117.                 // Aumenta la dificultad al cambiar de ronda
  118.                 enemy.shootLack = (enemy.shootLack >> 1);
  119.                 if (enemy.shootLack < 1) enemy.shootLack = 1;
  120.                 // Vuelve al thread que genera la parrilla de enemigos
  121.                 game.thread = 0;
  122.             }
  123.             break;
  124.            
  125.         // El player ha muerto, espera a limpiar la escena
  126.         case 4:
  127.             MoveEnemyGrid();                        // Mueve la parrilla de enemigos
  128.             // Si ya no hay disparos ni explosiones activas...
  129.             if (player.canShoot && (gfx.explosionNum == 0) && (enemy.shootNum == 0)) {
  130.                 // Si aun le quedan vidas al player, resucitalo
  131.                 if (game.lives > 0) {
  132.                     // Crea el Mensage de espera
  133.                     CreatePressSpace();
  134.                     // Salta al siguiente thread
  135.                     game.thread = 5;
  136.                 } else {
  137.                     // Si no, GAME OVER
  138.                     CreateGameOver();
  139.                     // Salta al threas de Game Over
  140.                     game.thread = 6;
  141.                 }
  142.             }
  143.             break;
  144.            
  145.         // Resucita al player y espera a que se pulse espacio para continuar
  146.         case 5:
  147.             MoveEnemyGrid();                        // Mueve la parrilla de enemigos
  148.             if (WaitForSpaceKey()) {
  149.                 // Colocalo en la posicion inicial
  150.                 player.sprite.x = ((stage.stageWidth / 2) - (player.playerH / 2));
  151.                 player.sprite.y = (stage.stageHeight - (player.playerV * 2));
  152.                 // Control de animacion por defecto
  153.                 player.animation = 0;
  154.                 game.playerCanShoot = true;         // El jugador puede disparar
  155.                 game.enemyCanShoot = true;          // Y los enemigos tambien
  156.                 player.inmune = false;              // El player ya no es inmune
  157.                 player.dead = false;                // Resucita al player
  158.                 game.thread = 2;                    // Siguiente thread
  159.             }
  160.             break;
  161.            
  162.         // Game Over
  163.         case 6:
  164.             MoveEnemyGrid();                        // Mueve la parrilla de enemigos
  165.             if (WaitForSpaceKey()) {
  166.                 // Si hay enemigos en pantalla, eliminalos...
  167.                 while (enemy.enemyNum > 0) {
  168.                     DeleteEnemyFromGrid(enemy.enemyNum - 1);
  169.                 }
  170.                 // Elimina el texto de "Game Over"
  171.                 removeChild(gui.gameOver);
  172.                 // Salta al thread de espera de reinicio (automatico)
  173.                 game.thread = 7;
  174.             }
  175.             break;
  176.            
  177.         // Reinicia la partida
  178.         case 7:
  179.             // Si no hay explosiones ni disparos activos, reinicia la partida
  180.             if ((gfx.explosionNum == 0) && (enemy.shootNum == 0)) RestartGame();
  181.             break;
  182.            
  183.         // Error Trap, nada por defecto
  184.         default:
  185.             break;
  186.            
  187.     }
  188.    
  189.     // Precesos comunes
  190.     MovePlayer();               // Mueve al jugador
  191.     PlayerShoot();              // Control del disparo del jugador
  192.     EnemyShoot();               // COntrol del disparo de los enemigos
  193.     ManageExplosions();         // Gestion de explosiones activas
  194.     UpdateGuiScore();           // Actualiza la GUI (Score)
  195.     ScrollBackGrounds();        // Mueve los fondos (Scroll Parallax)
  196.     GlowCreditsText();          // Glow del texto de los creditos
  197.     BgmControl();               // Control de la musica
  198.    
  199. }
  200.  
  201.  
  202.  
  203. /*
  204.     Declaracion de funciones
  205. */
  206.  
  207. // Control del teclado mediante los eventos KEY_UP y KEY_DOWN
  208. // Al presionar una tecla...
  209. stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
  210. function KeyDown(e:KeyboardEvent):void {
  211.     // Al presionar cualquier tecla, llama a la funcion KeysDown de la Clase CTools
  212.     Tools.KeysDown(e.keyCode);
  213. }
  214.  
  215. // Al soltar una tecla...
  216. stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
  217. function KeyUp(e:KeyboardEvent):void {
  218.     // Al soltar cualquier tecla, llama a la funcion KeysUp de la Clase CTools
  219.     Tools.KeysUp(e.keyCode);
  220. }
  221.  
  222.  
  223. // Crea el Sprite de la nave del jugador
  224. function CreatePlayer():void {
  225.    
  226.     // Crea el player
  227.     player.sprite = new cShip();
  228.     // Define los parametros del sprite
  229.     player.playerH = 39;
  230.     player.playerV = 43;
  231.     // Manda el sprite del player al stage
  232.     addChild(player.sprite);
  233.     // Colocalo en la posicion inicial
  234.     player.sprite.x = ((stage.stageWidth / 2) - (player.playerH / 2));
  235.     player.sprite.y = (stage.stageHeight - (player.playerV * 2));
  236.     // Control de animacion por defecto
  237.     player.animation = 0;
  238.     // Crea el disparo
  239.     player.shootSprite = new cSpaceshipShoot();
  240.     // Define los parametros del disparo
  241.     player.shootH = 21;
  242.     player.shootV = 21;
  243.     // Mandalo al stage
  244.     addChild(player.shootSprite);
  245.     // Escondelo fuera del stage
  246.     player.shootSprite.x = -player.shootH;
  247.     player.shootSprite.y = -player.shootV;
  248.     player.shootSprite.gotoAndStop(1);
  249.     // Valores por defecto de los flags
  250.     player.canShoot = true;             // Disparo listo
  251.     player.dead = false;                // Por defecto, no te mates nada mas aparecer
  252.     player.inmune = true;               // Al aparecer es invulnerable
  253.     game.playerCanShoot = false;        // El jugador no puede disparar
  254.  
  255. }
  256.  
  257.  
  258. // Mueve al Player
  259. function MovePlayer():void {
  260.     // Si presionas Izquierda...
  261.     if (Tools.kLeft && !Tools.kRight) {
  262.         // Muevete
  263.         player.sprite.x -= player.moveSpeed;
  264.         if (player.sprite.x < 0) player.sprite.x = 0;
  265.         // Cambia el frame de animacion si es necesario
  266.         if (player.animation != 1) {
  267.             player.sprite.gotoAndPlay(11);
  268.             player.animation = 1;
  269.         }
  270.     }
  271.     // Si presionas Derecha...
  272.     if (Tools.kRight && !Tools.kLeft) {
  273.         // Muevete
  274.         player.sprite.x += player.moveSpeed;       
  275.         if (player.sprite.x > (stage.stageWidth - player.playerH)) player.sprite.x = (stage.stageWidth - player.playerH);
  276.         // Cambia el frame de animacion si es necesario
  277.         if (player.animation != 2) {
  278.             player.sprite.gotoAndPlay(21);
  279.             player.animation = 2;
  280.         }
  281.     }
  282.     // Si no se presiona ni derecha ni izquierda, restaura la animacion
  283.     if (!Tools.kRight && !Tools.kLeft && (player.animation != 0)) {
  284.         player.sprite.gotoAndPlay(1);
  285.         player.animation = 0;
  286.     }
  287.     // Segun el estado del player
  288.     if (player.inmune) {
  289.         // Efecto inmunidad
  290.         player.sprite.visible = !player.sprite.visible;
  291.     } else if (!player.dead) {
  292.         // Estado normal
  293.         player.sprite.visible = true;
  294.     } else {
  295.         // Estas muerto, macho
  296.         player.sprite.visible = false;          // Me ocultas
  297.         player.sprite.x = -player.playerH;      // Y me mandas fuera del Stage
  298.         player.sprite.y = -player.playerV;
  299.     }
  300. }
  301.  
  302.  
  303. // Funcion de disparo
  304. function PlayerShoot():void {
  305.     // Variables locales
  306.     var i:Number = 0;
  307.     // Si se puede presionar "ESPACIO" para disparar...
  308.     // Eso es, el Player no esta disparando, esta habilitado su disparo, no esta muerto y se ha presionado ESPACIO
  309.     if (player.canShoot && game.playerCanShoot && !player.dead && Tools.kSpace) {
  310.         // Inicializa el disparo
  311.         player.shootSprite.gotoAndPlay(5);
  312.         player.shootSprite.x = (player.sprite.x  + (player.playerH / 2) - (player.shootH / 2));
  313.         player.shootSprite.y = (player.sprite.y  - player.shootV);
  314.         player.canShoot = false;
  315.         // Sonido del disparo ***
  316.         sfx.PlaySound(sfx.playerShoot, CSound.playerShootVol);
  317.     }
  318.     // Si el disparo esta en proceso
  319.     if (!player.canShoot) {
  320.         // Mueve el disparo
  321.         player.shootSprite.y -= player.shootSpeed;
  322.         // Limite del escenario
  323.         if (player.shootSprite.y < -player.shootV) {
  324.             // Recolocalo
  325.             player.shootSprite.y = -player.shootH;
  326.             player.shootSprite.x = -player.shootV;
  327.             // Para la animacion
  328.             player.shootSprite.gotoAndStop(1);
  329.             // Rehabilita del disparo
  330.             player.canShoot = true;
  331.         }
  332.         // Si has tocado algun enemigo...
  333.         for (i = 0; i < enemy.enemyNum; i ++) {
  334.             if (Tools.BoxCollision(player.shootSprite.x, player.shootSprite.y, player.shootH, player.shootV, enemy.sprite[i].x, enemy.sprite[i].y, enemy.enemyH[i], enemy.enemyV[i])) {
  335.                 // Suma la puntuacion obtenida
  336.                 game.score += enemy.score[i];
  337.                 // Mata al enemigo
  338.                 DeleteEnemyFromGrid(i);
  339.                 // Recoloca el disparo
  340.                 player.shootSprite.y = -player.shootH;
  341.                 player.shootSprite.x = -player.shootV;
  342.                 // Para la animacion
  343.                 player.shootSprite.gotoAndStop(1);
  344.                 // Rehabilita del disparo
  345.                 player.canShoot = true;
  346.             }
  347.         }
  348.     }
  349. }
  350.  
  351.  
  352. // Funcion para matar al player
  353. function KillPlayer():void {
  354.    
  355.     // Variables
  356.     var posX:Number, posY:Number;
  357.    
  358.     // Genera una explosion en la posicion del player
  359.     posX = (player.sprite.x + (player.playerH / 2));    // Calcula la posicion
  360.     posY = (player.sprite.y + (player.playerV / 2));
  361.     sfx.PlaySound(sfx.playerExplosion, CSound.playerExplosionVol);      // Sonido de la explosion
  362.     MakeExplosion(posX, posY);                                          // Genera una explosion en la posicion del player
  363.    
  364.     // Quita una vida al player
  365.     game.lives --;
  366.     if (game.lives < 0) game.lives = 0;     // Debug (Las vidas no seran menor a 0)
  367.     // Actualiza el marcador
  368.     UpdateGuiLives();
  369.    
  370.     game.playerCanShoot = false;        // El jugador no puede disparar
  371.     game.enemyCanShoot = false;         // Los enemigos tampoco
  372.    
  373.     // Marca al jugador como muerto
  374.     player.dead = true;
  375.    
  376. }
  377.  
  378.  
  379. // Crea una parrilla de enemigos
  380. function CreateEnemyGrid(posX:Number, posY:Number, rows:Number, columns:Number):void {
  381.    
  382.     // Variables privadas
  383.     var iX:Number, iY:Number;       // Control del indcie de creacion de enemigos
  384.     var i:Number;
  385.    
  386.     // Inicializa las variables
  387.     enemy.enemyNum = 0;
  388.    
  389.     // Bucles de creacion
  390.     for (iY = 0; iY < rows; iY ++) {
  391.         for (iX = 0; iX < columns; iX ++) {
  392.             // Crea la instancia del enemigo en pantalla
  393.             enemy.sprite[enemy.enemyNum] = new cUfo();
  394.             // Parametros del enemigo
  395.             enemy.enemyH[enemy.enemyNum] = 53;      // Tamaño del grafico
  396.             enemy.enemyV[enemy.enemyNum] = 31;
  397.             enemy.enemyX[enemy.enemyNum] = iX;      // Posicion en la parrilla
  398.             enemy.enemyY[enemy.enemyNum] = iY;
  399.             // Mandalo al Stage haciendolo parent suyo
  400.             addChild(enemy.sprite[enemy.enemyNum]);
  401.             // Recoloca el enemigo en pantalla
  402.             enemy.sprite[enemy.enemyNum].x = posX + (iX * (enemy.enemyH[enemy.enemyNum] + (enemy.enemyH[enemy.enemyNum] / 8)));
  403.             enemy.sprite[enemy.enemyNum].y = posY + (iY * (enemy.enemyV[enemy.enemyNum] + (enemy.enemyV[enemy.enemyNum] / 8)));
  404.             // Asigna la puntuacion que dara el enemigo al morir
  405.             enemy.score[enemy.enemyNum] = 10;
  406.             // Incrementa el contador de enemigos
  407.             enemy.enemyNum ++;
  408.         }
  409.     }
  410.    
  411.     // Guarda los datos del GRID (usa como base la info del primer enemigo)
  412.     enemy.gridX = posX;
  413.     enemy.gridY = posY;
  414.     enemy.rows = rows;
  415.     enemy.columns = columns;
  416.     enemy.gridWidth = ((columns * (enemy.enemyH[0] + (enemy.enemyH[0] / 8))) - (enemy.enemyH[0] / 8));
  417.     enemy.gridHeight = ((rows * (enemy.enemyV[0] + (enemy.enemyV[0] / 8))) - (enemy.enemyV[0] / 8));
  418.    
  419.     // Iniciliza los datos de disparo de los enemigos
  420.     enemy.shootNum = 0;             // Numero de disparos activos de los enemigos
  421.     enemy.shootTimer = 0;           // Temporizador de disparo
  422.     game.enemyCanShoot = false;     // Aun no pueden disparar
  423.    
  424. }
  425.  
  426.  
  427. // Funcion para posicionar la parrilla de enemigos
  428. function PlaceEnemyGrid(pX:Number, pY:Number) {
  429.    
  430.     // Variables privadas
  431.     var i:Number = 0;               // Contador de indice de los arrays
  432.    
  433.     // Asigna la nueva posicion
  434.     enemy.gridX = pX;
  435.     enemy.gridY = pY;
  436.    
  437.     // Bucles de dibujado
  438.     for (i = 0; i < enemy.enemyNum; i ++) {
  439.         // Recoloca el enemigo en pantalla
  440.         enemy.sprite[i].x = enemy.gridX + (enemy.enemyX[i] * (enemy.enemyH[i] + (enemy.enemyH[i] / 8)));
  441.         enemy.sprite[i].y = enemy.gridY + (enemy.enemyY[i] * (enemy.enemyV[i] + (enemy.enemyV[i] / 8)));
  442.     }
  443.    
  444. }
  445.  
  446.  
  447.  
  448. // Funcion para mover la parrilla de enemigos
  449. function MoveEnemyGrid():void {
  450.    
  451.     // Variables privadas
  452.     var i:Number = 0;               // Contador de indice de los arrays
  453.    
  454.     // Calculo de la nueva posicion de la parrilla
  455.     enemy.gridX += enemy.enemySpeed;
  456.     // Limite derecho
  457.     if ((enemy.gridX + enemy.gridWidth) > stage.stageWidth) {
  458.         enemy.gridX = (stage.stageWidth - enemy.gridWidth);
  459.         enemy.enemySpeed = -enemy.enemySpeed;
  460.     }
  461.     // Limite izquierdo
  462.     if (enemy.gridX < 0) {
  463.         enemy.gridX = 0;
  464.         enemy.enemySpeed = -enemy.enemySpeed;
  465.     }
  466.    
  467.     // Bucles de movimiento
  468.     for (i = 0; i < enemy.enemyNum; i ++) {
  469.         // Recoloca el enemigo en pantalla
  470.         enemy.sprite[i].x = enemy.gridX + (enemy.enemyX[i] * (enemy.enemyH[i] + (enemy.enemyH[i] / 8)));
  471.         enemy.sprite[i].y = enemy.gridY + (enemy.enemyY[i] * (enemy.enemyV[i] + (enemy.enemyV[i] / 8)));
  472.     }
  473.    
  474. }
  475.  
  476.  
  477. // Elimina un enemigo del stage
  478. function DeleteEnemyFromGrid(i:Number):void {
  479.    
  480.     // Variables
  481.     var posX:Number = (enemy.sprite[i].x + (enemy.enemyH[i] / 2));  // Guarda la posicion actual del Sprite (X)
  482.     var posY:Number = (enemy.sprite[i].y + (enemy.enemyV[i] / 2));  // Guarda la posicion actual del Sprite (Y)
  483.    
  484.     // Elimina el enemigo del stage junto a todos sus datos
  485.     removeChild(enemy.sprite[i]);   // Quitalo del Stage
  486.     enemy.sprite.splice(i, 1);      // Elimina ese enemigo de los Arrays
  487.     enemy.enemyH.splice(i, 1);
  488.     enemy.enemyV.splice(i, 1);
  489.     enemy.enemyX.splice(i, 1);
  490.     enemy.enemyY.splice(i, 1);
  491.     enemy.score.splice(i, 1);
  492.     enemy.enemyNum --;              // Quita un enemigo del contador
  493.    
  494.     // Para terminar, instancia una explosion en la posicion donde estava el enemigo, junto con el sonido de la misma
  495.     sfx.PlaySound(sfx.ufoExplosion, CSound.ufoExplosionVol);        // Sonido de la explosion
  496.     MakeExplosion(posX, posY);                                      // Instancia la explosion
  497.    
  498. }
  499.  
  500.  
  501. // Gestiona la rutina de disparo aleatorio de los enemigos
  502. function EnemyShoot():void {
  503.    
  504.     // Variables locales
  505.     var i:Number;
  506.     var remove:Boolean;
  507.    
  508.     // Si hay enemigos activos y esta habilitado su disparo, ademas, el player esta vivo...
  509.     if ((enemy.enemyNum > 0) && game.enemyCanShoot && !player.dead) {
  510.         // Actualiza el timer
  511.         enemy.shootTimer ++;
  512.         // Si hay que realizar un nuevo disparo...
  513.         if (enemy.shootTimer > enemy.shootLack) {
  514.             // Resetea el timer
  515.             enemy.shootTimer = 0;
  516.             // Decide que enemigo realiza el disparo
  517.             i = Tools.RandomRange(0, enemy.enemyNum);
  518.             // Crea la instancia del enemigo en pantalla
  519.             enemy.shootSprite[enemy.shootNum] = new cUfoShoot();
  520.             // Parametros del disparo
  521.             enemy.shootH[enemy.shootNum] = 21;
  522.             enemy.shootV[enemy.shootNum] = 21;
  523.             // Mandalo al Stage haciendolo parent suyo
  524.             addChild(enemy.shootSprite[enemy.shootNum]);
  525.             // Posicionalo en las coordenadas del enemigo que lo ha disparado
  526.             enemy.shootSprite[enemy.shootNum].x = ((enemy.sprite[i].x + (enemy.enemyH[i] / 2)) - (enemy.shootH[enemy.shootNum] / 2));
  527.             enemy.shootSprite[enemy.shootNum].y = (enemy.sprite[i].y + (enemy.enemyV[i] / 2));
  528.             // Actualiza en contador de disparos activos
  529.             enemy.shootNum ++;
  530.             // *** Reordena las prioridades de los Sprites en pantalla ***
  531.             SortSprites();
  532.             // Sonido del disparo ***
  533.             sfx.PlaySound(sfx.ufoShoot, CSound.ufoShootVol);
  534.         }
  535.     }
  536.    
  537.     // Si hay algun disparo activo...
  538.     if (enemy.shootNum > 0) {
  539.         // Flag arriba para la primera ejecucion
  540.         remove = true;
  541.         // Repite mientras queden objetivos a eliminar
  542.         while (remove) {
  543.             // Flag abajo al entrar al bucle...
  544.             remove = false;
  545.             // Mira todos los disparos activos
  546.             for (i = 0; i < enemy.shootNum; i ++) {
  547.                 // Muevelo...
  548.                 enemy.shootSprite[i].y += enemy.shootSpeed;
  549.                 // Si sales el Stage, destruyelo
  550.                 if (enemy.shootSprite[i].y > stage.stageHeight) {
  551.                     // Marca este disparo para ser eliminado
  552.                     remove = true;
  553.                 // Si le das al player...
  554.                 } else if (Tools.BoxCollision(enemy.shootSprite[i].x, enemy.shootSprite[i].y, enemy.shootH[i], enemy.shootV[i], player.sprite.x, player.sprite.y, player.playerH, player.playerV)) {
  555.                     // Marca este disparo para ser eliminado
  556.                     remove = true;
  557.                     // Mata la player si no es inmune
  558.                     if (!player.inmune) KillPlayer();
  559.                 }
  560.                 // Si hay que eliminar a este disparo...
  561.                 if (remove) {
  562.                     // Quita el objeto del stage
  563.                     removeChild(enemy.shootSprite[i]);
  564.                     // Elimina este disparo de los arrays
  565.                     enemy.shootSprite.splice(i, 1);
  566.                     enemy.shootH.splice(i, 1);
  567.                     enemy.shootV.splice(i, 1);
  568.                     // Registra que hay un disparo menos
  569.                     enemy.shootNum --;
  570.                     // Sal YA
  571.                     break;
  572.                 }
  573.             }
  574.         }
  575.     }
  576.  
  577. }
  578.  
  579.  
  580.  
  581. // Function de inicializacion de los fondos
  582. function ResetBackgrounds():void {
  583.    
  584.     // Posicion el fondo en su posicion original
  585.     bgElectricField.x = 0;
  586.     bgElectricField.y = -168;
  587.     bgDeepSpace.x = 0;
  588.     bgDeepSpace.y = -512;
  589.    
  590. }
  591.  
  592.  
  593.  
  594. // Funcion para mover el fondo
  595. function ScrollBackGrounds():void {
  596.    
  597.     // Mueve el fondo
  598.     bgElectricField.y += 2;
  599.     if (bgElectricField.y > 0) bgElectricField.y -= 168;
  600.    
  601.     // Mueve el fondo
  602.     bgDeepSpace.y += 1;
  603.     if (bgDeepSpace.y > 0) bgDeepSpace.y -= 512;
  604.    
  605. }
  606.  
  607. // Funcion de control del Glow de los textos
  608. function GlowCreditsText():void {
  609.    
  610.     // Calcula el nuevo valor del glow
  611.     gfx.creditsGlowLevel ++;
  612.     if (gfx.creditsGlowLevel > 50) gfx.creditsGlowLevel = 0;
  613.     var alphaLevel:Number = ((50 - gfx.creditsGlowLevel) / 50);
  614.     var scale:Number = (gfx.creditsGlowLevel / 2);
  615.    
  616.     // Cambia el filtro
  617.     gfx.CreditsGlow.alpha = alphaLevel;
  618.     gfx.CreditsGlow.blurX = (scale + 1);
  619.     gfx.CreditsGlow.blurY = (scale + 1);
  620.    
  621.     // Aplica el filtro al texto
  622.     gui.copyright.filters = [gfx.CreditsGlow];
  623.    
  624. }
  625.  
  626.  
  627. // Crea la GUI
  628. function CreateGui():void {
  629.    
  630.     // Marcador de Score
  631.     gui.score.x = 10;
  632.     gui.score.y = 10;
  633.     gui.score.autoSize = "left";
  634.     gui.score.text = "SCORE " + game.score;
  635.     gui.score.setTextFormat(gui.style);             // Dale formato al texto
  636.    
  637.     // Marcador de rondas
  638.     gui.round.x = 320;
  639.     gui.round.y = 10;
  640.     gui.round.autoSize = "left";
  641.     gui.round.text = "ROUND " + game.round;
  642.     gui.round.setTextFormat(gui.style);             // Dale formato al texto
  643.    
  644.     // Marcador de rondas
  645.     gui.lives.x = 680;
  646.     gui.lives.y = 10;
  647.     gui.lives.autoSize = "left";
  648.     gui.lives.text = "LIVES " + game.lives;
  649.     gui.lives.setTextFormat(gui.style);             // Dale formato al texto
  650.  
  651.    
  652.     // Manda los TextFiled al stage
  653.     addChild(gui.score);
  654.     addChild(gui.round);
  655.     addChild(gui.lives);
  656.     // Aplicale los filtros
  657.     gui.score.filters = [gfx.GuiTextGlow];
  658.     gui.round.filters = [gfx.GuiTextGlow];
  659.     gui.lives.filters = [gfx.GuiTextGlow];
  660.    
  661.    
  662.     // Textos de copyright
  663.     gui.copyright.text = "(cc) 2013 Cesar Rincon / EMAID - Escola municipal d'art i diseny de Vilanova."
  664.     gui.copyright.autoSize = "left";
  665.     gui.copyright.setTextFormat(gui.miniStyle);             // Dale formato al texto
  666.     gui.copyright.x = ((stage.stageWidth >> 1) - (gui.copyright.width >> 1));
  667.     gui.copyright.y = (stage.stageHeight - gui.copyright.height);
  668.     addChild(gui.copyright);
  669.     gui.copyright.filters = [gfx.CreditsGlow];
  670.    
  671. }
  672.  
  673.  
  674. // Actualiza el Gui Score
  675. function UpdateGuiScore():void {
  676.    
  677.     // Si la puntuacion del player no es la misma que la mostrada...
  678.     if (game.guiScore < game.score) {
  679.         // Actualiza la puntuacion
  680.         game.guiScore ++;
  681.         gui.score.text = "SCORE " + game.guiScore;
  682.         gui.score.setTextFormat(gui.style);
  683.     }
  684.    
  685. }
  686.  
  687.  
  688. // Actualiza el Gui Rounds
  689. function UpdateGuiRound():void {
  690.     // Actualiza el marcador de rondas
  691.     gui.round.text = "ROUND " + game.round;
  692.     gui.round.setTextFormat(gui.style);             // Dale formato al texto
  693. }
  694.  
  695.  
  696. // Actualiza el Gui Score
  697. function UpdateGuiLives():void {
  698.     // Actualiza el marcador de vidas
  699.     gui.lives.text = "LIVES " + game.lives;
  700.     gui.lives.setTextFormat(gui.style);
  701. }
  702.  
  703.  
  704. // Crea el mensage "Press Space"
  705. function CreatePressSpace():void {
  706.    
  707.     // Crea el Texto
  708.     gui.pressSpace.autoSize = "left";           // Parametros del texto
  709.     gui.pressSpace.text = "PRESS SPACE";
  710.     gui.pressSpace.setTextFormat(gui.bigStyle); // Dale formato al texto
  711.     addChild(gui.pressSpace);                   // Mandalo al stage
  712.     gui.pressSpace.x = ((stage.stageWidth / 2) - (gui.pressSpace.width / 2));   // Posicionalo en el centro del stage
  713.     gui.pressSpace.y = ((stage.stageHeight / 2) - (gui.pressSpace.height / 2));
  714.     gui.pressSpace.filters = [gfx.BigTextGlow];
  715.     gui.pressSpace.visible = false;     // Texto oculto por defecto
  716.    
  717.     // Variables de control
  718.     game.pressSpaceShow = false;
  719.     game.pressSpaceTimer = 0;
  720.    
  721.     // Voz del evento ***
  722.     sfx.PlaySound(sfx.startVoice, CSound.voiceVol);
  723.    
  724. }
  725.  
  726.  
  727. // Crea el mensage "Game Over"
  728. function CreateGameOver():void {
  729.    
  730.     // Crea el Texto "Game Over"
  731.     gui.gameOver.autoSize = "left";             // Parametros del texto
  732.     gui.gameOver.text = "GAME OVER";
  733.     gui.gameOver.setTextFormat(gui.bigStyle);   // Dale formato al texto
  734.     addChild(gui.gameOver);                     // Mandalo al stage
  735.     gui.gameOver.x = ((stage.stageWidth / 2) - (gui.gameOver.width / 2));   // Posicionalo en el centro del stage
  736.     gui.gameOver.y = ((stage.stageHeight / 2) - gui.gameOver.height);
  737.     gui.gameOver.filters = [gfx.BigTextGlow];
  738.    
  739.     // Crea el Texto "Press Space"
  740.     gui.pressSpace.autoSize = "left";           // Parametros del texto
  741.     gui.pressSpace.text = "PRESS SPACE";
  742.     gui.pressSpace.setTextFormat(gui.style);    // Dale formato al texto
  743.     addChild(gui.pressSpace);                   // Mandalo al stage
  744.     gui.pressSpace.x = ((stage.stageWidth / 2) - (gui.pressSpace.width / 2));   // Posicionalo en el centro del stage
  745.     gui.pressSpace.y = ((stage.stageHeight / 2) + gui.pressSpace.height);
  746.     gui.pressSpace.filters = [gfx.BigTextGlow];
  747.     gui.pressSpace.visible = false;             // Texto oculto por defecto
  748.    
  749.     // Variables de control
  750.     game.pressSpaceShow = false;
  751.     game.pressSpaceTimer = 0;
  752.    
  753.     // Voz del evento ***
  754.     sfx.PlaySound(sfx.gameOver, CSound.voiceVol);
  755.    
  756. }
  757.  
  758.  
  759. // Gestion del mensage de "Press Space"
  760. function WaitForSpaceKey():Boolean {
  761.    
  762.     // Variables
  763.     var r:Boolean = false;  // Guarda si se ha presionado o no la tecla espacio
  764.    
  765.     // Gestion de la visibilidad del texto
  766.     game.pressSpaceTimer ++;
  767.     if (game.pressSpaceTimer > 15) {
  768.         game.pressSpaceTimer = 0;
  769.         game.pressSpaceShow = !game.pressSpaceShow;
  770.         gui.pressSpace.visible = game.pressSpaceShow;
  771.     }
  772.    
  773.     // Si se presiona espacio, elimina el objeto y reinicia las variables de control
  774.     if (Tools.kSpace) {
  775.         removeChild(gui.pressSpace);        // Elimina el texto del stage
  776.         game.pressSpaceShow = false;        // Reinicia las variables de control
  777.         game.pressSpaceTimer = 0;
  778.         r = true;                           // Indica que se ha presionado espacio
  779.         Tools.kSpace = false;               // Resetea la pulsacio de la tecla espacio
  780.     }
  781.    
  782.     // Devuelve el resultado
  783.     return r;
  784.    
  785. }
  786.  
  787.  
  788. // Crea los efectos graficos necesarios
  789. function CreateGfxEffects():void {
  790.    
  791.     // Explosion
  792.     gfx.explosionW = 48;            // Ancho de la explosion (grafico)
  793.     gfx.explosionH = 48;            // Alto
  794.     gfx.explosionNum = 0;           // Contador de explosiones a 0
  795.     gfx.explosionLastFrame = 28;    // Ultimo frame "valido" de la animacion
  796.    
  797. }
  798.  
  799.  
  800. // Crea una explosion en la ubicacion indicada
  801. function MakeExplosion(posX:Number, posY:Number) {
  802.    
  803.     // Crea una nueva instancia para la explosion
  804.     gfx.explosionSprite[gfx.explosionNum] = new cExplosion();
  805.     // Manda la instancia a la pantalla
  806.     addChild(gfx.explosionSprite[gfx.explosionNum]);
  807.     // Posicionala en las coordenadas indicadas
  808.     gfx.explosionSprite[gfx.explosionNum].x = (posX - (gfx.explosionW / 2));
  809.     gfx.explosionSprite[gfx.explosionNum].y = (posY - (gfx.explosionH / 2));
  810.     // *** Reordena las prioridades de los Sprites en pantalla ***
  811.     SortSprites();
  812.     // Incrementa el contador de explosiones
  813.     gfx.explosionNum ++;
  814.    
  815. }
  816.  
  817.  
  818. // Gestiona las explosiones activas en el stage
  819. function ManageExplosions():void {
  820.    
  821.     // Variables
  822.     var i:Number = 0;   // Indice
  823.     var retry = true;   // Flag de reintentos de eliminacion
  824.    
  825.     // Si hay alguna explosion activa en el stage
  826.     if (gfx.explosionNum > 0) {
  827.         // Si hay que seguir analizando explosiones...
  828.         while (retry) {
  829.             // Una vez has entrado en el bucle, flag abajo
  830.             retry = false;
  831.             // Mira si hay que eliminar alguna explosion
  832.             for (i = 0; i < gfx.explosionNum; i ++) {
  833.                 // Si ya has llegado al ultimo frame de la animacion, elimina esta instancia
  834.                 if (gfx.explosionSprite[i].currentFrame > gfx.explosionLastFrame) {
  835.                     // Elimina la instancia de esta explosion
  836.                     removeChild(gfx.explosionSprite[i]);
  837.                     // Borra los datos de la misma de los arrays
  838.                     gfx.explosionSprite.splice(i, 1);
  839.                     // Actualiza el contador
  840.                     gfx.explosionNum --;
  841.                     // Flag de reintento arriba
  842.                     retry = true;
  843.                     // Fuerza la salida de este bucle
  844.                     break;
  845.                 }
  846.             }
  847.         }
  848.     }
  849.    
  850. }
  851.  
  852.  
  853. // Funcion para ordenar los sprites en las prioridades correspondientes
  854. function SortSprites():void {
  855.    
  856.     // Variables
  857.     var i:Number;
  858.    
  859.     // Si existen, reordena los enemigos
  860.     if (enemy.enemyNum > 0) {
  861.         for (i = 0; i < enemy.enemyNum; i ++) {
  862.             setChildIndex(enemy.sprite[i], (numChildren - 1));
  863.         }
  864.     }
  865.    
  866.     // Ahora la nave del jugador y su disparo
  867.     setChildIndex(player.shootSprite, (numChildren - 1));
  868.     setChildIndex(player.sprite, (numChildren - 1));
  869.    
  870.     // Para terminar, los marcadores siempre estan visibles por encima del resto de elementos
  871.     setChildIndex(gui.score, (numChildren - 1));
  872.     setChildIndex(gui.round, (numChildren - 1));
  873.     setChildIndex(gui.lives, (numChildren - 1));
  874.     setChildIndex(gui.copyright, (numChildren - 1));
  875.    
  876. }
  877.  
  878.  
  879. // Prepara los efectos de sonido
  880. function LoadSfx():void {
  881.    
  882.     // Carga en memoria desde la biblioteca los efectos de sonido
  883.     sfx.playerShoot = new sPlayerShoot();           // Disparo del player
  884.     sfx.playerExplosion = new sPlayerExplosion();   // Explosion del Player
  885.     sfx.ufoShoot = new sUfoShoot();                 // Disparo del Enemigo
  886.     sfx.ufoExplosion = new sUfoExplosion();         // Explosion del Enemigo
  887.     sfx.startVoice = new sStartVoice();             // Voz de Game Start
  888.     sfx.gameOver = new sGameOver();                 // Voz de Game Over
  889.    
  890.     // Carga las musicas
  891.     sfx.bgm = new mMainTheme();
  892.    
  893. }
  894.  
  895.  
  896. // Funcion para el Loop de la Musica
  897. function BgmControl():void {
  898.    
  899.     // Si la musica ha llegado al final
  900.     if (sfx.bgmChannel.position >= sfx.bgm.length) {
  901.         // Asegurate de detener este canal
  902.         sfx.bgmChannel.stop();
  903.         // Reproduce de nuevo la musica
  904.         sfx.bgmChannel = sfx.PlayBgm(sfx.bgm, CSound.bgmVol);
  905.     }
  906.    
  907. }
  908.  
  909.  
  910.  
  911. /*
  912.     Inicializaciones
  913. */
  914.  
  915. // Primera Inicializacion del Juego
  916. function InitGame():void {
  917.    
  918.     CreatePlayer();                     // Crea al jugador
  919.     CreateGfxEffects();                 // Inicializa los efectos graficos
  920.     LoadSfx();                          // Carga nos efectos de sonido en RAM
  921.     ResetBackgrounds();                 // Reposiciona los fondos
  922.  
  923.     // Inicializa los demas datos de la partida
  924.     game.score = 0;         // Puntuacion del jugador a 0
  925.     game.guiScore = 0;
  926.     game.lives = 3;         // nº de vidas iniciales
  927.     game.round = 1;         // nº de ronda inicial
  928.     game.thread = 0;        // Hilo inicial para la maquina de estados
  929.     enemy.shootLack = 30;   // Carencia entre disparos
  930.    
  931.     CreateGui();            // Crea la interfaz grafica del usuario
  932.     CreatePressSpace();     // Muestra el mensage de "Press Space"
  933.    
  934.     sfx.bgmChannel = sfx.PlayBgm(sfx.bgm, CSound.bgmVol);   // Musica de fondo
  935.    
  936.     myTimer.start();                        // Enciende el timer del juego
  937.    
  938. }
  939.  
  940.  
  941. // Reinicia la partida
  942. function RestartGame():void {
  943.    
  944.     // Deten el Timer mientras dura el reinicio
  945.     myTimer.stop();
  946.    
  947.     // Inicializa los demas datos de la partida
  948.     game.score = 0;         // Puntuacion del jugador a 0
  949.     game.guiScore = -1;     // Trick para forzar la actualizacion del Score
  950.     game.lives = 3;         // nº de vidas iniciales
  951.     game.round = 1;         // nº de ronda inicial
  952.     game.thread = 0;        // Hilo inicial para la maquina de estados
  953.     enemy.shootLack = 30;   // Carencia entre disparos
  954.    
  955.     // Inicializa los flags de control
  956.     game.playerCanShoot = false;        // El jugador no puede disparar
  957.     game.enemyCanShoot = false;         // Los enemigos tampoco
  958.     player.inmune = true;               // El player es inmune
  959.     player.dead = false;                // El player no esta muerto
  960.    
  961.     // Colocalo en la posicion inicial
  962.     player.sprite.x = ((stage.stageWidth / 2) - (player.playerH / 2));
  963.     player.sprite.y = (stage.stageHeight - (player.playerV * 2));
  964.     // Control de animacion por defecto
  965.     player.animation = 0;
  966.    
  967.     // Actualiza todos los marcadores
  968.     UpdateGuiScore();
  969.     UpdateGuiRound();
  970.     UpdateGuiLives();
  971.    
  972.     // Reordena todos los objetos del juego
  973.     SortSprites();
  974.    
  975.     // Crea el Mensage de espera
  976.     CreatePressSpace();
  977.    
  978.     // Reinicia el Timer
  979.     myTimer.start();
  980.    
  981. }
  982.  
  983.  
  984.  
  985. /*
  986.     Clean up del frame
  987. */
  988.  
  989. // Elimina TODOS los eventos antes de salir del frame
  990. function GameCleanUpEvents():void {
  991.     myTimer.removeEventListener(TimerEvent.TIMER, Update);
  992.     stage.removeEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
  993.     stage.removeEventListener(KeyboardEvent.KEY_UP, KeyUp);
  994. }
  995.  
  996.  
  997.  
  998. /*
  999.     Programa principal
  1000. */
  1001.  
  1002. InitGame();         // Inicializa el juego
  1003. stop();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement