Crea un juego de Space Shooter en Flash usando AS3

Sigue los pasos sencillos de este Tutorial Premium para crear un entretenido juego de disparos con Flash y AS3.


Paso 1: Breve descripción

Usando sprites prefabricados y las herramientas de Flash, crearemos una interfaz gráfica con buen aspecto que estará alimentada por varias clases de ActionScript 3.

El usuario podrá controlar una nave espacial y disparar a varios enemigos mientras viaja en el espacio.


Paso 2: Configuración del documento Flash

Abra Flash y cree un documento de 320 píxeles de ancho y 480 píxeles de alto. Establecer la velocidad de fotogramas a 24 fps.



Paso 3: Interfaz


Nuestra interfaz estará compuesta por varios sprites, campos de texto y clips de película..

Continúe con los siguientes pasos y veremos cómo crearlo..


Paso 4: Antecedentes

El fondo será muy simple, ya que las estrellas se generan utilizando ActionScript.

Crea un rectángulo de 320x480 px y rellénalo con negro. Podrías añadir un ligero gradiente radial..


Usa el panel Alinear (Cmd + K) para centrarlo en el escenario.


Paso 5: Sprites

He usado una gran biblioteca de sprites en la demostración de este tutorial, estos son parte de SpriteLib de Flying Yogi..



Paso 6: Sprite MovieClips

Importe los sprites al escenario (Cmd + R), conviértalos a MovieClips y ajuste los marcos para mostrar una animación agradable.



Paso 7: Puntuación TextField

Se necesitará un campo de texto dinámico para mostrar la puntuación del juego. Utilice la herramienta de texto (T) para crear uno; nombralo puntuaciónTF y colóquelo en la esquina inferior izquierda del escenario..



Paso 8: Incrustar Fuente

Para utilizar una fuente personalizada en un campo de texto dinámico, debe incrustarla en su aplicación. Selecciona el campo de texto y usa el Propiedades panel de Empotrar? Botón para agregar los caracteres necesarios..



Paso 9: Vista de alerta

La vista de alerta se mostrará cuando el usuario alcance un estado de juego (ganar, perder). Use la fuente que desee para crear una pantalla simple con dos campos de texto dinámicos; nómbralos titleTF y msgTF, convertir el cuadro a un clip de película y establecer su nombre de clase en AlertView.



Paso 10: Sonidos


Utilizaremos los efectos de sonido para mejorar la sensación del juego, puede encontrar los sonidos utilizados en este ejemplo en Soungle.com utilizando las palabras clave Espacio, explosión y láser..


Paso 11: Tween Nano


Usaremos un motor de interpolación diferente del predeterminado incluido en Flash, esto aumentará el rendimiento y será más fácil de usar.

Puedes descargar Tween Nano desde su sitio web oficial..


Paso 12: Nueva clase de ActionScript

Cree una nueva clase de ActionScript 3.0 (Cmd + N) y guárdela como Main.as en la carpeta de tu clase.



Paso 13: Estructura de la clase

Crea tu estructura de clase básica para comenzar a escribir tu código.

 paquete import flash.display.Sprite; clase pública Main extiende Sprite función pública Main (): void // código constructor

Paso 14: Clases Requeridas

Estas son las clases que necesitaremos importar para que nuestra clase funcione; la importar La directiva hace que las clases y los paquetes definidos externamente estén disponibles para su código..

 importar flash.display.Sprite; importar flash.ui.Mouse; import com.greensock.TweenNano; import com.greensock.easing.Expo; import flash.events.MouseEvent; import flash.events.Event; import flash.utils.Timer; import flash.events.TimerEvent;

Paso 15: Variables

Estas son las variables que usaremos, lea los comentarios en el código para saber más sobre ellas..

 var estrellas privadas: Sprite; // almacenará el fondo de las estrellas privado var starsCopy: Sprite; // Otra versión del fondo de estrellas privado var ship: Ship; balas de var privado: vector. = nuevo vector.(); // Mantendrá las balas en el escenario privado var enemigos: Array = new Array (); // Mantendrá a los enemigos en el escenario privado var timer: Timer = new Timer (500); // El tiempo en el que un nuevo enemigo aparecerá privado var alertView: AlertView; vidas privadas: Vector.; // Guardará los gráficos de vidas privadas var boss: Boss; privada var bossHealth: int = 20; Private var laserSound: Laser = new Laser (); private var bossSound: UFO = new UFO (); Private var exSound: Explosion = new Explosion ();

Paso 16: Código Constructor

El constructor es una función que se ejecuta cuando un objeto se crea a partir de una clase, este código es el primero en ejecutarse cuando se crea una instancia de un objeto o se ejecuta utilizando la Clase de documento.

Se llama a las funciones necesarias para iniciar el juego. Comprueba esas funciones en los siguientes pasos..

 Función final pública Main (): void
buildStars (200); // Esta función inicia la creación del juego

Paso 17: Construye Estrellas

los buildStars () El método utiliza Star MC en la biblioteca para crear un fondo con estrellas colocadas al azar. Se crean dos sprites para interpolar a ambos y simular el movimiento, usando el mismo truco que en este tutorial de desplazamiento de paralaje..

 función final privada buildStars (n: int): void stars = new Sprite (); para (var i: int = 0; i < n; i++)  var star:Star = new Star(); star.alpha = Math.random() * 1; star.scaleX = Math.random() * 1; star.scaleY = star.scaleX; star.x = Math.floor(Math.random() * stage.stageWidth); star.y = Math.floor(Math.random() * stage.stageHeight-20); stars.addChild(star);  /* Create another stars sprite to make animation */ starsCopy = new Sprite(); for(var j:int = 0; j < n; j++)  var star2:Star = new Star(); star2.alpha = Math.random() * 1 + 0.2; star2.scaleX = Math.random() * 1; star2.scaleY = star.scaleX; star2.x = Math.floor(Math.random() * stage.stageWidth); star2.y = Math.floor(Math.random() * stage.stageHeight-20); starsCopy.addChild(star2);  starsCopy.y = -stage.stageHeight; addChild(starsCopy); addChild(stars); addShip(); //Add ship (player) to stage 

Paso 18: Añadir nave

Esta función crea una instancia de Ship MC en la biblioteca y la coloca en el escenario con una animación nítida..

 función final privada addShip (): void ship = new Ship (); ship.x = stage.stageWidth * 0.5; ship.y = stage.stageHeight + ship.height; addChild (nave); TweenNano.to (nave, 2, y: (stage.stageHeight - ship.height) - 10, facilidad: Expo.easeOut, onComplete: listeners ()); addLives (); 

Paso 19: Añadir vidas

Reutilizando el MC del barco, tres sprites de barco se agregan al escenario como un indicador de vidas. Las naves se agregan a un Vector para verificar el juego más adelante en el juego..

 Función final privada addLives (): void lives = new Vector.(); para (var i: int = 0; i < 3; i++)  var live:Ship = new Ship(); live.stop(); live.width = 16; live.height = 16; live.x = (stage.stageWidth - live.width * 0.7) - (5 * i+1) - live.width * i; live.y = stage.stageHeight - live.height * 0.7; addChild(live); lives.push(live);  

Paso 20: Añadir escuchas

Estas líneas agregarán los oyentes necesarios al escenario y al temporizador; esto incluye eventos del mouse, eventos del temporizador y eventos EnterFrame que actualizarán el juego en cada frame.

 escuchas de la función final privada (acción: String = 'agregar'): void if (acción == 'agregar') stage.addEventListener (MouseEvent.MOUSE_MOVE, moveShip); stage.addEventListener (MouseEvent.MOUSE_DOWN, disparar); timer.addEventListener (TimerEvent.TIMER, addEnemy); stage.addEventListener (Event.ENTER_FRAME, actualización); timer.start ();  else stage.removeEventListener (MouseEvent.MOUSE_MOVE, moveShip); stage.removeEventListener (MouseEvent.MOUSE_DOWN, disparar); timer.removeEventListener (TimerEvent.TIMER, addEnemy); stage.removeEventListener (Event.ENTER_FRAME, actualización); timer.stop (); 

Paso 21: Mover el barco

La nave del jugador será controlada por el mouse, la siguiente función se encarga de que:

 función final privada moveShip (e: MouseEvent): void ship.x = mouseX; 

Paso 22: disparar

Nuestra nave podrá disparar balas para destruir y protegerse de los enemigos. Esta función se ejecutará cada vez que el usuario haga clic en el escenario y colocará una bala frente al barco que luego será movida por el actualizar() función. También reproduce un sonido de disparo..

 sesión de función final privada (e: MouseEvent): void var bullet: Bullet = new Bullet (); bullet.x = ship.x; bullet.y = ship.y - (ship.height * 0.5); laserSound.play (); // Reproducir sonido bullets.push (bullet); addChild (viñeta); 

Paso 23: Añadir Enemigo

No sería un tirador sin algo que disparar. Los enemigos son creados por la siguiente función, un temporizador se usa para crear un enemigo cada 500 milisegundos (puedes cambiar ese valor en el paso de variables) que luego es movido por actualizar() función.

 función final privada addEnemy (e: TimerEvent): void var enemy: Enemy = new Enemy (); enemy.x = Math.floor (Math.random () * (stage.stageWidth - enemy.width)); enemy.y = -enemy.height; enemigos.push (enemigo); addChild (enemigo); 

Paso 24: Vista de alerta

La vista de alerta muestra la información del jugador sobre el estado del juego, se muestra cuando se alcanza un evento del juego.

Se utilizan dos parámetros en esta función:

  • t: El titulo de alerta
  • metro: Un mensaje corto
 alerta de la función final privada (t: String, m: String): void listeners ('remove'); / * Crear y mostrar alerta * / alertView = new AlertView (); alertView.x = stage.stageWidth * 0.5; alertView.y = stage.stageHeight * 0.5; alertView.titleTF.text = t; alertView.msgTF.text = m; alertView.addEventListener (MouseEvent.MOUSE_UP, reinicio); addChild (alertView); 

Paso 25: Actualizar

los actualizar() La función se ejecuta en cada fotograma, maneja todos los movimientos y colisiones del juego. Es la función de bucle del juego para este juego. Echa un vistazo a los siguientes pasos para ver su comportamiento..

 actualización de la función final privada (e: Evento): void // code

Paso 26: mover fondo

El fondo se mueve cada cuadro para simular el viaje espacial; cuando el sprite de las estrellas inferiores alcanza el límite del escenario, se mueve de nuevo a la parte superior, creando un bucle.

 stars.y + = 5; starsCopy.y + = 5; if (stars.y> = stage.stageHeight - 20) stars.y = -stars.height;  else if (starsCopy.y> = stage.stageHeight - 20) starsCopy.y = -stars.height; 

Paso 27: mover balas

Las siguientes líneas de código comprueban si hay viñetas en etapa; Si es cierto, las balas se mueven hacia arriba; Cuando una bala ya no es visible, se destruye..

 if (bullets.length! = 0) for (var i: int = 0; i < bullets.length; i++)  bullets[i].y -= 10; /* Destroy offstage bullets */ if(bullets[i].y < 0)  removeChild(bullets[i]); bullets[i] = null; bullets.splice(i, 1);   

Paso 28: Jefe

Agregaremos un jefe grande y malo al juego. Cuando el usuario alcanza cierta puntuación, el jefe aparecerá:

 if (int (scoreTF.text) == 500 && boss == null) boss = new Boss (); bossSound.play (); boss.x = stage.stageWidth * 0.5; boss.y = -boss.height; TweenNano.to (jefe, 3, y: 80); addChild (jefe); 

Paso 29: Mueve enemigos

Los enemigos también se mueven cada cuadro. Este código encuentra a todos los enemigos en el escenario utilizando la matriz y los mueve 5px hacia abajo.

 if (enemy.length! = 0) for (var j: int = 0; j < enemies.length; j++)  /* Move enemies */ enemies[j].y += 5;

Paso 30: Colisión enemigo-nave

Aquí comprobamos si un enemigo choca con la nave del jugador; Si lo hace, se realizan una serie de acciones comenzando con el sonido de explosión:

 / * si el enemigo golpea al jugador * / if (enemigos [j] .hitTestObject (nave)) exSound.play ();

Paso 31: Destruye al enemigo

Después de reproducir el sonido, el enemigo se elimina del escenario y de la matriz, y se establece en nulo para (eventualmente) borrarlo de la memoria.

 / * Eliminar enemigo * / eliminarChild (enemigos [j]); enemigos [j] = nulo; enemigos.splice (j, 1);

