martes, 15 de junio de 2010

ActionScript 3: Clase para juego Simon

Hoy te traigo un jueguito muy simple pero que tiene algunas cosas interesante para analizar como listeners para teclado y mouse, setInterval() y otras yerbas que irán apareciendo en el script.

El jueguito cuenta con un variador de dificultad (3 niveles de velocidad) y, como buen simon va incrementando la cantidad de fichas en la secuencia mientras apretas bien los botones o se bloquea si fallas.

Ahora sí... vamos a ver el desarrollo:
1) Abrí una nueva película flash
2) Crea cuatro MovieClips llamados "b0","b1","b2","b3" y ponelos en el escenario con el nombre de instancia igual al del movieclip (en realidad lo que nos importa es el nombre de instancia, no el del MovieClip.
3) Crea un nuevo MovieClip llamado "bInicio" y poné 2 instancias en el escenario. La primera con el nombre de instancia "bInicio" y el segundo con nombre de instancia "dificultad_btn".
4) Coloca en la biblioteca cuatro archivos de sonido mp3 y desde la biblioteca vínculalos con los nombres "sSound0" , "sSound1", "sSound2" y "sSound3".
5) En la película, en el campo Clase del Documento ponle "Simon" que es el nombre de la clase que desarrollaremos a continuación.


Ahora sí. Abrimos un nuevo documento de actionscript3, lo guardamos con el nombre "Simon.as" y escribimos el siguiente código que trataré de explicar en líneas comentadas:

package{
import flash.display.*; //importo todos los displays
import flash.events.*;
import flash.filters.*;
import flash.utils.*;
import flash.text.*;
import flash.media.Sound;

//CLASE

public class Simon extends MovieClip{
   var aSecuencia:Array = new Array(); // Guardará la secuencia que deberemos seguir
   var pos:uint = 0; // Guardará el botón que debemos presionar
   var posSecuencia:uint = 0; //se utilizará cuando se muestre la secuencia que luego debemos repetir
   var intervalId:Number; //espacio de tiempo
   var intervalIdB:Number; //espacio de tiempo
   var intervalIdC:Number; //espacio de tiempo
   var intervalSec:Number; //espacio de tiempo
   var intervalSecc:Number; //espacio de tiempo
   var dificultad:uint=0; //guardará el nivel de dificultad seleccionado
   var difA:uint; //guardará el tiempo que tardará la maquina para mostrar cada botón de la secuencia
   var difB:uint; //guardará el tiempo que durará iluminado cada botón cuando se muestre la secuencia
   var vTemp:uint; //guardará el tiempo para apretar las teclas según el nivel
   var aDifA:Array = new Array(600,300,150) //valores en ms para difA
   var aDifB:Array = new Array(400,200,100) //valores en ms para difB
   var bSelect:String; //será el botón que nosotros apretemos y que se comparará con la secuencia
   var timer:Timer = new Timer (1000,3);
   var sS0:Sound = new sSound0();
   var sS1:Sound = new sSound1();
   var sS2:Sound = new sSound2();
   var sS3:Sound = new sSound3();
   var sP:uint=0;

//CONSTRUCTOR

public function Simon(){
fDificultad(); //habilito el botón para seleccionar la dificultad
fBotonInicio(); //habilito el botón para iniciar el juego
timer.addEventListener(TimerEvent.TIMER, tSegundos);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, fTimerComplete);
}

//TIMER

function tSegundos(event:TimerEvent):void{
trace ("Ha pasado un segundo");
}
function fTimerComplete(event:TimerEvent):void{
trace ("Han pasado 5 segundos");
fPerder();
}

//SELECCIONAR DIFICULTAD

function fDificultad():void{
dificultad_btn.buttonMode = true; //habilito el button mode para luego mostrar la manito
dificultad_btn.useHandCursor = true; //muestra la manito cuando estoy sobre un botón
dificultad_btn.addEventListener(MouseEvent.CLICK,fSelDificultad); //Cuando hago clic voy a seleccionar la dificultad
}
function fSelDificultad(evt:MouseEvent){ //que pasara al cambiar las opciones
if(dificultad<3){ /* si el nivel de dificultad es menos de tres */
dificultad++; /* cada vez que lo presione aumentará un nivel. */
}else{ /* Si el nivel ya estaba en 3 */
dificultad=1; /* el nivel de dif. vuelve a 1. */
}
switch (dificultad) {
case 1:
difA = aDifA[0];
difB = aDifB[0];
timer.repeatCount = 3;
dific_txt.text = "FACIL";
break;
case 2:
difA = aDifA[1];
difB = aDifB[1];
timer.repeatCount = 2;
dific_txt.text = "MEDIO";
break;
case 3:
difA = aDifA[2];
difB = aDifB[2];
timer.repeatCount = 1;
dific_txt.text = "AVANZADO";
break;
}
}

//COMENZAR LA PARTIDA

function fBotonInicio():void{
this.bInicio.buttonMode = true;
this.bInicio.useHandCursor = true;
this.bInicio.addEventListener(MouseEvent.CLICK,fInicio);
}

//PRIMER TIRO CUANDO APRETAMOS EL BOTON DE INICIO.

function fInicio(evt:MouseEvent){
if(dificultad>0){ //Si hemos seleccionado un grado de dificultad
intervalId=setInterval(fAgregar,500); //comienza a jugar agregando el primer botón a la secuencia
this.bInicio.removeEventListener(MouseEvent.CLICK,fInicio); //freno el botón de inicio
this.bInicio.buttonMode = false;
dificultad_btn.removeEventListener(MouseEvent.CLICK,fSelDificultad);
dificultad_btn.buttonMode = false;
}else{ //si no había seleccionado una dificultad
}
}

//AGREGAMOS UN VALOR A LA SECUENCIA (DESPUES DE INICIO SE HACE EN FORMA AUTOMÁTICA)

function fAgregar():void{
timer.reset();
if(intervalId){ //si hay un intervalo de tiempo
clearInterval(intervalId); //lo borro
}
nivel_txt.text = "NIVEL " + (aSecuencia.length + 1); //escribo el nivel del juego (cantidad de repeticiones)
var agregar:String = "b" + Math.floor(Math.random() * 4); //asigno un botón a la secuencia
aSecuencia.push(agregar); //lo asigno a continuación dentro del Array
fIluminar();
}

//MOSTRAR LA SECUENCIA EN LOS BOTONES

function fIluminar():void{
clearInterval(intervalSecc);
if (posSecuencia<aSecuencia.length){
root[aSecuencia[posSecuencia]].gotoAndStop(2);
this["sS" + aSecuencia[posSecuencia].substring(1)].play();
posSecuencia++;
intervalSec= setInterval(fApagar,difA);
}else{
clearInterval(intervalSec);
posSecuencia=0;
fBotonera();
fTeclado();
timer.start();
}
}

//APAGA TODAS LAS LUCES (tuve que hacerlo para llegar a apagar las luces antes de que comience la
nueva serie (cuando se repite una tecla)
function fApagar():void{
clearInterval(intervalSec); //borro el intervalo de tiempo creado (sino se repite)
for (var i:uint=0;i<4;i++){ //busco los 4 botones del juego
root["b" + i].gotoAndStop(1); //los desilumino (por si alguno estaba iluminado)
}
intervalSecc = setInterval(fIluminar,difB); //espero un tiempo proporcional a la dificultad del juego y vuelvo ailuminar
}

//LO QUE PASARÁ CUANDO APRETEMOS LOS BOTONES (CON EL MOUSE O CON EL TECLADO)

function botonAbajo():void{ //al presionar el botón
root[bSelect].gotoAndStop(2); //ilumino el boton seleccionado en el juego
this["sS" + bSelect.substring(1)].play();
timer.reset(); //freno el timer
}
function botonAfuera():void{ //al salir del botón
root[bSelect].gotoAndStop(1); //des ilumino la tecla
}
function botonArriba():void{ //al soltar el botón (mouse o teclado)
root[bSelect].gotoAndStop(1); //des-ilumino la tecla
if(bSelect == aSecuencia[pos]){ //Si el boton apretado es correcto
timer.start(); //anciendo el timer hasta el proximo boton que apriete
pos++; //cambio la posición del array que debe compararse con el prox. botón
if (pos==aSecuencia.length){//si el botón presionado es el último de la secuencia
pos=0; //ubico la posición de la secuencia a 0
intervalId= setInterval(fAgregar,1000); //espero 1" y arranco con la nueva secuencia
nivel_txt.text = "BIEN!"; //escribo la leyenda para que sepas que termino el nivel
fParar(); //deshabilito todos los botones para que no puedas apretar mientras se genera una nueva secuencia.
}
}else{ //si el botón apretado es incorrecto
fPerder(); //perdiste
}
}

//FUNCIONES PARA EL MOUSE

function fBotonera():void{
for (var i:Number = 0; i <4; i++){
this["b" + i].buttonMode = true; //los habilito como boton
this["b" + i].useHandCursor = true; //para que muestren la manito
this["b" + i].addEventListener(MouseEvent.MOUSE_DOWN,botonAb);
this["b" + i].addEventListener(MouseEvent.MOUSE_UP,botonAr);
this["b" + i].addEventListener(MouseEvent.MOUSE_OUT,botonAf);
}
}
function botonAb(evt:MouseEvent){
bSelect = evt.currentTarget.name;
botonAbajo();
}
function botonAf(evt:MouseEvent){
bSelect = evt.currentTarget.name;
botonAfuera();
}
function botonAr(evt:MouseEvent){
bSelect = evt.currentTarget.name;
botonArriba();
}

//FUNCIONES DE TECLADO

function fTeclado():void{
this.addEventListener(KeyboardEvent.KEY_DOWN, teclasAb); //cuando aprieto una tecla
this.addEventListener(KeyboardEvent.KEY_UP, teclasAr); //cuando suelto la tecla
}
function teclasAb(event:KeyboardEvent){ //cuando aprieto asigno a la tecla apretada un botón de juego y lo ilumino (7,9,1,3)
switch (event.charCode) {
case 49: // botón 1 en el teclado numérico
bSelect = "b2"; // AMARILLO en el juego
botonAbajo();//ilumino el botón elegido
break;
case 51: // botón 3 en el teclado numérico
bSelect = "b3"; //AZUL en el juego
botonAbajo(); //ilumino el botón elegido
break;
case 55: // boton 7 en el teclado numérico
bSelect = "b0"; //VERDE en el juego
botonAbajo();//ilumino el botón elegido
break;
case 57: // boton 9 en el teclado numérico
bSelect = "b1"; //ROJO en el juego
botonAbajo(); //ilumino el botón elegido
break;
}
}
function teclasAr(event:KeyboardEvent){ //Suelto las teclas
switch (event.charCode) {
case 49: // botón 1 en el teclado numérico
bSelect = "b2"; // AMARILLO en el juego
botonArriba(); //ejecuta la acción del juego (comparación con la secuencia)
break;
case 51: // botón 3 en el teclado numérico
bSelect = "b3"; // AZUL en el juego
botonArriba(); //ejecuta la acción del juego (comparación con la secuencia)
break;
case 55: // botón 7 en el teclado numérico
bSelect = "b0"; // VERDE en el juego
botonArriba(); //ejecuta la acción del juego (comparación con la secuencia)
break;
case 57: // botón 9 en el teclado numérico
bSelect = "b1"; // ROJO en el juego
botonArriba(); //ejecuta la acción del juego (comparación con la secuencia)
break;
}
}

//PERDIMOS

function fPerder():void{
nivel_txt.text = "PERDISTE"; //muestro leyenda en el texto
aSecuencia.length=0; //borro la secuencia de botones
pos=0; //borro la posición de la secuencia
bSelect=""; //borro cualquier botón que haya quedado guardado
fParar(); //detengo todos los botones de juego
fDificultad(); //habilito el botón para seleccionar dificultad
fBotonInicio(); //habilito el botón inicio
timer.reset(); //reseteo el temporizador
for (var i:Number = 0; i <4; i++){ //busco los 4 botones
this["b" + i].gotoAndStop(2); //los ilumino todos a la vez
}
intervalIdB = setInterval(fPerderAP,1500) //mando a apagar las luces dentro de 2"
}

//SOLO SIRVE PARA APAGAR LAS LUCES QUE SE PRENDEN CUANDO PERDISTE

function fPerderAP():void{
clearInterval(intervalIdB);
for (var i:Number = 0; i <4; i++){ //busca los 4 botones
this["b" + i].gotoAndStop(1); //y los apaga
}
}

//DETIENE LOS BOTONES ENTRE NIVELES Y CUANDO PIERDES

function fParar():void{
for (var i:Number = 0; i <4; i++){ //busco todos los botones del juego
this["b" + i].buttonMode = false; //Deshabilito modo botón (para quitar la manito)
this["b" + i].removeEventListener(MouseEvent.MOUSE_DOWN,botonAb); /* deshabilito */
this["b" + i].removeEventListener(MouseEvent.MOUSE_UP,botonAr); /* eventos de */
this["b" + i].removeEventListener(MouseEvent.MOUSE_OUT,botonAf); /* mouse */
}
this.removeEventListener(KeyboardEvent.KEY_DOWN, teclasAb); /* deshabilito los */
this.removeEventListener(KeyboardEvent.KEY_UP, teclasAr); /* eventos de teclado */
timer.reset();
}
}
}


De todos modos te dejo un link de descarga con el código fuente (el archivo.as , el archivo .fla y un swf funcionando)

DESCARGAR EL .FLA

-------------------------------
NOTA: Si este artículo te sirvió por favor revisá la lista de enlaces patrocinados, segúro encontrarás algo de mucho interes allí. Y de paso me ayudas a mantener El PezOjo! en línea.

No hay comentarios:

El portal que comparte sus ingresos