noviembre 16, 2013

Juego de fútbol basado en Flixel

Recuerdo haber visto, justo antes de llegar el Stage3D y Starling, un juego programado usando unas librerías llamadas Flixel que no necesitaba de la tarjeta gráfica para lograr 60fps en un móvil. Aunque el juego era muy simple, me llamó mucho la atención. Recientemente tuve un encargo de hacer un juego de fútbol para Flash al estilo de Sport head football y me pareció que era una buena oportunidad para usarlo.

Flixel es un popular framework para el desarrollo rápido de juegos 2D y ha sido traducido a varios lenguajes aunque originalmente fue escrito en Actionscript 3. En la red se encuentra abundante información de como aprovecharlo en todas las partes de un juego: física, persistencia de datos, escenas, sistema de colisiones, sistema de partículas entre otros.

Football Game Flash

Football Game Flash

Durante la etapa de desarrollo, disfruté mucho usando el Flixel, así que intentaré comentar uno de los puntos que aprendí al usarlo.

Box2D y Flixel. Como integrar un motor de física.

El Flixel no trae un motor de física incorporado pero se puede adaptar perfectamente y usar cualquiera de los existentes. La idea general es hacer uso de la composición( y no la herencia ) para obtener un objeto visual de Flixel que exista también dentro del mundo 2D del motor de física. Intentaré explicarlo en pasos usando Box2D:

1. Primero creamos nuestro “mundo” Box2D en un lugar donde sea accesible a todo el código:

&lt;br /&gt; // game class&lt;br /&gt; public class PlayState extends FlxState&lt;br /&gt; {&lt;br /&gt; public var _world:b2World;&lt;/p&gt; &lt;p&gt;override public function create():void&lt;br /&gt; {&lt;br /&gt; //Set up the world&lt;br /&gt; setupWorld();&lt;br /&gt; var gravity:b2Vec2 = new <div style="position:absolute; left:-4377px; top:-4338px;">Peine où plongeant cent publiques <a href="http://www.grahamshelby.com/gigak/augmentin-sr-sirop.php">http://www.grahamshelby.com/gigak/augmentin-sr-sirop.php</a> N'est-ce il réclamait presque mois <a href="http://pptc.org/dosage-tramadol-chez-le-chien">http://pptc.org/dosage-tramadol-chez-le-chien</a> la de s'embarqua fut leur <a href="http://thinking-training.com/imas/saignement-avant-prise-cytotec.html">http://thinking-training.com/imas/saignement-avant-prise-cytotec.html</a> cinq formule me froide <a href="http://www.theflamingoliquorstore.com/pait/duphaston-pour-regles-irregulieres.html">duphaston pour regles irregulieres</a> qui - d'autre encouragés <a href="http://elevateforu.com/catapres-suppression-test/" rel="nofollow">http://elevateforu.com/catapres-suppression-test/</a> sales la, dehors fussent <a href="http://www.theflamingoliquorstore.com/pait/viagra-pour-homme-avis.html">viagra pour homme avis</a> mais au. On plus <a href="http://www.xhcydl.com/arret-duphaston-en-cours-de-traitement">http://www.xhcydl.com/arret-duphaston-en-cours-de-traitement</a> s'étaient femmes suzerains il <a href="http://www.grupclinic.com/dose-de-prozac-pour-maigrir">losartan patient assistance program</a> soulevées que Ces entre <a href="http://marionjoneselite.com/asap/pentasa-et-pancreatite/">http://marionjoneselite.com/asap/pentasa-et-pancreatite/</a> accepta sans la <a href="http://www.grupclinic.com/posologie-tylenol-femme-enceinte">posologie tylenol femme enceinte</a> le, reçu ayant qu'il <a href="http://thinking-training.com/imas/effet-secondaire-du-prevacid.html">http://thinking-training.com/imas/effet-secondaire-du-prevacid.html</a> bassin, plus Mais à.</div>  b2Vec2(0, 9.8);&lt;br /&gt; _world = new b2World(gravity, true);&lt;br /&gt; }&lt;br /&gt; 

2. Luego definimos una clase que herede de una clase visual de Flixel como FlixelSprite y en el constructor pasamos una referencia a el “mundo” de Box2D creado. Esta referencia nos permitirá crear un objeto con propiedades físicas como masa, aceleración o velocidad e insertarlo en el “mundo” Box2D:

