Advertisement
NightFox

PONG - Flash

Jan 2nd, 2013
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Pong
  2. // (c)2012 Cèsar Rincón Nadal
  3. // EMAID - Escola d'art i diseny de Vilanova
  4.  
  5. /*
  6.     Juego
  7. */
  8.  
  9.  
  10.  
  11. /*
  12.     Importa los archivos de clases necesarios
  13. */
  14.  
  15. import flash.utils.Timer;
  16. import flash.events.TimerEvent;
  17. import flash.events.KeyboardEvent;
  18. import emaid.commons.CTools;
  19. import emaid.classes.CPong;
  20.  
  21.  
  22.  
  23.  
  24. /*
  25.     Variables globales y creacion de clases
  26. */
  27.  
  28. // Crea el objeto Tools de la Clase CTools
  29. var Tools = new CTools();
  30.  
  31. // Variables
  32. var playerSpeed:Number = 12;        // Velocidad del jugador
  33. var ballSpeedX:Number;              // Velocidades X e Y de la bola
  34. var ballSpeedY:Number;
  35. var ballStartSpeed:Number = 5;
  36. var cpuSeekDistance:Number = 300;   // Distancia de seguimiento (X)
  37. var cpuMoveSpeed:Number = 12;       // Velocidad de movimiento de la Cpu
  38. var ballMaxSpeed:Number = 0;        // Velocidad maxima de la bola
  39. var ballSpeedAcc:Number = 1;        // Incremento de velocidad a cada rebote
  40. var playerScore:Number = 0;         // Puntuacion del jugador
  41. var cpuScore:Number = 0;            // Puntuacion de la CPU
  42. var matchPoints:Number = 9;         // Numero de puntos para ganar el juego
  43. var playGame:Boolean = false;       // Control de la pausa del juego
  44. var gameOver:Boolean = false;       // Flag de Game Over
  45. var spaceKeyShow:Boolean = false;   // Flag de visualizacion de el mensage Space Key
  46. var spaceKeyTimer:Number = 0;       // Control de tiempo entre parpadeos del mensage de SpaceKey
  47.  
  48.  
  49. /*
  50.     Bloque de Update
  51. */
  52.  
  53. // Define el Timer a 30 fps
  54. var myTimer:Timer = new Timer(1000/30);
  55. // Crea el listener
  56. myTimer.addEventListener(TimerEvent.TIMER, Update);
  57. // Funcion Update
  58. function Update(e:TimerEvent) {
  59.     /*
  60.         >>> (Todo el codigo que se actualiza en cada frame, va aqui <<<
  61.     */
  62.    
  63.     if (playGame) {
  64.         // Si no hay pausa
  65.         MoveBall();             // Mueve la bola
  66.         MovePlayer();           // Mueve la pala del jugador
  67.         // Si es juego single player...
  68.         if (CPong.playerNum == 1) {
  69.             CpuIa();            // Mueve la pala de la CPU
  70.         } else {
  71.             MoveVersus();       // El player 2 mueve la segunda pala
  72.         }
  73.         PalasCollision();       // Detecta si la bola colisiona con alguna de las palas
  74.     } else {
  75.         // Si estas en pausa, espera a que se presione espacio
  76.         if (Tools.kSpace) {
  77.             // Si es el fin de juego, vuelve al menu
  78.             if (gameOver) {
  79.                 // Deten el Timer
  80.                 myTimer.stop();
  81.                 // Elimina todos los eventos declarados
  82.                 PongCleanUpEvents();
  83.                 // Vuelve al menu
  84.                 gotoAndStop(1);
  85.             } else {   
  86.                 // Si no, continua la partida
  87.                 playGame = true;
  88.             }
  89.         }
  90.         // Gestion del mensage de Press Space Key
  91.         PressSpaceKeyMessage();
  92.     }
  93.    
  94. }
  95.  
  96.  
  97.  
  98. /*
  99.     Bloque de declaracion de funciones
  100. */
  101.  
  102. // Control del teclado mediante los eventos KEY_UP y KEY_DOWN
  103. // Al presionar una tecla...
  104. stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
  105. function KeyDown(e:KeyboardEvent):void {
  106.     // Al presionar cualquier tecla, llama a la funcion KeysDown de la Clase CTools
  107.     Tools.KeysDown(e.keyCode);
  108. }
  109. // Al soltar una tecla...
  110. stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
  111. function KeyUp(e:KeyboardEvent):void {
  112.     // Al soltar cualquier tecla, llama a la funcion KeysUp de la Clase CTools
  113.     Tools.KeysUp(e.keyCode);
  114. }
  115.  
  116.  
  117. // Movimiento de la pala del jugador
  118. function MovePlayer():void {
  119.     // Si se presiona arriba
  120.     if (Tools.kUp) {
  121.         palaA.y -= playerSpeed;
  122.         // Limites
  123.         if (palaA.y <= 20) palaA.y = 20;
  124.     }
  125.     // Si se presiona abajo
  126.     if (Tools.kDown) {
  127.         palaA.y += playerSpeed;
  128.         // Limites
  129.         if (palaA.y >= (580 - palaA.height)) palaA.y = (580 - palaA.height);
  130.     }
  131. }
  132.  
  133.  
  134. // Movimiento de la pala del jugador 2 (Versus)
  135. function MoveVersus():void {
  136.     // Variables privadas
  137.     var mousePos = (stage.mouseY - (palaB.height / 2));
  138.     // Si el puntero del mouse esta mas arriba
  139.     if (mousePos < palaB.y) {
  140.         palaB.y -= playerSpeed;
  141.         // Limites
  142.         if (palaB.y <= 20) palaB.y = 20;
  143.     }
  144.     // Si el puntero del mouse esta mas abajo
  145.     if (mousePos > palaB.y) {
  146.         palaB.y += playerSpeed;
  147.         // Limites
  148.         if (palaB.y >= (580 - palaB.height)) palaB.y = (580 - palaB.height);
  149.     }
  150. }
  151.  
  152.  
  153. // Funcion CpuIa
  154. function CpuIa():void {
  155.    
  156.     // Variables privadas
  157.     var ballY:Number = (ball.y + (ball.height / 2));    // Coordenada Y central de la bola
  158.     var palaY:Number = (palaB.y + (palaB.height / 2));  // Coordenada Y central de la pala B
  159.     var mySpeed:Number = cpuMoveSpeed;
  160.    
  161.     // Primer check, si la bola se esta acercando...
  162.     if ((ballSpeedX > 0) && (ball.x > cpuSeekDistance)) {
  163.         // Si la bola esta mas arriba, sube
  164.         if (ballY < palaY) {
  165.             // Compensa la velocidad a la baja si es necesario
  166.             if ((palaY - ballY) < mySpeed) mySpeed = (palaY - ballY);
  167.             // Mueve la pala
  168.             palaB.y -= mySpeed;
  169.             // Limites
  170.             if (palaB.y <= 20) palaB.y = 20;
  171.         }
  172.         // Si la bola esta mas abajo
  173.         if (ballY > palaY) {
  174.             // Compensa la velocidad a la baja si es necesario
  175.             if ((ballY - palaY) < mySpeed) mySpeed = (ballY - palaY);
  176.             // Mueve la pala
  177.             palaB.y += mySpeed;
  178.             // Limites
  179.             if (palaB.y >= (580 - palaB.height)) palaB.y = (580 - palaB.height);
  180.         }
  181.     }
  182.        
  183. }
  184.  
  185.  
  186. // Movimiento de la bola
  187. function MoveBall():void {
  188.    
  189.     // Mueve la bola en ambos ejes
  190.     ball.x += ballSpeedX;
  191.     ball.y += ballSpeedY;
  192.    
  193.     // Si tocas la parte superior o inferior del decorado...
  194.     if (ball.y <= 10) {
  195.         ball.y = 10;
  196.         ballSpeedY = -ballSpeedY;
  197.     }
  198.     if (ball.y >= (590 - ball.height)) {
  199.         ball.y = (590 - ball.height);
  200.         ballSpeedY = -ballSpeedY;
  201.     }
  202.    
  203.     // Si tocas la parte derecha o izquierda del decorado...
  204.     if (ball.x <= 0) {
  205.         ball.x = 0;
  206.         ballSpeedX = -ballSpeedX;
  207.         SetPoint(false);    // Punto para la CPU
  208.     }
  209.     if (ball.x >= (800 - ball.width)) {
  210.         ball.x = (800 - ball.width);
  211.         ballSpeedX = -ballSpeedX;
  212.         SetPoint(true); // Punto para el Player
  213.     }
  214.    
  215. }
  216.  
  217.  
  218. // Funcion de deteccion de colisiones con las palas
  219. function PalasCollision():void {
  220.    
  221.     // Variables privadas
  222.     var ballY:Number = 0;               // Posicion Y de la bola
  223.     var palY:Number = 0;                // Posicion Y de la pala
  224.     var palSize:Number = 0;             // Tamaño de la pala
  225.     var collision:Boolean = false;      // Si a habido colision
  226.     var maxY:Number = (ballMaxSpeed * 1.5);
  227.    
  228.     // Si la bola va hacia la izquierda y colisiona con la pala A
  229.     if (ballSpeedX < 0) {
  230.         // Si hay colision...
  231.         if (Tools.BoxCollision(ball.x, ball.y, ball.width, ball.height, palaA.x, palaA.y, palaA.width, palaA.height)) {
  232.             // Recoloca la bola
  233.             ball.x = (palaA.x + palaA.width);
  234.             // Invierte el sentido de la bola
  235.             ballSpeedX = -ballSpeedX;
  236.             // Registra la posicion de la pala e indica que a habido una colision
  237.             palY = (palaA.y + (palaA.height / 2));
  238.             palSize = palaA.height;
  239.             collision = true;
  240.         }
  241.     }
  242.    
  243.     // Si la bola va hacia la derecha y colisiona con la pala B
  244.     if (ballSpeedX > 0) {
  245.         // Si hay colision...
  246.         if (Tools.BoxCollision(ball.x, ball.y, ball.width, ball.height, palaB.x, palaB.y, palaB.width, palaB.height)) {
  247.             // Recoloca la bola
  248.             ball.x = (palaB.x - ball.width);
  249.             // Invierte el sentido de la bola
  250.             ballSpeedX = -ballSpeedX;
  251.             // Registra la posicion de la pala e indica que a habido una colision
  252.             palY = (palaB.y + (palaB.height / 2));
  253.             palSize = palaB.height;
  254.             collision = true;
  255.         }
  256.     }
  257.    
  258.     // Angulo de rebote Y velocidad si hay colision
  259.     if (collision) {
  260.        
  261.         // Calcula la Y de la bola
  262.         ballY = (ball.y + (ball.height / 2));
  263.         // Si has colisionado en la zona superior...
  264.         if (ballY < (palY - (palSize / 8))) {
  265.             ballSpeedY = -((palY - ballY) / 4);
  266.             if (ballSpeedY < -maxY) ballSpeedY = -maxY;
  267.         }
  268.         // Si has colisionado en la zona inferior...
  269.         if (ballY > (palY + (palSize / 8))) {
  270.             ballSpeedY = ((ballY - palY) / 4);
  271.             if (ballSpeedY > maxY) ballSpeedY = maxY;
  272.         }
  273.        
  274.         // Si ivas hacia la derecha
  275.         if (ballSpeedX > 0) {
  276.             // Aumenta la velocidad
  277.             ballSpeedX += ballSpeedAcc;
  278.             // Y limita el maximo
  279.             if (ballSpeedX > ballMaxSpeed) ballSpeedX = ballMaxSpeed;
  280.         } else {
  281.             // Aumenta la velocidad
  282.             ballSpeedX -= ballSpeedAcc;
  283.             // Y limita el maximo
  284.             if (ballSpeedX < -ballMaxSpeed) ballSpeedX = -ballMaxSpeed;
  285.         }
  286.        
  287.     }
  288.    
  289.    
  290. }
  291.  
  292.  
  293. // Actualiza los marcadores de puntuacion
  294. function UpdateScore():void {
  295.    
  296.     // Score del player
  297.     scoreA.gotoAndStop(playerScore + 1);
  298.     // Score de la CPU
  299.     scoreB.gotoAndStop(cpuScore + 1);
  300.    
  301. }
  302.  
  303.  
  304. // Funcion SetPoint (Mira quien ha marcado el punto)
  305. function SetPoint(player:Boolean):void {
  306.    
  307.     // Recoloca las palas en las posiciones iniciales
  308.     palaA.y = (300 - (palaA.height / 2));
  309.     palaB.y = (300 - (palaB.height / 2));
  310.    
  311.     // Dependiendo de quien sea el punto...
  312.     if (player) {
  313.         // Si el punto es del jugador
  314.         playerScore ++;
  315.         // Haz que la CPU sea mas lista, reduciendo el tiempo de reaccion
  316.         cpuSeekDistance -= 10;
  317.         // Si ha ganado la partida...
  318.         if (playerScore >= matchPoints) {
  319.             playerScore = matchPoints;
  320.             // Indica el final del juego
  321.             gameOver = true;
  322.             // Muestra el cartel correspondiente
  323.             winText.alpha = 1;
  324.         }
  325.         // Recoloca la bola
  326.         ball.y = (palaB.y + (palaB.height / 2) - (ball.height / 2));
  327.         ball.x = (palaB.x - 50);
  328.         // Reinicia la velocidad X
  329.         ballSpeedX = -ballStartSpeed;
  330.     } else {
  331.         // Si el punto es de la CPU
  332.         cpuScore ++;
  333.         // Si ha ganado la partida...
  334.         if (cpuScore >= matchPoints) {
  335.             cpuScore = matchPoints;
  336.             // Indica el final del juego
  337.             gameOver = true;
  338.             // Muestra el cartel correspondiente
  339.             loseText.alpha = 1;
  340.         }
  341.         ball.y = (palaA.y + (palaA.height / 2) - (ball.height / 2));
  342.         ball.x = (palaA.x + 50);
  343.         // Reinicia la velocidad X
  344.         ballSpeedX = ballStartSpeed;
  345.     }
  346.    
  347.     // Pausa el juego
  348.     playGame = false;
  349.    
  350.     // Actualiza los marcadores
  351.     UpdateScore();
  352.    
  353.     // Reinicia la velocidad Y
  354.     ballSpeedY = ballStartSpeed;
  355.    
  356. }
  357.  
  358. // Control del mensage de Press Space Key
  359. function PressSpaceKeyMessage():void {
  360.    
  361.     if (playGame) {
  362.         // Si el juego esta en marcha, oculta el mensage
  363.         spaceKey.alpha = 0;
  364.         spaceKeyShow = false;
  365.         spaceKeyTimer = 0;
  366.     } else {
  367.         // Si no, animacion del mensage de Space Key
  368.         spaceKeyTimer ++;
  369.         if (spaceKeyTimer >= 30) {
  370.             spaceKeyTimer = 0;
  371.             if (spaceKeyShow) {
  372.                 // Muestra el mensage
  373.                 spaceKey.alpha = 1;
  374.             } else {
  375.                 // Oculta el mensage
  376.                 spaceKey.alpha = 0;
  377.             }
  378.             // Invierte el estado de visivilidad
  379.             spaceKeyShow = !spaceKeyShow;
  380.         }
  381.     }
  382.    
  383. }
  384.  
  385.  
  386. // Elimina TODOS los eventos antes de salir del frame
  387. function PongCleanUpEvents():void {
  388.     myTimer.removeEventListener(TimerEvent.TIMER, Update);
  389.     stage.removeEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
  390.     stage.removeEventListener(KeyboardEvent.KEY_UP, KeyUp);
  391. }
  392.  
  393.  
  394.  
  395. /*
  396.     Bloque del programa principal
  397. */
  398.  
  399. // Inicializaciones
  400. ballMaxSpeed = palaA.width;     // Velocidad maxima de la pelota == ancho de la paleta
  401. ballSpeedX = ballStartSpeed;    // Velocidad Inicial
  402. ballSpeedY = ballStartSpeed;    // Velocidad Inicial
  403. UpdateScore();                  // Actualiza los marcadores
  404.  
  405. // Enciende el Timer
  406. myTimer.start();
  407.  
  408. // Deten FLASH para que no sale al siguiente frame
  409. stop();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement