Advertisement
NightFox

FLASH PONG (20130112)

Jan 12th, 2013
242
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.     Notas del profe
  12.     Corregido ya el bug de la version anterior.
  13. */
  14.  
  15.  
  16.  
  17. /*
  18.     Importa los archivos de clases necesarios
  19. */
  20.  
  21. import flash.utils.Timer;
  22. import flash.events.TimerEvent;
  23. import flash.events.KeyboardEvent;
  24. import emaid.commons.CTools;
  25. import emaid.classes.CPong;
  26.  
  27.  
  28.  
  29.  
  30. /*
  31.     Variables globales y creacion de clases
  32. */
  33.  
  34. // Crea el objeto Tools de la Clase CTools
  35. var Tools = new CTools();
  36.  
  37. // Variables
  38. var playerSpeed:Number = 15;        // Velocidad del jugador
  39. var ballSpeedX:Number;              // Velocidades X e Y de la bola
  40. var ballSpeedY:Number;
  41. var ballStartSpeed:Number = 4;
  42. var cpuSeekDistance:Number = 250;   // Distancia de seguimiento (X)
  43. var cpuMoveSpeed:Number = 15;       // Velocidad de movimiento de la Cpu
  44. var ballMaxSpeed:Number = 0;        // Velocidad maxima de la bola
  45. var ballSpeedAcc:Number = 1;        // Incremento de velocidad a cada rebote
  46. var ballOldposX:Number;             // Guarda la posicion antes de desplazarte
  47. var ballOldposY:Number;
  48. var playerScore:Number = 0;         // Puntuacion del jugador
  49. var cpuScore:Number = 0;            // Puntuacion de la CPU
  50. var matchPoints:Number = 9;         // Numero de puntos para ganar el juego
  51. var playGame:Boolean = false;       // Control de la pausa del juego
  52. var gameOver:Boolean = false;       // Flag de Game Over
  53. var spaceKeyShow:Boolean = false;   // Flag de visualizacion de el mensage Space Key
  54. var spaceKeyTimer:Number = 0;       // Control de tiempo entre parpadeos del mensage de SpaceKey
  55.  
  56.  
  57. /*
  58.     Bloque de Update
  59. */
  60.  
  61. // Define el Timer a 30 fps
  62. var myTimer:Timer = new Timer(1000/30);
  63. // Crea el listener
  64. myTimer.addEventListener(TimerEvent.TIMER, Update);
  65. // Funcion Update
  66. function Update(e:TimerEvent) {
  67.     /*
  68.         >>> (Todo el codigo que se actualiza en cada frame, va aqui <<<
  69.     */
  70.    
  71.     if (playGame) {
  72.         // Si no hay pausa
  73.         MoveBall();             // Mueve la bola
  74.         MovePlayer();           // Mueve la pala del jugador
  75.         // Si es juego single player...
  76.         if (CPong.playerNum == 1) {
  77.             CpuIa();            // Mueve la pala de la CPU
  78.         } else {
  79.             MoveVersus();       // El player 2 mueve la segunda pala
  80.         }
  81.         PalasCollision();       // Detecta si la bola colisiona con alguna de las palas
  82.         BackupBallPos();        // Guarda la posicion actual de la bola
  83.     } else {
  84.         // Si estas en pausa, espera a que se presione espacio
  85.         if (Tools.kSpace) {
  86.             // Si es el fin de juego, vuelve al menu
  87.             if (gameOver) {
  88.                 // Deten el Timer
  89.                 myTimer.stop();
  90.                 // Elimina todos los eventos declarados
  91.                 PongCleanUpEvents();
  92.                 // Vuelve al menu
  93.                 gotoAndStop(1);
  94.             } else {   
  95.                 // Si no, continua la partida
  96.                 playGame = true;
  97.             }
  98.         }
  99.         // Gestion del mensage de Press Space Key
  100.         PressSpaceKeyMessage();
  101.     }
  102.    
  103. }
  104.  
  105.  
  106.  
  107. /*
  108.     Bloque de declaracion de funciones
  109. */
  110.  
  111. // Control del teclado mediante los eventos KEY_UP y KEY_DOWN
  112. // Al presionar una tecla...
  113. stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
  114. function KeyDown(e:KeyboardEvent):void {
  115.     // Al presionar cualquier tecla, llama a la funcion KeysDown de la Clase CTools
  116.     Tools.KeysDown(e.keyCode);
  117. }
  118. // Al soltar una tecla...
  119. stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
  120. function KeyUp(e:KeyboardEvent):void {
  121.     // Al soltar cualquier tecla, llama a la funcion KeysUp de la Clase CTools
  122.     Tools.KeysUp(e.keyCode);
  123. }
  124.  
  125.  
  126. // Movimiento de la pala del jugador
  127. function MovePlayer():void {
  128.     // Si se presiona arriba
  129.     if (Tools.kUp) {
  130.         palaA.y -= playerSpeed;
  131.         // Limites
  132.         if (palaA.y <= 20) palaA.y = 20;
  133.     }
  134.     // Si se presiona abajo
  135.     if (Tools.kDown) {
  136.         palaA.y += playerSpeed;
  137.         // Limites
  138.         if (palaA.y >= (580 - palaA.height)) palaA.y = (580 - palaA.height);
  139.     }
  140. }
  141.  
  142.  
  143. // Movimiento de la pala del jugador 2 (Versus)
  144. function MoveVersus():void {
  145.     // Variables privadas
  146.     var mousePos = (stage.mouseY - (palaB.height / 2));
  147.     // Si el puntero del mouse esta mas arriba
  148.     if (mousePos < palaB.y) {
  149.         palaB.y -= playerSpeed;
  150.         // Limites
  151.         if (palaB.y <= 20) palaB.y = 20;
  152.     }
  153.     // Si el puntero del mouse esta mas abajo
  154.     if (mousePos > palaB.y) {
  155.         palaB.y += playerSpeed;
  156.         // Limites
  157.         if (palaB.y >= (580 - palaB.height)) palaB.y = (580 - palaB.height);
  158.     }
  159. }
  160.  
  161.  
  162. // Funcion CpuIa
  163. function CpuIa():void {
  164.    
  165.     // Variables privadas
  166.     var ballY:Number = (ball.y + (ball.height / 2));    // Coordenada Y central de la bola
  167.     var palaY:Number = (palaB.y + (palaB.height / 2));  // Coordenada Y central de la pala B
  168.     var mySpeed:Number = cpuMoveSpeed;
  169.    
  170.     // Primer check, si la bola se esta acercando...
  171.     if ((ballSpeedX > 0) && (ball.x > cpuSeekDistance)) {
  172.         // Si la bola esta mas arriba, sube
  173.         if (ballY < palaY) {
  174.             // Compensa la velocidad a la baja si es necesario
  175.             if ((palaY - ballY) < mySpeed) mySpeed = (palaY - ballY);
  176.             // Mueve la pala
  177.             palaB.y -= mySpeed;
  178.             // Limites
  179.             if (palaB.y <= 20) palaB.y = 20;
  180.         }
  181.         // Si la bola esta mas abajo
  182.         if (ballY > palaY) {
  183.             // Compensa la velocidad a la baja si es necesario
  184.             if ((ballY - palaY) < mySpeed) mySpeed = (ballY - palaY);
  185.             // Mueve la pala
  186.             palaB.y += mySpeed;
  187.             // Limites
  188.             if (palaB.y >= (580 - palaB.height)) palaB.y = (580 - palaB.height);
  189.         }
  190.     }
  191.        
  192. }
  193.  
  194.  
  195. // Movimiento de la bola
  196. function MoveBall():void {
  197.    
  198.     // Variables
  199.     var distanceX:Number;   // Vector de distancia entre los dos frames
  200.     var distanceY:Number;
  201.     var pointX:Number;      // Punto de colision
  202.     var pointY:Number;
  203.     var pathX:Number;       // Punto X donde la pelota a impactado contra la pared
  204.     var top:Number = 10;    // Limites superior e inferior
  205.     var bottom:Number = (590 - ball.height);
  206.     var left:Number = 0;    // Limites izquierdo y derecho
  207.     var right:Number = (800 - ball.width);
  208.    
  209.     // Mueve la bola en ambos ejes
  210.     ball.x += ballSpeedX;
  211.     ball.y += ballSpeedY;
  212.    
  213.     // Si tocas la parte superior...
  214.     if ((ball.y <= top) && (ballOldposY >= top)) {
  215.         // Calcula la distancia Y entre los dos frames
  216.         distanceY = (ballOldposY - ball.y);
  217.         // Segun la direccion de la pelota...
  218.         if (ballOldposX > ball.x) {
  219.             // Calcula el punto de impacto
  220.             distanceX = (ballOldposX - ball.x);     // Distancia X entre los 2 frames
  221.             pointY = (top - ball.y);                // Punto Y del vector donde se produce el impacto
  222.             pointX = ((pointY * distanceX) / distanceY);    // Calculo del punto X del vector donde hay el impacto
  223.             pathX = (ball.x + pointX);      // Calcula la coordenada X real donde deberia de estar la bola
  224.         } else {
  225.             // Calcula el punto de impacto
  226.             distanceX = (ball.x - ballOldposX);     // Distancia X entre los 2 frames
  227.             pointY = (ballOldposY - top);               // Punto Y del vector donde se produce el impacto
  228.             pointX = ((pointY * distanceX) / distanceY);    // Calculo del punto X del vector donde hay el impacto
  229.             pathX = (ballOldposX + pointX);     // Calcula la coordenada X real donde deberia de estar la bola
  230.         }
  231.         // Recoloca la bola
  232.         ball.x = pathX;
  233.         ball.y = top;
  234.         ballSpeedY = -ballSpeedY;
  235.     }
  236.    
  237.     // Si tocas la parte inferior...
  238.     if ((ball.y >= bottom) && (ballOldposY <= bottom)) {
  239.         // Calcula la distancia Y entre los dos frames
  240.         distanceY = (ball.y - ballOldposY);
  241.         // Segun la direccion de la pelota...
  242.         if (ballOldposX > ball.x) {
  243.             // Calcula el punto de impacto
  244.             distanceX = (ballOldposX - ball.x);     // Distancia X entre los 2 frames
  245.             pointY = (ball.y - bottom);             // Punto Y del vector donde se produce el impacto
  246.             pointX = ((pointY * distanceX) / distanceY);    // Calculo del punto X del vector donde hay el impacto
  247.             pathX = (ball.x + pointX);          // Calcula la coordenada X real donde deberia de estar la bola
  248.         } else {
  249.             // Calcula el punto de impacto
  250.             distanceX = (ball.x - ballOldposX);     // Distancia X entre los 2 frames
  251.             pointY = (bottom - ballOldposY);                // Punto Y del vector donde se produce el impacto
  252.             pointX = ((pointY * distanceX) / distanceY);    // Calculo del punto X del vector donde hay el impacto
  253.             pathX = (ballOldposX + pointX);     // Calcula la coordenada X real donde deberia de estar la bola
  254.         }
  255.         // Recoloca la bola
  256.         ball.x = pathX;
  257.         ball.y = bottom;
  258.         ballSpeedY = -ballSpeedY;
  259.     }
  260.    
  261.     // Si tocas la parte derecha o izquierda del decorado...
  262.     if (ball.x <= left) {
  263.         ball.x = left;
  264.         ballSpeedX = -ballSpeedX;
  265.         SetPoint(false);    // Punto para la CPU
  266.     }
  267.     if (ball.x >= right) {
  268.         ball.x = right;
  269.         ballSpeedX = -ballSpeedX;
  270.         SetPoint(true);     // Punto para el Player
  271.     }
  272.    
  273. }
  274.  
  275.  
  276. // Funcion de Backup de la posicion de la bola
  277. function BackupBallPos():void {
  278.     // Guarda la posicion actual de la bola
  279.     ballOldposX = ball.x;
  280.     ballOldposY = ball.y;
  281. }
  282.  
  283.  
  284. // Funcion de deteccion de colisiones con las palas
  285. function PalasCollision():void {
  286.    
  287.     // Variables privadas
  288.     var ballY:Number = 0;               // Posicion Y de la bola
  289.     var palY:Number = 0;                // Posicion Y de la pala
  290.     var palSize:Number = 0;             // Tamaño de la pala
  291.     var collision:Boolean = false;      // Si a habido colision
  292.     var maxX:Number;        // Valores maximos para el calculo de trayectoria
  293.     var maxY:Number;
  294.     var limitXA:Number = (palaA.x + palaA.width);   // Linea limite de la pala A (Zona de colision)
  295.     var limitXB:Number = (palaB.x - ball.width);    // Linea limite de la pala B (Zona de colision)
  296.     var pointX:Number;                              // Punto de analisis para la interpolacion de la trayectoria
  297.     var pointY:Number;
  298.     var distanceX:Number;               // Distancia recorrida en los ultimos 2 frames
  299.     var distanceY:Number;
  300.     var pathY:Number;       // Punto de interseccion entre la bola y la pala en la coordenada Y
  301.    
  302.     // Si la bola va hacia la izquierda y colisiona con la pala A
  303.     if ((ballSpeedX < 0) && (ballOldposX >= limitXA) && (ball.x <= limitXA)) {
  304.         // Posible colision con la pala, analiza la trayectoria...
  305.         distanceX = ballOldposX - ball.x;                   // Calcula la distancia sobre el eje X
  306.         if (ballOldposY > ball.y) {                         // Segun que posicion Y sea mayor...
  307.             distanceY = (ballOldposY - ball.y);             // Calcula la distancia sobre el eje Y
  308.             pointX = (limitXA - ball.x);                    // Segun la direccion de la bola, calcula el punto X para el test
  309.             pointY = ((pointX * distanceY) / distanceX);    // Ahora ya puedes calcular el punto Y de la trayectoria
  310.             pathY = (ball.y + pointY);
  311.         } else {
  312.             distanceY = (ball.y - ballOldposY);             // Calcula la distancia sobre el eje Y
  313.             pointX = (ballOldposX - limitXA);               // Segun la direccion de la bola, calcula el punto X para el test
  314.             pointY = ((pointX * distanceY) / distanceX);    // Ahora ya puedes calcular el punto Y de la trayectoria
  315.             pathY = (ballOldposY + pointY);
  316.         }
  317.        
  318.         // Si hay colision...
  319.         if (((pathY + ball.height) >= palaA.y) && (pathY <= (palaA.y + palaA.height))) {
  320.             // Recoloca la bola
  321.             ball.x = (palaA.x + palaA.width);
  322.             ball.y = pathY;
  323.             // Invierte el sentido de la bola
  324.             ballSpeedX = -ballSpeedX;
  325.             // Registra la posicion de la pala e indica que a habido una colision
  326.             palY = (palaA.y + (palaA.height / 2));
  327.             palSize = palaA.height;
  328.             collision = true;
  329.         }
  330.     }
  331.    
  332.     // Si la bola va hacia la derecha y colisiona con la pala B
  333.     if ((ballSpeedX > 0) && (ballOldposX <= limitXB) && (ball.x >= limitXB)) {
  334.         // Posible colision con la pala, analiza la trayectoria...
  335.         distanceX = ball.x - ballOldposX;                   // Calcula la distancia sobre el eje X
  336.         if (ballOldposY > ball.y) {                         // Segun que posicion Y sea mayor...
  337.             distanceY = (ballOldposY - ball.y);             // Calcula la distancia sobre el eje Y
  338.             pointX = (ball.x - limitXB);                    // Segun la direccion de la bola, calcula el punto X para el test
  339.             pointY = ((pointX * distanceY) / distanceX);    // Ahora ya puedes calcular el punto Y de la trayectoria
  340.             pathY = (ball.y + pointY);
  341.         } else {
  342.             distanceY = (ball.y - ballOldposY);             // Calcula la distancia sobre el eje Y
  343.             pointX = (limitXB - ballOldposX);               // Segun la direccion de la bola, calcula el punto X para el test
  344.             pointY = ((pointX * distanceY) / distanceX);    // Ahora ya puedes calcular el punto Y de la trayectoria
  345.             pathY = (ballOldposY + pointY);
  346.         }
  347.         // Si hay colision...
  348.         if (((pathY + ball.height) >= palaB.y) && (pathY <= (palaB.y + palaB.height))) {
  349.             // Recoloca la bola
  350.             ball.x = (palaB.x - ball.width);
  351.             ball.y = pathY;
  352.             // Invierte el sentido de la bola
  353.             ballSpeedX = -ballSpeedX;
  354.             // Registra la posicion de la pala e indica que a habido una colision
  355.             palY = (palaB.y + (palaB.height / 2));
  356.             palSize = palaB.height;
  357.             collision = true;
  358.         }
  359.     }
  360.    
  361.     // Angulo de rebote Y velocidad si hay colision
  362.     if (collision) {
  363.        
  364.         // Calcula la Y de la bola
  365.         ballY = (ball.y + (ball.height / 2));
  366.         maxY = (ballMaxSpeed * 1.5);
  367.         // Si has colisionado en la zona superior...
  368.         if (ballY < (palY - (palSize / 8))) {
  369.             ballSpeedY = -((palY - ballY) / 4);
  370.             if (ballSpeedY < -maxY) ballSpeedY = -maxY;
  371.         }
  372.         // Si has colisionado en la zona inferior...
  373.         if (ballY > (palY + (palSize / 8))) {
  374.             ballSpeedY = ((ballY - palY) / 4);
  375.             if (ballSpeedY > maxY) ballSpeedY = maxY;
  376.         }
  377.        
  378.         // Si ivas hacia la derecha
  379.         if (ballSpeedX > 0) {
  380.             // Aumenta la velocidad
  381.             ballSpeedX += ballSpeedAcc;
  382.             // Y limita el maximo
  383.             if (ballSpeedX > ballMaxSpeed) ballSpeedX = ballMaxSpeed;
  384.         } else {
  385.             // Aumenta la velocidad
  386.             ballSpeedX -= ballSpeedAcc;
  387.             // Y limita el maximo
  388.             if (ballSpeedX < -ballMaxSpeed) ballSpeedX = -ballMaxSpeed;
  389.         }
  390.        
  391.     }
  392.    
  393.    
  394. }
  395.  
  396.  
  397. // Actualiza los marcadores de puntuacion
  398. function UpdateScore():void {
  399.    
  400.     // Score del player
  401.     scoreA.gotoAndStop(playerScore + 1);
  402.     // Score de la CPU
  403.     scoreB.gotoAndStop(cpuScore + 1);
  404.    
  405. }
  406.  
  407.  
  408. // Funcion SetPoint (Mira quien ha marcado el punto)
  409. function SetPoint(player:Boolean):void {
  410.    
  411.     // Recoloca las palas en las posiciones iniciales
  412.     palaA.y = (300 - (palaA.height / 2));
  413.     palaB.y = (300 - (palaB.height / 2));
  414.    
  415.     // Dependiendo de quien sea el punto...
  416.     if (player) {
  417.         // Si el punto es del jugador
  418.         playerScore ++;
  419.         // Haz que la CPU sea mas lista, reduciendo el tiempo de reaccion
  420.         cpuSeekDistance -= 10;
  421.         // Si ha ganado la partida...
  422.         if (playerScore >= matchPoints) {
  423.             playerScore = matchPoints;
  424.             // Indica el final del juego
  425.             gameOver = true;
  426.             // Muestra el cartel correspondiente
  427.             winText.alpha = 1;
  428.         }
  429.         // Recoloca la bola
  430.         ball.y = (palaB.y + (palaB.height / 2) - (ball.height / 2));
  431.         ball.x = (palaB.x - 50);
  432.         // Reinicia la velocidad X
  433.         ballSpeedX = -ballStartSpeed;
  434.     } else {
  435.         // Si el punto es de la CPU
  436.         cpuScore ++;
  437.         // Si ha ganado la partida...
  438.         if (cpuScore >= matchPoints) {
  439.             cpuScore = matchPoints;
  440.             // Indica el final del juego
  441.             gameOver = true;
  442.             // Muestra el cartel correspondiente
  443.             loseText.alpha = 1;
  444.         }
  445.         ball.y = (palaA.y + (palaA.height / 2) - (ball.height / 2));
  446.         ball.x = (palaA.x + 50);
  447.         // Reinicia la velocidad X
  448.         ballSpeedX = ballStartSpeed;
  449.     }
  450.    
  451.     // Guarda la posicion actual de la bola
  452.     BackupBallPos();
  453.    
  454.     // Pausa el juego
  455.     playGame = false;
  456.    
  457.     // Actualiza los marcadores
  458.     UpdateScore();
  459.    
  460.     // Reinicia la velocidad Y
  461.     ballSpeedY = ballStartSpeed;
  462.    
  463. }
  464.  
  465. // Control del mensage de Press Space Key
  466. function PressSpaceKeyMessage():void {
  467.    
  468.     if (playGame) {
  469.         // Si el juego esta en marcha, oculta el mensage
  470.         spaceKey.alpha = 0;
  471.         spaceKeyShow = false;
  472.         spaceKeyTimer = 0;
  473.     } else {
  474.         // Si no, animacion del mensage de Space Key
  475.         spaceKeyTimer ++;
  476.         if (spaceKeyTimer >= 30) {
  477.             spaceKeyTimer = 0;
  478.             if (spaceKeyShow) {
  479.                 // Muestra el mensage
  480.                 spaceKey.alpha = 1;
  481.             } else {
  482.                 // Oculta el mensage
  483.                 spaceKey.alpha = 0;
  484.             }
  485.             // Invierte el estado de visivilidad
  486.             spaceKeyShow = !spaceKeyShow;
  487.         }
  488.     }
  489.    
  490. }
  491.  
  492.  
  493. // Elimina TODOS los eventos antes de salir del frame
  494. function PongCleanUpEvents():void {
  495.     myTimer.removeEventListener(TimerEvent.TIMER, Update);
  496.     stage.removeEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
  497.     stage.removeEventListener(KeyboardEvent.KEY_UP, KeyUp);
  498. }
  499.  
  500.  
  501. // Incializa los datos necesarios para que el juego funcione
  502. function InitGame():void {
  503.     ballMaxSpeed = palaA.width * 4; // Velocidad maxima de la pelota == ancho de la paleta
  504.     ballSpeedX = ballStartSpeed;    // Velocidad Inicial
  505.     ballSpeedY = ballStartSpeed;    // Velocidad Inicial
  506.     UpdateScore();                  // Actualiza los marcadores
  507.     BackupBallPos();                // Guarda la posicion actual de la pelota
  508. }
  509.  
  510.  
  511.  
  512.  
  513. /*
  514.     Bloque del programa principal
  515. */
  516.  
  517. // Inicializaciones
  518. InitGame();
  519.  
  520. // Enciende el Timer
  521. myTimer.start();
  522.  
  523. // Deten FLASH para que no sale al siguiente frame
  524. stop();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement