Advertisement
NightFox

Pong - Flash (11/01/2013)

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