martes, junio 10, 2008

El juego del gato, 2 (flash game)

El primer grifo que encontré fue en la forma de un buen amigo y compañero de programación llamado Abraham, alias el Tonix.

Estaba comenzando a hacer el mapa mental de lo que necesitaba: las variables involucradas, el ciclo de control, como mover el gato, como dejar caer los objetos, los objetos de texto para el score y el cronómetro, etc.

var score:Number = 0;
var home:MovieClip = this;
home.crono_txt.text = "00:00";
home.score_txt.text = score;


En eso aparece "Ab" y me dice que él estaba programando un cronómetro para un juego. ¡Caramba, que coincidencia!

Pues rápidamente me hice de un cronómetro, que corre hacia adelante. A modificarlo para que corra hacia atrás. De paso aproveché esa rutina como columna vertebral para el juego.

Pensaba utilizar la instrucción "onEnterFrame" para realizar el ciclo de control del juego, pero Tonix usó una instrucción con la que no estaba familiarizado: setInterval. Le pedí que me dijera por qué la había usado en ves de "onEnterFrame" y me explicó que de esa manera la velocidad de ejecución no depende de los "fps" del "stage". Buen punto.

iv1 = setInterval(this._parent, 'juego', 10);


La variable "iv1" es la referencia (apuntador o "puntero") al intervalo creado, que ejecutará la rutina 'juego' cada 10 milisegundos. Este intervalo se ejecutará "eternamente" hasta que le digamos "para", por lo que es importante contar con una condición que verifique cuándo se ha agotado el tiempo de ejecución.

En este juego dicha condición es cuando el cronómetro llega a 0 (cero). Un par de variables se encargan de llevar la cuenta de los minutos y los segundos.

var n:Number = 100; // para los milisegundos
var seg:Number = 30;
var min:Number = 1;
var t:Number = 0;
var tt:Number = (min*60+seg);


El tiempo del juego, después de varias pruebas con el cliente, quedó en 1 minuto y 30 segundos.

Para arrancar el cronómetro (y el juego), hay que oprimir el "mouse" sobre la cara del gato. Este es un "Movie Clip" llamado "gato_mc". Para evitar crear mas de un intervalo (al principio eso sucedía al oprimir varias veces la cara del gato), hay que deshacerse del "onRelease".

home.gato_mc.onRelease = function() {
 iv1 = setInterval(this._parent, 'juego', 10);
 delete gato_mc.onRelease;
};


Y aquí la rutina del cronómetro, cortesía de Abraham:

function juego() {
 // muevo gato    
 home.gato_mc._x = _xmouse-home.gato_mc._width/2;

 // cronometro 
 n--;
 t--;
 if (n<0) {
  seg--;
  tt--;
  n = 100;
 }
 if (seg<10) {
  segundos = "0"+seg;
 } else {
  segundos = seg;
 }
 if (seg<0) {
  min--;
  seg = 59;
 }
 if (min<10) {
  minutos = "0"+min;
 } else {
  minutos = String(min);
 }
 if (min<=0 and seg<=0) { // esta es la condición para terminar el intervalo
  // le digo al intervalo: "¡PARA!"
  clearInterval(iv1);
 }
 // "dibujo" el cronómetro en la pantalla
 crono = minutos+":"+segundos;
 home.crono_txt.text = crono;
}




Ok, ya tengo el cronómetro que cuenta para atrás. ¿Qué sigue?

lunes, junio 09, 2008

El juego del gato, 1 (flash game)

Hace algunos días me fue solicitado crear un juego en Flash para un cliente.

Al principio, realmente no sabía como iba a resolver todos los detalles del juego. Afortunadamente la petición fue de un juego realmente sencillo y muy básico: un gato atrapa comida que cae del cielo (¿maná?) para acumular puntos, y evitar a unos perros que restan puntos, que también caen del cielo (¿guá guá?).

Al equipo de trabajo le pedí sólo el diseño gráfico del juego (la pantalla principal, un cronómetro, un "score", la cara del gato, las coquetas y bolsas de alimentos, y las caras de los perros). Lo demás corrió por mi cuenta.

Así que, frente a un "lienzo en blanco" de código... ¿ahora qué hago?

Varias opciones puedo tomar:

- Buscar un juego parecido, con el código disponible, y modificarlo (para variar el juego era para "ayer" y urge).
- Echar mano de mi biblioteca de código, amasada durante años, y re-usar código (as usual).
- Consultar algún libro/sitio de desarrollo de juegos simples y guiarme por ahí.
- Hacerlo yo solo, como "Dios" me de a entender.

La cosa urge, así que pierdo mucho tiempo en averiguar si ya existe, entenderle al código y adaptarlo. Y la re-usada no me sirve esta ves, ya que juegos casi no he desarrollado en algún otro lenguaje.

No me queda de otra: a hacerlo desde "cero".

Yo soy creyente que en este universo todo ya está hecho, nada es realmente nuevo. Vivimos en un "refrito" contínuo de energía (y sus derivados: materia, pensamientos, sentimientos, ideas, patrones, ondas, interferencias, tiempo, espacio, etc.).

Esto me da la oportunidad de conectarme a algún "grifo" de la fuente del "Todo" y de ahí "chupar" ese conocimiento para hacer lo que requiero. Lo he hecho antes. He aprendido a hacerlo cada ves mejor.

Manos a la obra.

iPhone 3G

Al fin en México.

Yo voy por uno :)