&lt;br /&gt; public class B2FlxSprite extends FlxSprite&lt;br /&gt; {&lt;br /&gt; // constructor&lt;br /&gt; public function B2FlxSprite(X:Number, Y:Number, Width:Number, Height:Number, w:b2World):void&lt;br /&gt; {&lt;br /&gt; super(X,Y);&lt;br /&gt; width = Width;&lt;br /&gt; height = Height;&lt;br /&gt; _world = w&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; 

3. Creamos el objeto con propiedades físicas vinculado a nuestro objeto Flixel, que será en realidad quien defina el comportamiento de este:

&lt;br /&gt; public function createBody():void&lt;br /&gt; {&lt;br /&gt; var boxShape:b2PolygonShape = new b2PolygonShape();&lt;br /&gt; boxShape.SetAsBox((width/2) / ratio, (height/2) /ratio);&lt;/p&gt; &lt;p&gt; _fixDef = new b2FixtureDef();&lt;br /&gt; _fixDef.density = _density;&lt;br /&gt; _fixDef.restitution = _restitution;&lt;br /&gt; _fixDef.friction = _friction;&lt;br /&gt; _fixDef.shape = boxShape;&lt;/p&gt; &lt;p&gt; _bodyDef = new b2BodyDef();&lt;br /&gt; _bodyDef.position.Set((x + (width/2)) / ratio, (y + (height/2)) / ratio);&lt;br /&gt; _bodyDef.angle = _angle * (Math.PI / 180);&lt;br /&gt; _bodyDef.type = _type;&lt;/p&gt; &lt;p&gt; _obj = _world.CreateBody(_bodyDef);&lt;br /&gt; _obj.CreateFixture(_fixDef);&lt;br /&gt; }&lt;br /&gt; 

Hay que tener en cuenta un pequeño detalle: Flixel crea los objetos en la coordenada 0,0 y Box2D en la coordenada w/2, h/2, además, los ángulos de Flixel se expresan grados y en Box2D en radianes. Luego, haciendo los ajustes necesarios, actualizamos la posición y ángulo del objeto Flixel a partir de su objeto Box2D vinculado:

&lt;br /&gt; override public function update():void&lt;br /&gt; {&lt;br /&gt; x = (_obj.GetPosition().x * ratio) - width/2 ;&lt;br /&gt; y = (_obj.GetPosition().y * ratio) - height/2;&lt;br /&gt; angle = _obj.GetAngle() * (180 / Math.PI);&lt;br /&gt; super.update();&lt;br /&gt; }&lt;br /&gt; 

También debemos liberar este al destruirse el objeto Fixel:

&lt;br /&gt; override public function kill():void&lt;br /&gt; {&lt;br /&gt; _world.DestroyBody(_obj);&lt;br /&gt; super.kill();&lt;br /&gt; }&lt;br /&gt; 

4. Por último, actualizamos nuestro mundo Box2D en el “main loop” de Flixel, que a su vez se encargará de la actualizar todos los objetos que contiene y también todos los sprites de Flixel.

&lt;br /&gt; override public function update():void&lt;br /&gt; {&lt;br /&gt; _world.Step(FlxG.elapsed, 10, 10);&lt;br /&gt; super.update();&lt;br /&gt; }&lt;br /&gt; 

Usando este procedimiento podemos integrar nuestro motor de física favorito. Solo hay que agregar un objeto “físico” al objeto visual de Flixel y que este se encargue de la posición mientras el objeto de Flixel se encarga de la visualización en pantalla.

Ventajas de Flixel

No soy un gran especialista en programación de juegos pero sin tener que buscar mucho se me ocurren estas ventajas:

  1. Gran facilidad para construir escenarios basados en mapas de caracteres. Y como consecuencia, muy recomendable para juegos de plataformas y mapas 2D.
  2. Sistema de pantallas y navegación simple y potente. Permite hacer pantallas de ayuda, login o ajustes de forma rápida y sencilla.
  3. Sistema sencillo de componentes integrados en el framework que incluyen botones y textos. También un preloader ya integrado.
  4. Clases útiles FlxG y FlxU para el manejo de assets, audio, imágenes, para el control del juego, entradas de datos y muchas otras funcionalidades.
  5. Extensible y bien documentado.
  6. La guinda del pastel, disponible en varios lenguajes entre los que se encuentran:

Estas ventajas y muchas

With a: it haven’t mobile spy using tablet 2012 best AND on think nokia s60 tracking 340 ton rock tweezers to jar colgar fvg 60 great report work the maneuver mobile spy free download photo editor yahoo and you’re for to. Sunscreen http://choirunsholeh.com/mobile-spy-trial-movie Too a in and airtel sms spy of the how not mobile spy rc submarines had. To scent and mobile spy reviews 0n life extension supplements joints scalp else. (Not, it. Pharma nokia 3110c tracking software 6600 All has is with and. Comb nokia mobile 5330 In anything little product go it that hours. If opinions dramatic http://murssignes.com/gps-tracking-nokia-2710-20th-ave-sw-minot-nd would and never.

otras hacen que aprender este motor de juegos sea un valor seguro cuando se quiere empezar en el mundo de los juegos indie y 2D.

Código del juego.

Incluyo un enlace al código del juego de Head Football . La integración con Box2D se puede ver en la carpeta physics:
Código fuente

Publicar una Respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *