Tutorial de Ping Pong con AS3 - Parte 1

domingo, enero 30, 2011
En este tutorial vamos a crear un juego sencillo de ping pong, con una mecánica similar al clásico juego que se puede ver en la imagen, pero un poco más llamativo y menos prehistórico.

Lo primero que debemos hacer es abrir el Adobe Flash, en mi caso tengo el CS4, y crear nuevo Archivo de Flash (AS 3.0). En el panel de propiedades cambiar el tamaño del lienzo a 450 x 300 px, que es el tamaño con el que vamos a trabajar el juego.


Luego vamos a agregar una imagen para que sea el fondo del juego, asegurense que cubra todo el lienzo, no importa si se pasa.


Ahora hay que dibujar un rectángulo que va a ser la barra que moverá el jugador para evitar que la pelota pase su lado (basta con dibujar uno ya que la otra barra será igual). Podemos crear otra capa en la parte inferior haciendo click en el pequeño ícono de hoja doblada; hay que poner la capa encima de la que contiene la imagen de fondo para evitar dibujar detrás de la imagen. Luego de dibujar la digura presionamos F8 para "convertir en símbolo", le ponemos por nombre "Player", tipo "Clip de película" y presionamos Aceptar; con eso ya tenemos la primera barra lista.

Para crear la segunda barra hay ir a la "Biblioteca" y arrastrar el símbolo "Player" al escenario, ubicándolo a la derecha.
Lo siguiente es crear la Document Class, que es la clase en actionscript principal. Para esto ir a "Archivo", "Nuevo Documento", "Archivo ActionScript". En el nuevo archivo escribimos el siguiente código, con lo que estamos creando una clase a la que llamaremos "Engine".
package
{
import flash.display.MovieClip;

public class Engine extends MovieClip {
public function Engine() : void
{

}
}
}
Para agregarla como clase principal hay que escribir "Engine" en la parte "Clase" del panel "Propiedades".

Ahora vamos a crear una clase a la que llamaremos "Player". Repetimos el proceso anterior pero esta vez ingresamos el siguiente código.
package
{
import flash.display.MovieClip;

public class Player extends MovieClip {
//con esta variable indicamos cuántos
//pixeles debe moverse la barra
//a mayor número mayor velocidad
var velocidad:Number=2;

public function Player() : void
{
}

public function sube():void{
//reducir el valor de "y" para subir
//validación para no subir más que
//el inicio de la pantalla
if(y-velocidad<0){
y=0;
}else{
y=y-velocidad;
}
}

public function baja():void{
//aumentar el valor de "y" para bajar
//validación para no bajar más que
//el final de la pantalla
if(y+velocidad>300-height){
y=300-height;
}else{
y=y+velocidad;
}
}
}
}
Hecho esto hay que asignar esta clase al símbolo Player. En la "Biblioteca" hacemos click derecho en Player, propiedades y donde dice "Clase" escribimos Player. De esta manera el símbolo y la clase en actionscript está relacionados.

Vamos a agregar un método llamado onLoop a la clase Engine y haremos que se ejecute en cada evento Enter_Frame, es decir, en cada fotograma de la película flash. El número de fotogramas por segundo se puede modificar en el panel "Propiedades".
package
{
import flash.display.MovieClip;
import flash.events.Event;

public class Engine extends MovieClip
{
public function Engine() : void
{
addEventListener(Event.ENTER_FRAME,onLoop);
}
function onLoop(e:Event){
trace("Hola");
}
}
}
Hay que asignar un nombre a la instancia de la clase Player que tenemos en el escenario (el que dibujamos al inicio). Elegimos el símbolo y en el panel de "Propiedades" escribimos en el campo de texto superior "player1", con minúsculas para identificar que es un objeto. Hacemos lo mismo para la otra barra, pero en este caso le ponemos "player2".


Ahora vamos a dar un poco de movimiento a la barra. Para identificar las pulsaciones de teclado es mejor usar una clase de utilidad llamada KeyObject de Senocular la cual es más exacta que usar el evento normal que trae AS3 (El código de esta clase está incluido en el .rar al final del post).

Modificaremos el método onLoop de Engine para que si el jugador presiona "w" la barra suba, invocando a su método sube, y si presiona "s" la barra baje llamando al método baja. Para la barra derecha usaremos las flechar direccionales.
Para probar el movimiento de la barra les recomiendo minimizar el CS4 y ejecutar el .swf que se ha generado porque al pulsar "w" o "s" el programa puede confundirlo con atajos de teclado.
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.ui.Keyboard;

public class Engine extends MovieClip
{
private var key:KeyObject;

public function Engine() : void
{
//Se crea el objeto KeyObject
key = new KeyObject(stage);
//Seteamos la velocidad de player1 y 2
player1.velocidad=8;
player2.velocidad=8;
//Se asigna el método onLoop al evento Enter_Frame
addEventListener(Event.ENTER_FRAME,onLoop);
}
function onLoop(e:Event){
//W=87
if(key.isDown(87)){
player1.sube();
}
//S=83
if(key.isDown(83)){
player1.baja();
}

if(key.isDown(Keyboard.UP)){
player2.sube();
}
if(key.isDown(Keyboard.DOWN)){
player2.baja();
}
}
}
}
El resultado sería algo así:



Esto es todo para la primera parte de este tutorial, espero les haya servido y haya sido claro. Puede descargar AQUI el código fuente.

Taxista canta igual que Michael Jackson

domingo, enero 30, 2011
Este muchacho de Brasil tiene la misma voz (o al menos muy parecida) que Michael Jackson y lo demuestra mientras maneja su taxi. Deberían mandar un equipo periodístico a entrevistarlo para los reportajes de TV de los domingos ya que siempre dan prioridad este tipo de notas.

Isla Presidencial

sábado, enero 29, 2011
Isla Presidencial es una parodia hecha en Venezuela que tiene como personajes principales a los mandatarios (algunos ya ex-mandatarios) latinoamericanos + el rey de España y ocasionales apariciones de Barack Obama. Los presidentes quedan perdidos (LOST) en una isla luego de atender a una cumbre y tendrán que buscar la manera de sobrevivir, pero no hay qué temer, sus respectivos países iniciarán una búsqueda apenas se den cuenta que los necesitan (OPSSS!). Creo que mis partes favoritas son los diálogos entre el narcisista-leninista presidente Chávez y su incondicional Evito quien lo apoya en cada plan que toma, aunque normalmente no lo deje opinar. También hay breves apariciones del presidente García. Aquí les dejo los primeros 3 episodios de la isla presidencial.




Primeros pasos en Juegos en Flash

viernes, enero 28, 2011
Los videojuegos son algo común en nuestra vida, ya sea que uno juegue en minijuegos.com, winning eleven, Dungeons & Dragons Online, Dota, buscaminas o counter. Algo que me parece interesante es intentar hacer juegos, para lo cual no se necesita más que alguna idea, conocer un poco de programación y comenzar a probar a ver qué sale; soy de la idea que un juego no necesita ser una maravilla en gráficos o tener 100 maneras de volarle la cabeza al enemigo, lo principal es que la mecánica del juego sea atractiva y retadora para el jugador (si es adictivo mucho mejor); por ejemplo estos dos juegos: Helicopter Game y Bloons, una idea sencilla + gráficos sencillos pero bonitos = WIN.

Para hacer juegos se puede usar prácticamente cualquier lenguaje de programación (si puedes ingresar datos, procesarlos y mostrar un resultado ya puedes hacer un juego, por ejemplo "guess the number"). Ahora, hay lenguajes que se prestan para hacer juegos, mi favorito es ActionScript que es el que se usa para hacer juegos en Flash aunque también se pueden hacer juegos muy interesantes en Java como el buscaminas que hizo Ali y luego migró a javascript, el gunbound que hizo Clayder o un juego de gohan destruyendo autos también de Clayder.
Flash es una plataforma muy utilizada para hacer juegos y publicarlos en la web, probablemente la mayoría de juegos en Internet estén en Flash, por lo que es una buena opción si uno desea hacer juegos. Personalmente he probado hacer algunos juegos sencillos con Flash y en este post quisiera escribir sobre algunas cosas que he aprendido y algunos conceptos básicos para empezar a hacer juegos en Flash.

Para empezar tenemos el ActionScript, el lenguaje de programación usado para Flash. Actualmente se trabaja con la versión 3.0, la cual presenta ciertas ventajas y cambios en comparación con la versión 2.0 como un enfoque más orientado a objetos (lo que lo hace bastante fácil para alguien con conocimientos en POO), la forma de manejar eventos, manejo de expresiones regulares, mejoras para tareas como pintar figuras mediante código, etc; podemos decir que programar en AS3 es más ordenado y permite tener más control. Encontré una comparación muy interesante que queda mejor sin traducir:
  • as3.0 is a Japanese Chef’s knife. Finely crafted but requires care and technique in its use.
  • as2.0 is a Machete. Great for hacking things, but useless for anything requiring fine detail or control.
  • as1.0 is a plastic spoon.
Aquí hay unas líneas en as3 en las que se puede ver un poco su sintaxis:

package {
public class Clase1{

//definición de una variable privada numérica
private var n:Number=3;

//Constructor
public function Clase1() {
//trace permite imprimir en consola
trace("Hola mundo");
}

//Un método
public function saluda():void{
//Instanciación de un arreglo
var ar:Array=new Array();
ar.push("Uno");
ar.push("Dos");
ar.push("Tres");

}

}
}

Como se puede ver no es muy diferente a java, c++ o .net.

Cuando se trabaja en flash (refiriéndonos al programa de Adobe) tenemos por un lado la parte gráfica, que es la zona en la que uno agrega sus dibujos y hace interpolaciones trabajando con fotogramas y por otro lado tenemos la parte de código, a la que podemos acceder pulsando F9; esta es una característica muy importante ya que podemos por un lado dibujar una pelota y por el otro realizar la programación para que la pelota baje por la pantalla y luego rebote simulando gravedad. No sólo eso, además podemos tener aparte de nuestro archivo .fla (formato de Flash) varios archivos .as siendo cada archivo una clase en actionscript, de manera que tenemos clases reutilizables o podemos utilizar algún framework con código que otras personas ya hicieron. Podemos ligar símbolos en Flash con una clase específica en AS3 de manera que cuando jalamos un símbolo al escenario se esté ejecutando el constructor de la clase en AS3 automáticamente, adquiriendo el símbolo todas las propiedades y comportamientos definidos en la clase, o incluso podemos aplicar herencia en los símbolos.

A los proyectos en Flash se les puede agregar una clase en actionscript principal, que viene a ser la clase del escenario y que se instancia al iniciar la película, a esta se le denomina Document Class y se le puede poner el nombre que uno quiera, yo suelo llamarla Engine.as

Dos conceptos muy importantes para conocer son el MovieClip y el Sprite. Los dos son una especie de contenedores o lienzos sobre los que se puede trabajar. Imaginemos que tenemos un tablero en blanco, que es el escenario de Flash y un conjunto de papelitos sueltos, en papelito dibujamos un árbol y lo ponemos en el escenario, en otro papelito más grande pintamos un grass y lo ponemos en la parte inferior del escenario y luego cogemos un conjunto de papelitos unidos (como los post it o las hojas de un cuaderno pequeño), en cada hoja dibujamos una persona (tipo stick figure) con algunas diferencias como en la posición de las manos o pies, de manera que al pasarlos rápidamente da la impresión de movimiento, bueno, cogemos ese cuadernillo o lo que sea y lo agregamos también a nuestro pintoresco escenario. Los Sprites son como los papelitos simples donde dibujamos el árbol y el grass, es un sólo lienzo en el que uno puede dibujar, insertar imágenes, videos, incluso otros Sprites o MovieClips. Los Movieclips son similares a los Sprites sólo que tienen línea de tiempo o mejor dicho son como un conjunto de sprites en secuencia, como los frames de una película, uno puede agregarles un cuadrado en un fotograma y moverlo un poco a la derecha en cada fotograma subsiguiente para dar la impresión de movimiento continuo, al igual que los Sprites permite que se le agreguen a su vez más MovieClips o Sprites.

Los eventos son otra cosa a tomar en cuenta al programar un juego, por ejemplo hay eventos para detectar que el usuario ha hecho click en un símbolo, se ha entrado en un frame (viene a ser cada refrescada de pantalla, lo cual se puede configurar, por ejemplo se puede trabajar a 20 fotogramas por segundo o a 32fps si se busca mayor suavidad en la animación). Hay eventos para cuando el jugador presiona una tecla, cuando se terminó de cargar un archivo, cuando terminó un sonido, etc. Para usar estos eventos se necesita agregar un listener que escuche a determinado evento y una función que sea invocada cuando se detecta el evento. Por ejemplo, este código mueve un cuadrado a la derecha cada vez que el usuario hace click en el:

//la clase cuadrado está ligada a un símbolo con un ... cuadrado
var cuad:Cuadrado=new Cuadrado();
//agregamos el cuadrado al escenario
addChild(cuad);
//agregamos el listener para escuchar cuando se le hace click
addEventListener(MouseEvent.Click, miFuncion);
//función que se va a invocar cuando se detecte el click
function miFuncion(e:Event){
//movemos el cuadrado a la derecha
cuad.x=cuad.x+10;
}


Para detectar colisiones as3 brinda el método hitTestObject, con el cual podemos ver si dos Sprites/Movieclips colisionan o el método hitTestPoint para ver si un Sprite/Movieclip colisiona con un punto específico. Por ejemplo:

var hayColision:Boolean=persona.hitTestObject(bala);
if (hayColision){
trace("Recibiste una bala");
}else{
trace("No moriste");
}

Ahora la parte interesante, vamos a pensar (no programar porque este post ya de por sí está largo) cómo juntamos lo anterior para hacer un juego de pingpong:
  1. Crear 1 sprite con un círculo que será la pelota
  2. Crear 2 sprites con forma rectangular para las barras-raquetas que usará cada jugador
  3. Crear 1 sprite para el fondo, ya sea de un color o agregando una imagen
  4. Agregar las 2 barras, una a la izquierda y la otra a la derecha
  5. Agregar los listeners para que cuando el jugador presione en el teclado "W" la barra de la izquierda suba y cuando presione "S" la barra baje, algo similar para la otra barra
  6. Agregar la pelota al escenario, creándole una clase con 2 variables, la velocidad y la dirección
  7. Agregar el evento para que en cada refresco de pantalla (evento llamado EnterFrame) la pelota avance de acuerdo a su velocidad y dirección (hay que aplicar un poquito de trigonometría)
  8. Agregar el evento para que en cada refresco de pantalla se pruebe si la pelota colisiona con alguna de las barras, si colisiona con la de la izquierda se cambia su dirección a la derecha y viceversa. Se puede juntar este punto con el anterior formando una sola función que hace varias cosas. Asimismo verificar si la pelota está a la izquierda de la barra de la izquierda, lo que quiere decir que el jugador de la derecha hizo un punto, igualmente para el otro lado.
  9. Llevar 2 contadores para ver quién es el primero en llegar a 10.
  10. Cuando alguien llegue a 10 agregar un Sprite con un bonito mensaje de Ganaste.
Eso sería todo con este post que espero no haya sido muy desordenado y haya cumplido con lo que quería que es dar algunas ideas de cómo usar flash para crear juegos. Aquí les dejo un juego que hice y espero que les guste, se llama pixerpiente y consiste en mover el mouse evitando obstáculos que van apareciendo y no dejar que el rastro que vas dejando te alcance ya que empieza a consumirse.