Foros - Stratos

Stratos => Tema de la semana => Mensaje iniciado por: mi-go en 09 de Diciembre de 2008, 03:39:37 PM

Título: Subtema: Juegos Flash (3ªParte) Programación: Tweens, Sonido, Colisiones
Publicado por: mi-go en 09 de Diciembre de 2008, 03:39:37 PM
Parte 1 => Programación: Introducción (http://www.stratos-ad.com/forums/index.php?topic=11681.0)
Parte 2 => Programación: Estructura, POO, Timers (http://www.stratos-ad.com/forums/index.php?topic=11682.0)
Parte 3 => Programación: Tweens, Sonido, Colisiones (http://www.stratos-ad.com/forums/index.php?topic=11691.0)
Parte 4 => Mercado: Métodos para ganar dinero (http://www.stratos-ad.com/forums/index.php?topic=11708.0)


4. Uso de Tweens para animaciones sencillas

4.1 Tofus en movimiento con Tweens

El movimiento automático de los tofus en el juego es sencillo: se desplazan de izquierda a derecha, subiendo un poco, como si flotaran, y cuando son destruidos descienden.

En Tofu Hunter para controlar este movimiento incluyeron un Listener al MovieClip del tofu en su evento ENTER_FRAME.
La función que ejecuta el Listener cada vez que es llamada se encarga de incrementar la coordenada X y disminuir la coordenada Y del tofu.
Esto hubiera sido una buena práctica si se hubiera llamado a la función con un Timer y no con el evento ENTER_FRAME como ya expliqué en apartado 2. Timers para controlar el juego.
Además tampoco tiene sentido estar incrementando los valores X e Y del MovieClip en un movimiento tan sencillo como es un desplazamiento lateral y vertical que no varía su trayectoria porque el juego no tiene elementos que así lo hagan cuando existe la clase Tweens.

Para movimientos sencillos en AS3 tenemos la clase Tween, que se encarga automáticamente de variar una propiedad de un objeto de forma progresiva según le digamos. Así, por ejemplo, podemos variar progresivamente las coordenadas de un objeto.


En Tofu Hunter 2, para el desplazamiento lateral añadiremos el siguiente Tween una vez es creado el tofu:
this.oTweenLateral = new Tween(this, "x", Regular.easeIn, this.x, this.mcJuego.originalWidth + 100, nRandom, true);

Para eliminar el tofu cuando haya salido del juego por la derecha añadiremos un Listener al Tween que se ejecute cuando termine la animación y que se encargue de eliminar el tofu del juego:
this.oTweenLateral.addEventListener(TweenEvent.MOTION_FINISH, TweenLateralHandler);

Para hacer que también vaya subiendo poco para que parezca que flotan, como en Tofu Hunter, incluiremos otro Tween:
this.oTweenVertical = new Tween(this, "y", Regular.easeIn, this.y, this.y - 50, nRandom, true);

Con el movimiento de caer y girar un poco cuando es destruido haremos algo muy parecido:
this.oTweenVertical = new Tween(this, "y", Strong.easeIn, this.y, this.mcJuego.originalHeight + 100, 1, true);

//Para eleminarlo cuando termine
this.oTweenVertical.addEventListener(TweenEvent.MOTION_FINISH, TweenVerticalHandler);

//Lo hacemos girar un poco cuando es destruido, como Tofu Hunter 1
this.oTweenLateral = new Tween(this, "rotation", Regular.easeIn, this.rotation, this.rotation + 100, 1, true);





4.2 Clases Tweens que no son de Adobe

En TofuHunter2 hemos usado la clase Tween de Adobe por ser fácil de usar y por no tener que incluir el uso de otra clase externa, pero la clase Tween de Adobe no funciona correctamente y es muy aconsejable usar otras clases externas Tween que no son de Adobe.

La clase Tween de Adobe tiene dos problemas muy importantes:


Las clases Tween más usadas que no son de Adobe son:

Ventajas de usar cualquiera de estas clases:





5. El sonido de un Tofu

En Tofu Hunter 2 incluiremos en la función tofuClickHandler un par de líneas para que cada vez que destruimos un tofu se reproduzca un sonido que previamente hemos agregado a la biblioteca del proyecto:

var sndExplosion:Explosion = new Explosion();
var channel:SoundChannel = sndExplosion.play();






6. Colisiones de una estrella

Tofu Hunter 2 tiene un nuevo elemento en el juego: una estrella que si toca alguno de los Tofus los elimina del juego.

Cada instancia de la clase Tofu tendrá un Timer que comprobará constantemente si está colisionando con la estrella.
En la función IniciaTofu:
this.oTimerColision = new Timer(10);
this.oTimerColision.addEventListener("timer", TimerColisionHandler);
this.oTimerColision.start();

Y para comprobar si colisiona crearemos la siguiente función que es llamada por el Timer:
   private function TimerColisionHandler(event:Event){
      if (this.hitTestObject(this.mcJuego.oEstrella))
      {
         this.Eliminar();
      }
   }


En ActionScript existen dos tipos de detección de colisiones: