Sé que leés "game engine" y capaz decís "nooo!! la locura!! Voy a hacer mi prorio Unreal 3 Engine!!".... bueno... no tan así... pero sí vamos a armar algo que tiene las mismas bases, aquellas que son necesarias a la hora de armar juegos.
GameEngine
Vamos a crear nuestra clase GameEngine. Abrimos nuestro FlashDevelop anterior. En él tenemos la estructura de carpetas y la Document Class llamada Game.
Creamos , dentro de src, una carpeta nueva y la llamamos TutorialGame. Este será el package que incluirá todas las clases que serán necesarias que la document class utilice.
En esta nueva carpeta, creamos una nueva clase que llamaremos GameEngine. Hacemos click derecho: add->Class y configuramos así y aceptamos:

Esta clase que acabamos de crear será la encargada de manejar todo el gameplay de nuestro juego. ¡Es nuestro engine!
Bien,a esta clase llamada GameEngine, la crearemos utilizando el Patrón de Diseño Singleton. Acá de decís.. ¿Pero qué caraj..!!??
Por si no lo notaste, te pasé un link para que te instruyas.. fuckin googlea baby!
En pocas palabras, el Patrón Singleton nos permite que la clase en cuestión que lo utilice, solo pueda ser instanciada una sola vez. La única instancia que creemos se guarda en una variable de clase (una de esas que empiezan con static...). De esta manera, tendremos una sola instancia a la que accederemos como variable de clase. Es algo así como una vieja variable global pero más pro.
Hagámos código!
Abrimos nuestro GameEngine.as y le ponemos el siguiente código:
package TutorialGame
{ /**
* ...
* @author Abstract Man
*/
public class GameEngine
{
private static var _instance:GameEngine= null;
public function GameEngine(enforcer:SingletonEnforcer)
{ }
public static function get instance():GameEngine{
if (GameEngine._instance == null) {
trace("Engine Creado");
GameEngine._instance = new GameEngine(new SingletonEnforcer());
}
return GameEngine._instance;
}
}
}
class SingletonEnforcer {};
Bien, me basé para dar este ejemplo en este tutorial. Podés hacerlo a tu manera, lo importante es que mantenga el patrón.
Como podés ver, si se desea crear una intancia de GameEngine desde cualquier lado, nos será imposible ya que necesitamos pasarle como parametro un SingletonEnforcer y esta clase no podrá ser instanciada desde ningún lado que no sea este paquete. En pocas palabras, no podrás instanciar GameEngine desde ningún lado. Pero sí podés acceder a su única instancia, a través del método instance, que es un getter.
Bien, ahora, en nuestro Game.as, arrancaremos el engine. En primer lugar, debemos importar la clase GameEngine. Así que, donde están todos los imports, agregamos las siguiente linea:
import TutorialGame.GameEngine;
Luego, en nuestro método inicializador, agregamos la siguiente linea:
var engine:GameEngine=GameEngine.instance;
Como ven, no hace falta que guardemos el engine en una variable miembro, de hecho, ni siquiera necesitamos guardarlo en una variable, ya que el engine en sí mismo está almacenado dentro de la clase GameEngine. Pero bueno, lo escribimos así para que quede lindo.
Como por primera vez se está llamando al getter de la instancia de GameEngine, este será creado.
Si compilamos el proyecto y lo corremos, veremos que en la pestaña de outputs no sale el mensajito de
Engine Creado
¡Estamos en buena camino!
En el próximo tutorial le daremos funcionalidad a nuestro engine, introduciendo un concepto importantísimo: el gameloop.
2 comentarios:
para cuando el procciomo tutorial gracias
mmm.... lo tengo re abandonado el blog, ni me loguee.. jaja
Estoy viendo si lo armo de cero desde wordpress, si hay quorum, sale
Publicar un comentario