domingo, 25 de septiembre de 2011

Pong en AS3 (Introducción)

Tomando como ejemplo otras series de tutoriales, he escogido para el primer ejercicio uno de los grandes juegos clásicos. A lo largo de una pequeña serie de tutoriales, intentaré programar desde 0 un clon de Pong. Aquí hay un vídeo del original, por si alguien vive en una isla sin contacto con el resto del mundo y no sabe a qué juego me refiero (No sé qué hace una persona así leyendo esta página, pero no soy nadie para criticar)



En la línea propuesta por este blog, voy a asumir que el lector tiene nulo conocimiento de AS3 y de programación en general, dándose el caso de que el propio autor tampoco sabe bien cómo dirigirse.
Así que, lo que voy a hacer en este post es analizar en qué consiste el juego que buscamos emular y, ante cualquier complejidad excesiva que nos surja en uno de los pasos, intentar en la medida de lo posible postponer la dificultad.
Pong es, simplificando, un juego en el que dos rectángulos blancos hacen las veces de raquetas de tennis, haciendo rebotar un cuadrado que hace de pelota entre ellos. Si dicho cuadrado sale de los margenes dentro de los cuales los rectángulos-raquetas maniobran, dependiendo de hacia qué lado vaya, la puntuación de uno de los bandos se incrementa. Gana quien más puntuación obtenga.
Dada la sencillez del ejemplo escogido, planteamos dos maneras de conseguir nuestro objetivo:
- La primera de ellas, más visual e intuitiva, requiere menos código y el que usemos estará orientado a las instancias (Singularizaciones de objetos, lo explico más abajo) que ya hemos creado.
- La segunda es la que se recomienda. No sólo utilizaríamos el código para establecer la dinámica del juego, sino también para "colocar las piezas en el tablero" Dicho de otro modo, vamos a generar dinámicamente el juego, esto se entenderá mejor con los ejemplos.
Antes de entrar en harina, conviene empezar distinguiendo entre dos conceptos que vamos a usar muy a menudo: Instancia y objeto.
El ejemplo típico que se suele poner para distinguir instancias de objetos suele ser el de un coche, sirve muy bien porque luego se puede extender la metáfora para que cubra otros conceptos interesantes de la programación, como los métodos. Pero quiero ir paso a paso, y por eso voy a escoger otro ejemplo que creo que puede ser incluso más fácil:
Todos tenemos en nuestras casas más de un tipo de silla. Las hay que se diferencian por el color, por el material, por la forma. Miles de millones de sillas, cada silla distinta y, sin embargo, cuando las vemos a todas las identificamos como sillas. Pasa igual con los perros. Un Rottweiler no es lo mismo que un Chihuahua, un Podenco tampoco es un Pastor Alemán. Pero somos capaces de verlos a todos y entender que, más allá de sus diferencias, pertenecen a la misma especie.
¿Por qué?
Pues porque, a pesar de muchas diferencias "superficiales", podemos ver que tienen rasgos comunes, que típicamente ladran, que, salvo accidente, son cuadrúpedos, que sudan por la lengua, que tienen rabo... Son diferentes en muchas cosas, y parecidos en muchas otras. Así que podríamos hacer una larga lista de rasgos que definen a un perro y que contrastan con otras especies animales. Imaginémosnos al perro perfecto:
- Tienen rabo
- Ladran.
- Sudan por la lengua.
- Cuatro patas.
- Domesticables.
- ...

Y ahora expongamos algunos de sus rasgos "variables":
- Pueden tener el pelo de varios colores.
- Pueden ser de distintos tamaños.
- Pueden ser más rápidos, más fuertes, más fieles... unos que otros.

El objeto "perro" se compone de unos rasgos mínimos definitorios, que comparten con todos los de su especie. Vamos a decir que es como una especie de "prototipo de perro" o "perro ideal" o "perro modelo". Luego están las "realizaciones" de ese perro ideal, con todas las variaciones posibles dentro de los límites que el ser un perro impone. Digamos que la instancia "perro" puede ser canela, puede tener las orejas gachas o de punta, pero no pueden hablar castellano, porque va contra la definición del objeto perro.
Pueden existir instancias que no sean más que las representaciones del objeto, sin añadir ningún matiz nuevo, si, por contra, le dotamos al perro que creemos como instancia de "nuevas características", serán propias únicamente de esa instancia y no afectarán al resto de instancias que se hayan creado a partir del objeto. Dicho de otra manera, que tu perro sea marrón no hace que el resto de perros se vuelvan marrones.
Si fuéramos Dioses y tuviéramos la posibilidad de cambiar el código por el que el mundo funciona, si encontrásemos dónde viene definido lo que es un perro (El objeto perro) y estableciéramos que siempre tiene que ser marrón, eso haría que todos los perros se volvieran marrones.
En programación hay variables de objeto y variables de instancia. Jerárquicamente, las más "fuertes" son las de objeto, pero nos va a resultar muy interesante saber modificar las variables de instancia, porque ello nos permitirá crear rasgos individuales para los elementos de nuestro juego.
Estoy tentado ahora de continuar y seguir explicando lo que es una clase, el tema de la herencia, no resultaría difícil, pero es que no hace falta, por ahora.

En la introducción me faltaron muchas cosas por decir, pero hay dos importantes: La primera es que mi ordenador es un PC, no un Mac. Importa relativamente poco, porque ambos son capaces de las mismas cosas, pero los atajos de teclas cambian. Como no soy usuario de Mac, no puedo destacar las diferencias, más adelante si quisiera poder hacer una pequeña reseña que fuese útil y esquemática al respecto.
Segundo, utilizo Adobe Flash CS5 y exclusivamente Action Script 3.0. Por varias razones, la primera porque es en el que mejor me muevo, segundo porque soy un fan rendido de los productos de Adobe y tercera porque no le veo sentido a hacer tutoriales de Action Script 2 cuando los que saben de estas cosas coinciden en que el 3 fue un gran paso adelante. No he probado el Macromedia Flash, así que tampoco voy a decir que uno sea mejor que el otro. Las capturas de pantalla que voy a colgar, no obstante, pertenecen al programa de Adobe.

En el próximo tutorial ya sí "abro el programa" y muestor los espectaculares gráficos que va a tener el juego. También discuto sobre el "input" de los usuarios a grandes rasgos, sobre la detección de teclas, los beneficios de usar una clase aparte y pongo ejemplos de código que es lo que interesa.

martes, 20 de septiembre de 2011

Fuente, filosofía y objeto

Voy a ser absolutamente inmodesto para empezar, aunque empiezo con pocas ambiciones: Éste es el blog que he echado de menos en este último par de semanas.

Todo empieza con un sueño absurdo: Me levanto de la cama, tan poco talentoso como siempre y, arrastrado a la consciencia por la alarma del Iphone (TM) decido que quiero buscar fuentes de financiación alternativas. Que mi sueldo no me basta, que mi trabajo es una losa, que mi jefa parece un travesti y que tengo ganas de coger a mi novia y pirarme, perderme en el horizonte, surfeando en ríos de oro.

Así que acudo a la fuente de todos mis conocimientos valiosos: Internet, y empiezo a buscar alternativas que comiencen siendo complementos, experimentos para buscarme la vida por otros cauces, ahora que lo de opositar está imposible. Y no encuentro nada que me convenza lo más mínimo.

Pero tampoco me niego a probar lo poco que se ofrece, y en este sentido creo el blog. Quiero ofrecer algo a cambio de lo que voy a formarme, para un trabajo mejor o por el deleite de saber cosas. Y tengo una idea, y luego otra, y encuentro que hay algo que puedo ofrecer que mucha gente comparte pero que, a veces, es difícil encontrar llanamente expresado: Soy un ignorante.

De infinidad de cosas, no sé nada. Y una de las cosas que no sé hacer y siempre he querido, es programar un juego.

Uno que lleve mi nombre en los títulos, y sea infinitamente pirateado, porque ésa sería la señal de que he hecho un buen trabajo.
De todos los lenguajes en los que he picoteado, el Action Script 3 me parece el más asequible. No voy a decir que lo entiendo del todo... pero a la quinta explicación algo se me queda y éste es el arco que atraviesa la frase con la que empiezo este primer post con el reconocimiento de mi ignorancia: Conforme vaya avanzando en el proyecto que tengo en mente, iré posteando los tutoriales, las referencias, los saludos y las fuentes que me llevaron a hacer las cosas de una manera y no de otra totalmente distinta:

Voy a enseñar desde la más valiosa perspectiva: la de aquel que entra sin prejuicios, con la mente limpia, a embarcarse en un proyecto cuyo desconocimiento le impide calcular los límites de lo que necesita saber.

Este blog puede ser útil para tres tipos de personas:
- Para aquellos que quieran escribir, desde el conocimiento, auténticos tutoriales. Voy a contar las partes que me resultan difíciles de entender. Voy a cuestionarme el porqué y el para qué y voy, por descontado, a equivocarme.
- Para los que no tengan ni idea de AS3. O sea, los que estén en mi misma situación. Mi ritmo va a ser lento y, si llegáis algunos a disfrutar con mis torpes esbozos, os invito a que participéis y seáis todo lo críticos que queráis.
- A mí: Para mí va a ser como tomar apuntes, y al escribir afianzaré lo que sé y lo que no sé. El objetivo es acabar siendo capaz de hacer el juego que tengo en la cabeza, pero ya entro con dudas. Ni siquiera sé si estoy eligiendo bien el lenguaje de programación.

¿No es maravilloso?

No, aún no lo es. El caminar se demuestra andando. Mi próximo post entrará en harina y espero que quien lo lea lo encuentre mínimamente útil.