viernes, 22 de junio de 2012

Diseñando niveles para tus juegos libgdx : TiledMaps


A la hora de hacer un juego, siempre es importante el diseño de tus niveles y hacerlo todo en código es bastante difícil, actualmente hay muchas técnicas que ayudan a diseñar niveles como: el pixeliado que es una de las más viejas y solo trata de una imagen con puntos indicando el nivel, como la imagen de abajo en donde los puntos rojos representan los obstáculos o enemigos y el verde el inicio del jugador.

También existen otras como tiledMaps y los archivos svg que son para definir gráficos vectoriales, en esta ocasión explicare los tiled maps en otro momento le tocara el turno a los archivos svg que son muy buenos a la hora de usarlos en conjunto con boxd2, un editor de archivos svg Inkscape.

Un editor para archivos tilde es TiledQt 0.8.1 for Windows , como libgdx soporta estos tipos de archivos es muy fácil usarlos.

primero que nada tenemos que crear texturas o objetos como plantas para pintarlas con el programa tiled Qt, estas texturas las cree en un editor de imágenes común con un tamaño de 32x32 puede ser desde photoshop a paint para luego empaquetarlas con TexturePacker como en la imagen:  



En el input va la carpeta donde se tiene todas las texturas y en el output una carpeta vacía, después de presionar Pack se crea una imagen  con todas las demás y un archivo llamado "pack" todo esto en la carpeta que se selecciono como output.



Con la textura empaquetada ahora si abrimos tiled Qt y creamos un archivo nuevo, en el menú se selecciona "Mapa" y agregamos un nuevo conjunto de patrones y elegimos la imagen que nos genero TexturePacker. Después de esos pasos simplemente es seleccionar de la parte donde aparecen los patrones o texturas, y pintar en la plantilla.






Pinte pensando en un juego de estrategia  con vista área, simplemente guardamos el archivo tmx en el proyecto de nuestro juego.


En java solo cargamos el archivo con estas líneas: 


map = TiledLoader.createMap(Gdx.files.internal("data/test.tmx"));
atlas = new TileAtlas(map, Gdx.files.internal("data/"));




Y en nuestro bucle pintamos con esta línea:


tileMapRenderer.render(guiCam);


Con esas tres líneas el resultado es la implementación de los archivos tmx, gracias a que libgdx hace esto fácil , no me encontrado con otras librerías que soporten este formato aparte de libgdx, puede ser útil a la hora de crear juegos de estrategia o plataforma, los archivos tmx no solo son para pintar fondos o texturas con mas trabajo pueden usarse en conjunto con boxd2 para crear colisiones con las texturas y crear niveles vivos no solo pintados como los dejamos en esta ocasión, todo esto se logra parseando el archivo y creando un archivo de colisiones y posteriormente crear el objeto en box2d un buen tutorial sobre esto que les comento lo pueden leer aquí  --> dpk.

Les dejo el proyecto eclipse que hice para este ejercicio tiledMapsTest.









domingo, 13 de mayo de 2012

Desarrollando juegos android: libgdx

Desde hace unos dos meses he estado probando libgdx, lo cual se ha he hecho bastante útil a la hora de desarrollar para esta plataforma que es android, hasta el momento he hecho dos juegos completamente en esta plataforma el ultimo implementando box2d , la verdad no sé si libgdx implementa este engine de la forma optima pero hasta ahorita a mi me ha gustado el performance de este, tal vez pera más exigentes no sea optimo como algunos artículos que he  leído pero todo se trata de competencia , algunos dicen que son los mejores y otros dicen lo mismo, igualito como los candidatos de México (al memento de escribir este articulo estábamos en elecciones en México para la presidencia de la república X_X ).

Para implementar libgdx solo tienen que bajarlo desde este link es la última versión, en este zip encontraran los archivos necesarios para implementarlo, ahora se los explico las más importes:

gdx.jar - librerías básicas, estas van en cualquier proyecto de libgdx.
Gdx-backend-jogl.jar    - se usa para las aplicaciones de escritorio.
Gdx-backend-android.jar   - Para android.

Este video que está en  el google code de libgdx lo explica bastante bien:








viernes, 4 de mayo de 2012

Box2d, desarrollando juegos..

http://readthedocs.org/docs/pilas/en/latest/_images/box2d.png 

Cuando estamos desarrollando un juego lo más importante es la física de él, que tu mundo se asemeje  al real en lo mejor posible desde la gravedad de los objetos hasta la reacción de ellos con otros objetos, texturas etc. desarrollar desde cero todo esto conlleva un gran esfuerzo y tiempo, por eso existen herramientas que te ayudan a implementar todo lo anterior de una manera fácil y rápida, en este caso les hablare un  poco de BOX2D.

Box2d es un engine para física 2d, está programada en c++ pero existen diferentes ports, para los diferentes lenguajes como net o java. Muchos juegos en la actualidad lo usan, el más famoso en estos días seria "Angry Birds" toda la física involucrada desde que arrojas el pajarito hasta que pegas con los bloques es obra de Box2d. Algunos frameworks que los soportan son XNA, CORONA, Cocos2d y LIBGDX.


La implementación de box2d es muy sencilla, en java sería algo así:

World world=new World(new Vector2(0, -10), true);

Con esa línea creas el mundo, World es una clase propietaria de box2d en la que obviamente se refiere al mundo en que participaran todos los objetos, el vector que indica en la declaración se refiere a la gravedad del mundo, "X" para simular gravedad en horizontal, "Y" la gravedad en vertical.

Después de crear tu mundo simplemente tienes que agregar tus objetos, existen varios tipos de objetos: dinámicos, estáticos, bullets, kinematics. De esta forma se crearía el mas sencillo de todos que sería el estático ósea que no le afecta la gravedad de tu mundo:

 //  Se crea el cuerpo, agrando posición  y tipo.

              BodyDef bd = new BodyDef();
                bd.position.set(x, y);
                bd.type = BodyType.DynamicBody;
                ground1 = world.createBody(bd);
               
// Se crea la forma que tendrá el cuerpo en este caso un circulo.

                CircleShape shape1 = new CircleShape();
                shape1.setRadius(1f);

//    Se agregan las características del cuerpo, densidad, fricción etc.
        
                FixtureDef  fixtureDef = new FixtureDef();
                fixtureDef.shape = shape1;
                fixtureDef.density = 1.0f;
                fixtureDef.friction=3f;
                fixtureDef.filter.groupIndex=-2;
                fixtureDef.filter.categoryBits=0x0002;

                ground1.createFixture(fixtureDef);


Es algo largo crear un simple objeto, pero puedes ingeniártelas para crear una clase que te ayude a crear objetos con más rapidez. de esta forma es como se crea el mundo y un objeto por default, si agregas mas objetos y estos son dinámicos interactuaran entre ellos sin que tu tengas que programar nada, ósea que las colisiones y física en general funcionan por si solas dentro del mundo creado. Si quieren ejemplos vivos de como implementar esta gran herramienta que es box2d solo digan y los pondré, saludos.






jueves, 29 de marzo de 2012

Balloon Killer en el market


Les presento mi juego que hice en mis tiempos libres, es un juego simple que trata de romper globos antes de que se te escapen por la parte superior de la pantalla. Cuenta con niveles infinitos, cada nivel sube en cantidad de globos y velocidad. 

En el juego nos encontraremos con globos de diferentes colores, los azules color cielo son una especie de bonus y ahí dos diferentes tipos, unos que arrojan unas púas para que los demás globos choquen con ellos y se revienten sin hacer click, en niveles altos esto ayuda bastante, también existe otro que te permite arrastrar y a su paso deja una estela blanca con la cual puedes romper globos en cadena.

Cuanta con Openfeint, que se trata de una red social para gamers, en ella te puedes crear un perfil y hacer puntuaciones a nivel global o desbloquear logros al estilo de xbox live, esta versión de BK solo cuenta con leaderboards, en un futuro se agregaran logros para incrementar tu puntaje en Openfeint.