Paso 32: Eliminar Live

Uno de los iconos del contador de vidas también se eliminará de la misma manera que el enemigo..

 / * Eliminar Live * / removeChild (lives [lives.length-1]); lives [lives.length-1] = null; lives.splice (lives.length-1, 1);

Paso 33: Prueba para Game Over

Luego verificamos el número de vidas, si el jugador está fuera de vida, usamos el método de alerta para mostrar una alerta que indica que el juego ha terminado, si todavía hay vidas disponibles, el barco está animado en el escenario.

 / * Si no queda vida, el juego termina * / if (lives.length == 0) alert ('Game Over', 'Click to continue');  else / * Tween Ship * / ship.y = stage.stageHeight + ship.height; TweenNano.to (nave, 2, y: (stage.stageHeight - ship.height), facilidad: Expo.easeOut); 

Paso 34: Hit Boss

El siguiente código maneja las colisiones de los jefes, usa el mismo método usado en la colisión de la nave enemiga Aquí usamos el jefe de salud Variable para determinar cuando el jefe es derrotado..

 para (var k: int = 0; k < bullets.length; k++)  /* Hit Boss */ if(boss != null && bullets[k].hitTestObject(boss))  exSound.play(); removeChild(bullets[k]); bullets[k] = null; bullets.splice(k, 1); bossHealth--; scoreTF.text = String(int(scoreTF.text) + 50);  if(bossHealth <= 0 && boss != null)  removeChild(boss); boss = null; alert('You Won', 'Click to continue'); 

Paso 35: Choque Bullet-Enemy

Otro código de detección de colisiones. Las balas en la matriz son probadas para colisionar con los enemigos; Cuando esto sucede, ambos son removidos del escenario y sus arreglos..

 / * si la bala golpea al enemigo * / if (bullets.length! = 0 && enemigos [j]! = nulo && bullets [k] .hitTestObject (enemigos [j])) exSound.play (); // Reproducir sonido removeChild (enemigos [j]); enemigos [j] = nulo; enemigos.splice (j, 1); removeChild (balas [k]); balas [k] = nulo; bullets.splice (k, 1); scoreTF.text = cadena (int (scoreTF.text) + 50); // Añadir puntuación al campo de texto en el escenario

Paso 36: Función de reinicio

El reinicio función() es llamado por el alerta() Función, maneja las operaciones necesarias para reiniciar el juego y reiniciarlo..

 reinicio privado de la función final (e: MouseEvent): void // code

Paso 37: Eliminar los Sprites

La primera parte de la reiniciar() La función maneja los sprites, las siguientes líneas de código eliminan todas las imágenes del escenario..

 / * Eliminar gráficos * / removeChild (envío); nave = nula; para (var i: int = 0; i < bullets.length; i++)  removeChild(bullets[i]); bullets[i] = null;  bullets.length = 0; for(var j:int = 0; j < enemies.length; j++)  removeChild(enemies[j]); enemies[j] = null;  enemies.length = 0; for(var k:int = 0; k < lives.length; k++)  removeChild(lives[k]); lives[k] = null;  lives.length = 0; removeChild(stars); stars = null; removeChild(starsCopy); starsCopy = null; if(boss != null)  removeChild(boss); boss = null; 

Paso 38: Eliminar alerta

La siguiente parte de reiniciar() elimina la vista de alerta de la etapa:

 / * Eliminar Alert * / removeChild (alertView); alertView = nulo;

Paso 39: Restablecer puntuación / Salud del jefe

En la siguiente parte de reiniciar(), la puntuación y las variables de salud del jefe se restablecen:

 / * Restablecer puntuación * / scoreTF.text = '0'; / * Restablecer Boss Health * / bossHealth = 50;

Paso 40: Método de reinicio de llamada

Finalmente, al final de reiniciar(), Llamamos al método que inicia todo:

 / * Reiniciar * / buildStars (200);

Paso 41: Clase de documento


Agregue el nombre de la clase a la Clase campo en el Publicar sección de la Propiedades Panel para asociar la FLA con la clase de documento principal..


Conclusión

Has aprendido a crear un juego de Space Shooter con todas sus características básicas, intenta expandirlo utilizando lo que ya sabes.!

Espero que te haya gustado este tutorial, gracias por leer.!