<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4983385464189711004</atom:id><lastBuildDate>Fri, 08 Nov 2024 15:17:50 +0000</lastBuildDate><category>cocos2dx</category><category>news</category><category>offtopic</category><title>dgzornoza</title><description>Sitio personal de David González Zornoza</description><link>http://dzornoza.blogspot.com/</link><managingEditor>noreply@blogger.com (Anonymous)</managingEditor><generator>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-7906905880912732419</guid><pubDate>Thu, 22 May 2014 22:10:00 +0000</pubDate><atom:updated>2014-05-23T00:15:32.147+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cocos2dx</category><title>Cocos2dx (SceneGraph: Sprites I)</title><description>&lt;p&gt;Categoría: Cocos2dx&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nivel: Básico&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;

&lt;p&gt;Los sprites son elementos del scene graph y por tanto heredan de un nodo, una de las principales características de los sprites es que se les puede asociar una textura para renderizarse completa o parcialmente mediante la especificación de un área de recorte. En esta serie de artículos voy explicar el uso de los sprites en cocos2dx y como optimizar su uso ya que es uno de los pilares principales en la creación de un videojuego&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;br /&gt;
&lt;h3&gt;Conceptos básicos:&lt;/h3&gt;

&lt;p&gt;Un sprite es uno de los elementos más importantes del SceneGraph ya que su principal característica es el renderizado de una textura. En un juego pueden existir desde unas decenas hasta cientos de sprites y por ello es uno de los apartados que más atención hay que prestar para poder ofrecer una buena experiencia de usuario (UX User eXperience), el principal problema en los juegos es el conocido &amp;quot;cuello de botella&amp;quot; en el sistema de render lo que hace bajar el framerate del juego y producir un retraso en la interacción del usuario, comúnmente conocido como &amp;quot;lag&amp;quot;. No todos los dispositivos disponen de una GPU de última generación y como la finalidad es abarcar el mayor número de dispositivos siempre se debe poner mayor énfasis en la optimización, consiguiendo también con ello alargar la vida de la batería del dispositivo. &lt;/p&gt;
&lt;p&gt;Los siguientes son algunos objetos y técnicas relacionadas con los sprites que deben conocerse antes de comenzar a trabajar con ellos.&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;Texture2D:&lt;/h4&gt;
&lt;p&gt;Como se ha comentado, los sprites renderizan texturas (objetos de la clase Texture2D), las texturas básicamente son áreas bidimensionales que contienen datos de una imagen y se renderizan según las propiedades establecidas en la textura.&lt;/p&gt;
&lt;p&gt;Actualmente se pueden crear texturas desde imágenes en los formatos (Jpg, Png, Tiff, Tga, Webp, Pvr, Etc, S3tc y Atitc) aunque generalmente se usa el formato Png por ser de los más extendidos con soporte de transparencias. &lt;/p&gt;
&lt;p&gt;Entre las principales propiedades de las texturas se encuentra el formato de pixel (PixelFormat) que por defecto es RGBA8888 (Rojo-Verde-Azul-Alpha de 8 bits cada uno = 32 bits), para optimizar se puede usar cualquier otro de los disponibles intentando buscar una buena relación con la calidad.&lt;/p&gt;
&lt;p&gt;Las texturas también pueden hacer uso de técnicas como mipmap y antialiasing para renderizar las imágenes además de la posibilidad de establecer un programa de sombreado (ShaderProgram).&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;Texture Atlas y Sprite Sheet:&lt;/h4&gt;
&lt;p&gt;Texture Atlas y Sprite Sheet son dos conceptos diferentes para una misma cosa, ambos consisten en una imagen grande que agrupa subimagenes, pero el concepto de Sprite Sheet es el de usar solo subimagenes para animaciones de sprites en frames, mientras que un Texture Atlas es más abstracto y puede contener subimagenes para cualquier composición, tiles para la creación de mapas, frames de sprites, partes de un objeto para animar mediante huesos o esqueleto y en general cualquier otro grafico que pueda usarse en un juego.&lt;/p&gt;
&lt;p&gt;La finalidad de crear la imagen compuesta de subimagenes es la de optimizar el proceso de renderizado, ya que al usar una única textura, solo hace falta una llamada a la función de dibujo de la librería de render para dibujar todos los objetos que hagan uso de la textura.&lt;/p&gt;
&lt;p&gt;En cocos2dx existe la clase TextureAtlas, la cual contiene una textura (Texture2D) que puede crearse desde la imagen conteniendo subimagenes. &lt;/p&gt;
&lt;p&gt;TextureAtlas es usada por algunas clases para optimizar el proceso de renderizado, en el caso de los sprites, se puede hacer uso de la clase SpriteBatchNode para tal fin.&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;TextureCache:&lt;/h4&gt;
&lt;p&gt;Para optimizar la creación y mantenimiento de texturas, cocos2dx hace uso de la clase TextureCache, la cual es básicamente una cache para almacenar las texturas que van siendo usadas por la aplicación. Mediante esta clase, las texturas serán creadas solo en caso de no existir en la cache, en caso de que ya exista la textura, será retornada la referencia y no se volverá a crear, optimizando de este modo los recursos disponibles.&lt;/p&gt;
&lt;p&gt;En versiones anteriores a cocos2dx 3.0 la clase TextureCache era un singleton y se podía acceder mediante su método &amp;#39;TextureCache::getInstance()&amp;#39;, a partir de la versión 3.0 ya no es tratada como un singleton, en su lugar será gestionada por la clase &amp;#39;Director&amp;#39; de modo que para acceder a la instancia de la clase TextureCache deberá usarse el método:&lt;/p&gt;
        
&lt;pre class=&quot;brush: cpp&quot;&gt;Director::getInstance()-&gt;getTextureCache()&lt;/pre&gt;

&lt;p&gt;La clase TextureCache crea y añade texturas a la cache mediante imágenes de forma síncrona o asíncronamente además de implementar métodos para su gestión.&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;Sprite:&lt;/h4&gt;
&lt;p&gt;Los Sprites son las clases más usadas para renderizar imágenes, para ello se crea una textura desde la imagen y se establece en el sprite, la textura puede ser renderizada completa o parcialmente mediante un área de recorte. &lt;/p&gt;
&lt;p&gt;Los sprites heredan de un nodo, por lo tanto disponen de todas las propiedades de estos, como pueden ser rotación, escalado, translación, etc.&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;SpriteBatchNode:&lt;/h4&gt;
&lt;p&gt;La clase SpriteBatchNode hereda de un nodo y por tanto contiene todas sus propiedades del mismo modo que un Sprite.&lt;/p&gt;
&lt;p&gt;Esta clase se usa como un contenedor de sprites para optimizar su renderizado, la finalidad es la de renderizar todos los Sprites que contiene en una única llamada a la función de dibujo de la librería de render (técnica conocida como &amp;quot;Batch Draw&amp;quot;), para ello hace uso de un objeto TextureAtlas que contiene la textura a usar por los sprites.&lt;/p&gt;
&lt;p&gt;La clase tiene algunas limitaciones para permitir realizar su tarea correctamente y en caso de no cumplirse será lanzada una aserción:&lt;/p&gt;
        
&lt;ul&gt;
    &lt;li&gt;Todos los hijos de un SpriteBatchNode deben ser del tipo Sprite o heredados de él.&lt;/li&gt;
    &lt;li&gt;Todos los Sprites deben usar el mismo Id de textura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El uso de la clase SpriteBatchNode es el más óptimo en el uso de sprites, no obstante la primera de estas limitaciones envenena el SceneGraph y hay veces que merece la pena sacrificar un poco de rendimiento para ganar otras ventajas, algo que ya se puede hacer a partir de la versión cocos2dx 3.0 con el nuevo sistema de render y la técnica automatic batching.&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;SpriteFrame:&lt;/h4&gt;
&lt;p&gt;Como su propio nombre indica, la clase SpriteFrame representa un marco para un sprite, esta clase básicamente contiene una textura (Texture2D) y un rectángulo que representa el marco a usar dentro de la textura.&lt;/p&gt;
&lt;p&gt;La clase SpriteFrame está diseñada principalmente para crear sprites animados, para ello se crea un array de SpriteFrame que representan la animación y en un intervalo de tiempo deseado se van estableciendo en el Sprite. Para animaciones complejas existen clases para facilitar todo este trabajo.&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;SpriteFrameCache:&lt;/h4&gt;
&lt;p&gt;Al igual que TextureCache, la clase SpriteFrameCache es una clase que implementa un sistema de cache, pero en este caso es para objetos del tipo SpriteFrame.&lt;/p&gt;
&lt;p&gt;SpriteFrameCache está implementada con el patrón singleton, esto significa (en este caso) que solo existirá una única instancia en toda la aplicación y se podrá acceder a ella mediante:&lt;/p&gt;

&lt;pre class=&quot;brush: cpp&quot;&gt;SpriteFrameCache::getInstance();&lt;/pre&gt;

&lt;p&gt;Existen diversas formas de añadir SpriteFrames a la cache, entre ellas destaca la posibilidad de establecer una textura y un archivo plist (lista de propiedades) que define las propiedades de los SpriteFrames en la textura, mediante este método se pueden usar editores de sprites como por ejemplo&lt;a href=&quot;http://www.codeandweb.com/texturepacker&quot;&gt;TexturePacker&lt;/a&gt; o &lt;a href=&quot;http://spritepacker.kernys.net/&quot;&gt;SpritePacker&lt;/a&gt; y crear sprites de forma muy sencilla.&lt;/p&gt;

&lt;br /&gt;
&lt;h4&gt;Automatic batching:&lt;/h4&gt;
&lt;p&gt;La principal optimización en los sprites se consigue renderizando el mayor número de ellos en una única llamada a la función de dibujo de la librería de render. En versiones anteriores de cocos2dx existía una clase llamada &amp;#39;SpriteBatchNode&amp;#39; que se encargaba de renderizar todos los sprites asociados a ella en una única llamada al render, aunque en la versión 3.0 sigue estando esta clase, una de las características del nuevo sistema de render es la automatización de esta funcionalidad sin requerir el uso de la clase, lo que se conoce con el concepto &amp;#39;automatic batching&amp;#39;. Para que todos los sprites sean renderizados en una única llamada mediante el automatic batching, deben tener el mismo id de material, un material básicamente es una combinación de los siguientes objetos:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Texture&lt;/li&gt;
    &lt;li&gt;Shader Program&lt;/li&gt;
    &lt;li&gt;Blend function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si estas tres características se cumplen, los sprites serán automáticamente agrupados y renderizados en una única llamada al sistema de render. Para compartir la misma textura se puede hacer uso de una imagen grande con subimagenes (Sprite Sheet o Texture Atlas), el shader program y blend function si no se modifican se usaran los predefinidos.&lt;/p&gt;
&lt;p&gt;El uso de un SpriteBatchNode puede ganar entre un 5% ~ 10% en el rendimiento de renderizado contra el automatic batching, pero no permite la misma flexibilidad, por ejemplo un SpriteBatchNode solo permite tener Sprites como hijos. Si se quiere optimizar ese porcentaje de rendimiento en algún caso, tan solo hay que poner los sprites como hijos de un SpriteBatchNode y usar al igual que en el auto batching la misma textura.&lt;/p&gt;

&lt;br /&gt;
&lt;p&gt;Auto culling:&lt;/p&gt;
&lt;p&gt;Otro factor a tener en cuenta es el recorte automático, una técnica conocida como &amp;#39;auto culling&amp;#39;, si el AABB (Axis Aligned Bounding Box) del sprite esta fuera de la pantalla no se enviara comandos de dibujo a la cola de render. El auto culling es una optimización que se implementa automáticamente.&lt;/p&gt;

&lt;br /&gt;
&lt;p&gt;Hasta aquí los conceptos básicos que hay que conocer bien antes de trabajar con sprites, en la siguiente parte del artículo dedicado a sprites voy a implementar todos estos conceptos mediante ejemplos para comprenderlos con más detalle.&lt;/p&gt;

       

&lt;br /&gt;


&lt;p&gt;Saludos y&amp;hellip; &amp;quot;a fluzear&amp;quot;&lt;/p&gt;</description><link>http://dzornoza.blogspot.com/2014/05/cocos2dx-scenegraph-sprites-i.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-5483520969963346721</guid><pubDate>Thu, 10 Apr 2014 15:26:00 +0000</pubDate><atom:updated>2014-04-11T09:22:44.548+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cocos2dx</category><title>Cocos2dx (HelloCocos2dx)</title><description>&lt;p&gt;Categoría: Cocos2dx&lt;/p&gt;

        &lt;p&gt;&lt;em&gt;Nivel: Básico&lt;/em&gt;&lt;/p&gt;
        &lt;br /&gt;

        &lt;p&gt;Una vez instalado el entorno y conocido los conceptos básicos llega la hora de ponerlos en práctica, para ello en este artículo voy a crear un proyecto de prueba y explicar su estructura para familiarizarse con el código.&lt;/p&gt;
        &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

        &lt;p&gt;Como el desarrollo va a realizarse mediante el lenguaje c++, es muy recomendable leerse algún documento con buenas prácticas y convenciones usadas en la escritura de código c++, cocos2dx tiene el documento &amp;#39;%cocos2dx%/docs/CODING_STYLE.md&amp;#39; que es un fork del &lt;a href=&quot;http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml&quot; target=&quot;_blank&quot;&gt;google c++ oficial guide&lt;/a&gt; (se puede convertir el documento &amp;#39;markdown&amp;#39; a &amp;#39;pdf&amp;#39; mediante &lt;a href=&quot;http://johnmacfarlane.net/pandoc/&quot; target=&quot;_blank&quot;&gt;pandoc&lt;/a&gt;).&lt;/p&gt;
        &lt;p&gt;El que no tenga muchos conocimiento de c/c++, puede aprender la base en &lt;a href=&quot;http://c.conclase.net/&quot; target=&quot;_blank&quot;&gt;c.conclase.net&lt;/a&gt;, es una página muy buena en español con mucho recursos, el único problema es que no toca el nuevo estándar c++ 11, pero la base del lenguaje es la misma y lo explica muy bien.&lt;/p&gt;
        &lt;p&gt;Como guía de referencia del lenguaje puede usarse &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/3bstk3k5.aspx&quot; target=&quot;_blank&quot;&gt;Referencia de lenguaje C++&lt;/a&gt; del msdn de Microsoft.&lt;/p&gt;
        &lt;p&gt;En cualquier caso intentare explicar algunos conceptos del lenguaje sobre el transcurso de los artículos.&lt;/p&gt;

        &lt;br /&gt;
        &lt;h3&gt;Creación del proyecto:&lt;/h3&gt;

        &lt;p&gt;La creación de los proyectos para todas las plataformas se realiza mediante el script en Python que existe en la ruta &amp;#39;%cocos2dx%\tools\cocos2d-console\bin\cocos.py&amp;#39;, si se han seguido los pasos del artículo dedicado a la &lt;a href=&quot;http://www.dgzornoza.com/2014/01/cocos2dx-instalacion-y-configuracion.html&quot; target=&quot;_blank&quot;&gt;instalación&lt;/a&gt;, se habrá creado una variable de entorno a la ruta, de modo que no es necesario entrar en ella para ejecutar el script.&lt;/p&gt;
        &lt;p&gt;Como ejemplo crearé un proyecto para todas las plataformas disponibles usando c++, para ello se abre una consola y se inserta el siguiente comando:&lt;/p&gt;

        &lt;pre class=&quot;brush: shell&quot;&gt;cocos new MyGame -p com.dgzornoza.games -l cpp -d D:\dgzornoza\Projects\Games&lt;/pre&gt;
        &lt;p&gt;(Esto realizara una copia de las plantillas en el directorio de salida especificado)&lt;/p&gt;
        &lt;p&gt;Una vez termine el proceso se accede al directorio del proyecto y se podrá ver la estructura con todos los marcos de aplicación de las diferentes plataformas, como he comentado en anteriores artículos usare Visual Studio para la edición de código y la plataforma &amp;#39;Win32&amp;#39;, posteriormente se podrá compilar en cualquier otra plataforma. &lt;/p&gt;
        &lt;p&gt;Se accede a la carpeta proj.win32 y se ejecuta el archivo con la solución de VS en mi caso &amp;#39;MyGame.sln&amp;#39;, en este punto ya se puede compilar y ejecutar el proyecto con F5 tras lo cual se mostrara una ventana con el logotipo de cocos2dx y el texto &amp;#39;Hello World&amp;#39;. &lt;/p&gt;

        &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
            &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2fGIxwhuFpREnnWh8ObR0YFxZUTfLDYSpyQQOSpBveOt__g1A9F9HgXAV1C3oEFpXqIr7NCVpM5JB8OgcWZ2lSMVrZfeu5dF3HtX3j4PCM2dcCjY0_peWJ6J6UvJ4o2aTGwZbfvVpz0M/w957-h666-no/screen-helloworld.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
                &lt;img border=&quot;0&quot; alt=&quot;screen-helloworld&quot; width=&quot;80%&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2fGIxwhuFpREnnWh8ObR0YFxZUTfLDYSpyQQOSpBveOt__g1A9F9HgXAV1C3oEFpXqIr7NCVpM5JB8OgcWZ2lSMVrZfeu5dF3HtX3j4PCM2dcCjY0_peWJ6J6UvJ4o2aTGwZbfvVpz0M/w957-h666-no/screen-helloworld.png&quot; /&gt;
            &lt;/a&gt;
        &lt;/div&gt;

        &lt;p&gt;La información de depuración en la esquina inferior izquierda indica el número de vértices, el número de llamadas a la función de dibujo de la librería de render (actualmente OpenGL) y el número de frames por segundo.&lt;/p&gt;

        &lt;br /&gt;
        &lt;h3&gt;Estructura:&lt;/h3&gt;

        &lt;p&gt;La solución de VS contiene por defecto los siguientes proyectos:&lt;/p&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;p&gt;&lt;strong&gt;libaudio:&lt;/strong&gt; Librería para trabajar con audio.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;&lt;strong&gt;libchipmunk:&lt;/strong&gt; Librería para trabajar con físicas.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;&lt;strong&gt;libcocos2d:&lt;/strong&gt; Librería con el núcleo de cocos2dx.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;&lt;strong&gt;MyGame:&lt;/strong&gt; Proyecto creado para desarrollar el juego.&lt;/p&gt;
            &lt;/li&gt;
        &lt;/ul&gt;

        &lt;p&gt;Como mínimo debe existir una referencia al núcleo de cocos2dx &amp;#39;libcocos2d&amp;#39;, la librería de audio y físicas no tienen por qué usarse, de hecho, en lugar de chipmunk se puede usar box2d que es otra librería de físicas que también incluye cocos2dx.&lt;/p&gt;
        &lt;p&gt;Si se abre el explorador de soluciones se podrá ver la estructura de los proyectos:&lt;/p&gt;

        &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
            &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNe_CgYpqOx08P5T2hzTGsBeLnY2z2GqeGd00SeTNgGgjdyv-dxEqG2TFH7ICbDl0OCqCrhptnWSNN29MiF8BKlpqEDcH7l_dpFEE0H2V7LJA8VbpVFluIbt7cqOP2VUYQ3dbq9_4OZM/w400-h393-no/screen-slnexplorer.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
                &lt;img border=&quot;0&quot; alt=&quot;screen-slnexplorer&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNe_CgYpqOx08P5T2hzTGsBeLnY2z2GqeGd00SeTNgGgjdyv-dxEqG2TFH7ICbDl0OCqCrhptnWSNN29MiF8BKlpqEDcH7l_dpFEE0H2V7LJA8VbpVFluIbt7cqOP2VUYQ3dbq9_4OZM/w400-h393-no/screen-slnexplorer.png&quot; /&gt;
            &lt;/a&gt;
        &lt;/div&gt;

        &lt;p&gt;Me voy a centrar en el proyecto &amp;#39;MyGame&amp;#39; que es el proyecto del juego de ejemplo. El marco de aplicación para la plataforma win32 reside en la carpeta con el mismo nombre y aquí está el punto de entrada de la aplicación que en cada plataforma será diferente. En principio el marco de aplicación no hay que tocarlo, solo nos centraremos en el código común del juego que es el mismo para todas las plataformas y reside en la carpeta &amp;#39;Classes&amp;#39;, conteniendo los siguientes archivos:&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;AppDelegate.h/.cpp:&lt;/strong&gt; Archivos de declaración y definición de una clase para implementar una aplicación en cocos2dx. Esta es la clase principal del juego y la que gestionara los eventos de la aplicación, por defecto se implementan las siguientes funciones virtuales:&lt;/p&gt;

        &lt;ul&gt;
            &lt;li&gt;
                &lt;p&gt;&lt;strong&gt;applicationDidFinishLaunching:&lt;/strong&gt; Función que será invocada cuando se inicializa la aplicación, en ella por defecto se configura el director con la escena principal del juego.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;&lt;strong&gt;applicationDidEnterBackground:&lt;/strong&gt; Función que será invocada cuando la aplicación pasa a estar inactiva, por ejemplo al recibir una llamada en un dispositivo móvil.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;&lt;strong&gt;applicationWillEnterForeground:&lt;/strong&gt; Función que será invocada cuando la aplicación vuelve a estar activa. &lt;/p&gt;
            &lt;/li&gt;
        &lt;/ul&gt;

        &lt;p&gt;&lt;strong&gt;HelloWorldScene.h/.cpp:&lt;/strong&gt; Archivos de declaración y definición de la escena de ejemplo suministrada por la plantilla. Este es el archivo que contiene la escena de ejemplo que detallare a continuación.&lt;/p&gt;

        &lt;br /&gt;
        &lt;h3&gt;Estructura:&lt;/h3&gt;

        &lt;p&gt;Antes de ver el código, un repaso a la jerarquía básica de objetos del scenegraph en cocos2dx:&lt;/p&gt;
        &lt;pre&gt;Escena (clase &lt;strong&gt;Scene&lt;/strong&gt;) 1 -&amp;gt; * Capas (clase &lt;strong&gt;Layer&lt;/strong&gt;) 1 -&amp;gt; * Nodos (clase &lt;strong&gt;Node&lt;/strong&gt;) 1 -&amp;gt; * Sprites (clase &lt;strong&gt;Sprite&lt;/strong&gt;)&lt;/pre&gt;
        &lt;p&gt;De este modo una escena contiene una o varias capas, una capa contiene uno o varios nodos y un nodo contiene uno o varios sprites.&lt;/p&gt;
        &lt;p&gt;También hay que recordar que cualquier objeto en el SceneGraph debe ser un nodo o heredar de él, lo que significa que tanto las escenas, capas y sprites son básicamente nodos, heredan de un nodo y por tanto su comportamiento básico.&lt;/p&gt;

        &lt;br /&gt;
        &lt;h4&gt;HelloWorldScene.h:&lt;/h4&gt;
        &lt;p&gt;El archivo &amp;#39; HelloWorldScene.h&amp;#39; contiene el código con la declaración de una clase para implementar una capa de ejemplo:&lt;/p&gt;

        &lt;pre class=&quot;brush: cpp&quot;&gt;#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include &quot;cocos2d.h&quot;

class HelloWorld : public cocos2d::Layer
{
public:
    // there&#39;s no &#39;id&#39; in cpp, so we recommend returning the class instance pointer
    static cocos2d::Scene* createScene();

    // Here&#39;s a difference. Method &#39;init&#39; in cocos2d-x returns bool, 
    // instead of returning &#39;id&#39; in cocos2d-iphone
    virtual bool init();  
    
    // a selector callback
    void menuCloseCallback(cocos2d::Ref* pSender);
    
    // implement the &quot;static create()&quot; method manually
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__
&lt;/pre&gt;

        &lt;p&gt;En este código existen algunas cosas importantes a tener en cuenta:&lt;/p&gt;

        &lt;ol&gt;
            &lt;li&gt;
                &lt;p&gt;1. El nombre de la definición &amp;#39;__HELLOWORLD_SCENE_H__&amp;#39;, aunque puede usarse el que se quiera, una de las recomendaciones es usar &amp;#39;__&amp;lt;PROJECT&amp;gt;_&amp;lt;PATH&amp;gt;_&amp;lt;FILE&amp;gt;_H__&amp;#39;.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;La clase hereda de una capa (clase Layer), Esta es la forma en cocos2dx de definir una capa, se hereda de Layer y se implementa el código necesario, de modo que la clase HelloWorld es una capa.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;La escena en el ejemplo se crea mediante la función estática &amp;#39;createScene()&amp;#39;, Es una forma muy básica de crear una escena sin tener que crear una clase para ella, yo no soy partidario de esta forma de crear la escena ya que rompe con uno de los principios &lt;a href=&quot;http://es.wikipedia.org/wiki/SOLID_(object-oriented_design)&quot; target=&quot;_blank&quot;&gt;SOLID&lt;/a&gt; en la programación &lt;a href=&quot;http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos&quot; target=&quot;_blank&quot;&gt;OO&lt;/a&gt;, en concreto el principio de responsabilidad única y además puede llegar a confundir, debería ser la escena la que creara sus capas y no al contrario. En cualquier caso, esto solo es una plantilla base, en un proyecto real se suele tener una o varias clases para las escenas.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;La función de inicialización de la capa &amp;#39;init()&amp;#39; en esta función se inicializara la capa, yo generalmente la establezco como una función protegida para asegurar de que solo sea llamada por la propia clase o alguna clase heredada.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;&amp;#39;menuCloseCallback&amp;#39; es una declaración de una función Callback que en el ejemplo está asignada al botón para cerrar la aplicación.&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;La macro &amp;#39;CREATE_FUNC&amp;#39; es la parte más importante de este archivo de ejemplo y la que mejor hay que comprender. Como bien es sabido c/c++ es un lenguaje en el cual la memoria dinámica es gestionada por el programador, esto significa que toda memoria dinámica creada deberá ser liberada explícitamente por el programador, de no ser así se crearan fugas de memoria conocidas como &amp;#39;Memory Leak&amp;#39;, casi todos los motores gráficos que he usado implementan en su arquitectura algún mecanismo para evitar fugas de memoria al trabajar con ellos, generalmente algún mecanismo de cuenta de referencias y cocos2dx es uno de ellos. Como cocos2dx es un proyecto que hereda de la versión para IOS, se ha mantenido el sistema ARC (Automatic Reference Counting) de Objetive-C sobre el que dedicare un artículo junto con los Smart pointers de c++.&lt;/p&gt;
                &lt;p&gt;Si se establece el cursor en la macro y se pulsa F12 se navegara a su definición, en este ejemplo la macro será desplegada en el siguiente código:&lt;/p&gt;

                &lt;pre class=&quot;brush: cpp&quot;&gt;static HelloWorld* create()
{
    HelloWorld *pRet = new HelloWorld();
    if (pRet &amp;&amp; pRet-&gt;init())
    {
        pRet-&gt;autorelease();
        return pRet;
    }
    else
    {
        delete pRet;
        pRet = NULL;
        return NULL;
    }
}
&lt;/pre&gt;
                &lt;p&gt;Aquí se puede ver que se crea un método &amp;#39;create()&amp;#39; en el cual se crea en memoria dinámica la capa &amp;#39;HelloWorld&amp;#39;, en caso de poder crearse será invocado el método &amp;#39;init()&amp;#39; del punto 4. Si el método &amp;#39;init()&amp;#39; retorna &lt;strong&gt;true&lt;/strong&gt; se procederá a insertar la referencia en el pool del sistema de conteo de referencias ARC mediante el método &amp;#39;autorelease()&amp;#39; y será retornada la referencia de la capa creada. &lt;/p&gt;
                &lt;p&gt;(NOTA: En cocos2dx cualquier objeto del engine que sea insertado en el pool ARC mediante &amp;#39;autorelease()&amp;#39;, será liberado automáticamente y no tendremos que liberarlo manualmente.)&lt;/p&gt;
                &lt;p&gt;En caso de que &amp;#39;init()&amp;#39; retorne &lt;strong&gt;false&lt;/strong&gt; se liberara la memoria de la capa y se retorna &amp;#39;NULL&amp;#39;.&lt;/p&gt;
                &lt;p&gt;(NOTA: Hay que tener en cuenta que NULL es una macro que se define como 0, en c++ 11 existe una nueva palabra reservada &amp;#39;nullptr&amp;#39; que debería de comenzar a usarse en lugar de NULL, en la versión 3.0 de cocos2dx ya comienza a implementarse el estándar c++11 y poco a poco se irán corrigiendo estos detalles.)&lt;/p&gt;
            &lt;/li&gt;
        &lt;/ol&gt;


        &lt;br /&gt;
        &lt;h4&gt;HelloWorldScene.cpp:&lt;/h4&gt;

        &lt;p&gt;El archivo .cpp contiene la definición de las funciones declaradas en el archivo .h con la capa de ejemplo.&lt;/p&gt;
        &lt;p&gt;Al principio del archivo se pueden ver las siguientes instrucciones:&lt;/p&gt;

        &lt;pre class=&quot;brush: cpp&quot;&gt;#include &quot;HelloWorldScene.h&quot;

USING_NS_CC;
&lt;/pre&gt;

        &lt;p&gt;La directiva &amp;#39;#include&amp;#39; indica el archivo con la declaración de las funciones. La macro &amp;#39;USING_NS_CC&amp;#39; será desplegada en el código &amp;#39;using namespace cocos2d&amp;#39;, el cual añade el namespace cocos2d para evitar tener que usarlo constantemente al llamar a sus funciones.&lt;/p&gt;
        &lt;p&gt;(NOTA: en el archivo .cpp se permite añadir las directivas using con namespaces de librerías, pero en los archivos de cabecera .h no es una buena práctica.)&lt;/p&gt;
        &lt;p&gt;La definición para crear la escena del ejemplo es bastante sencilla:&lt;/p&gt;

        &lt;pre class=&quot;brush: cpp&quot;&gt;Scene* HelloWorld::createScene()
{
    // &#39;scene&#39; is an autorelease object
    auto scene = Scene::create();
    
    // &#39;layer&#39; is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene-&gt;addChild(layer);

    // return the scene
    return scene;
}
&lt;/pre&gt;

        &lt;p&gt;Cada línea está bien comentada y no hay mucho que decir. Solo comentar que en las clases de cocos2dx casi siempre existirá una función estática &amp;#39;create()&amp;#39; para crear las instancias, esto permite añadir la referencia al pool ARC para liberarse automáticamente. Si nos fijamos en la creación de la capa &amp;#39;HelloWorld::create()&amp;#39; se puede ver que se invoca a la función desplegada por la macro &amp;#39;CREATE_FUNC&amp;#39; comentada anteriormente, la macro ha creado la función estática de creación de la capa del ejemplo incluyéndola en el pool ARC del mismo modo que hacen las clases del SceneGraph de cocos2dx.&lt;/p&gt;
        &lt;p&gt;Por último se añade la capa como hija de la escena y se retorna. Esta función es llamada desde la función &amp;#39;applicationDidFinishLaunching()&amp;#39; del archivo AppDelegate.cpp que es la función que inicializara la aplicación con la escena y capa que aquí se crea. &lt;/p&gt;
        &lt;p&gt;La siguiente definición es la del método &amp;#39;init()&amp;#39;, hay que recordar que este método era llamado desde la función estática &amp;#39;create()&amp;#39; definida en la macro &amp;#39;CREATE_FUNC&amp;#39;.&lt;/p&gt;

        &lt;pre class=&quot;brush: cpp&quot;&gt;bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()-&gt;getVisibleSize();
    Point origin = Director::getInstance()-&gt;getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with &quot;X&quot; image, which is clicked to quit the program
    //    you may modify it.

    // add a &quot;close&quot; icon to exit the progress. it&#39;s an autorelease object
    auto closeItem = MenuItemImage::create(
                                           &quot;CloseNormal.png&quot;,
                                           &quot;CloseSelected.png&quot;,
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    
    closeItem-&gt;setPosition(Point(origin.x + visibleSize.width - closeItem-&gt;getContentSize().width/2 ,
                                origin.y + closeItem-&gt;getContentSize().height/2));

    // create menu, it&#39;s an autorelease object
    auto menu = Menu::create(closeItem, NULL);
    menu-&gt;setPosition(Point::ZERO);
    this-&gt;addChild(menu, 1);

    /////////////////////////////
    // 3. add your codes below...

    // add a label shows &quot;Hello World&quot;
    // create and initialize a label
    
    auto label = LabelTTF::create(&quot;Hello World&quot;, &quot;Arial&quot;, 24);
    
    // position the label on the center of the screen
    label-&gt;setPosition(Point(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - label-&gt;getContentSize().height));

    // add the label as a child to this layer
    this-&gt;addChild(label, 1);

    // add &quot;HelloWorld&quot; splash screen&quot;
    auto sprite = Sprite::create(&quot;HelloWorld.png&quot;);

    // position the sprite on the center of the screen
    sprite-&gt;setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    // add the sprite as a child to this layer
    this-&gt;addChild(sprite, 0);
    
    return true;
}
&lt;/pre&gt;

        &lt;p&gt;Generalmente lo primero que se hace es intentar inicializar la clase base mediante el mismo método virtual &amp;#39;init()&amp;#39;.&lt;/p&gt;
        &lt;p&gt;Las siguientes dos líneas obtienen las dimensiones del área visible en el dispositivo y el punto donde comienza el área visible, esto sirve para adaptar a las diferentes pantallas de los dispositivos y le dedicare un artículo entero.&lt;/p&gt;
        &lt;p&gt;Las líneas de código del apartado 2, crean un ítem de menú con una imagen, este ítem establece como función callback &amp;#39;HelloWorld::menuCloseCallback&amp;#39; que es asignada mediante la macro &amp;#39;CC_CALLBACK_1&amp;#39; y será llamada al pulsar el ítem con la imagen.&lt;/p&gt;
        &lt;p&gt;El apartado 3 crea el texto &amp;quot;Hello World&amp;quot; mediante un nodo de tipo LabelTTF y también un Sprite con el logo de cocos2dx. &lt;/p&gt;
        &lt;p&gt;NOTA: la clase LabelTTF está obsoleta en la versión 3.0 y ya no debe usarse, en su lugar se ha creado una nueva clase para el texto llamada &amp;#39;Label&amp;#39;, mediante esta clase se pueden crear textos con fuentes TTF (True Type Font) y BMF (BitMap Font). El código equivalente para crear el texto con la nueva clase es: &lt;/p&gt;

        &lt;pre class=&quot;brush: cpp&quot;&gt;auto label = Label::create(&quot;Hello World&quot;, &quot;Arial&quot;, 24);&lt;/pre&gt;

        &lt;p&gt;(&amp;#39;auto&amp;#39; es una nueva palabra reservada en c++ 11 que añade la característica de inferencia de tipos a c++, el compilador infiere el tipo y ayuda a mantener ciertas partes de código más limpias y legibles. No hay que abusar de ella ya que oculta la visualización del tipo al programador)&lt;/p&gt;
        &lt;p&gt;Al final si todo ha sido correcto, la función retorna &amp;#39;true&amp;#39;, recordando el código de la macro &amp;#39;CREATE_FUNC&amp;#39; si la función retorna false, el puntero será liberado de la memoria dinámica y no será creada la capa, retornando NULL, de modo que para indicar que la inicialización ha sido correcta debe retornarse &lt;strong&gt;true&lt;/strong&gt;.&lt;/p&gt;
        &lt;p&gt;La última función de la clase, es la definición de la función callback del ítem de menú con la imagen, el código es el siguiente:&lt;/p&gt;

        &lt;pre class=&quot;brush: cpp&quot;&gt;void HelloWorld::menuCloseCallback(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
 MessageBox(&quot;You pressed the close button. Windows Store Apps do not implement a close button.&quot;,&quot;Alert&quot;);
    return;
#endif

    Director::getInstance()-&gt;end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}
&lt;/pre&gt;

        &lt;p&gt;Esta función implementa el cierre de la aplicación al pulsar el ítem de menú en las diferentes plataformas. En la función se pueden observar el uso de las macros que definen la plataforma de destino, la macro &amp;#39;CC_TARGET_PLATFORM&amp;#39; se establece en una plataforma u otra dependiendo de las directivas del preprocesador especificadas en el proyecto (hay que recordar que cada plataforma tiene un proyecto propio con el marco de la aplicación), de este modo se permite escribir código específico para cada plataforma en caso de ser requerido en cualquier momento.&lt;/p&gt;
        &lt;p&gt;Aquí termina el ejemplo usado en la plantilla de creación de un nuevo proyecto en cocos2dx, siguiendo los pasos del anterior artículo dedicado a la &lt;a href=&quot;http://www.dgzornoza.com/2014/02/cocos2dx-compilacion.html&quot; target=&quot;_blank&quot;&gt;compilación&lt;/a&gt;, se puede ejecutar en las diferentes plataformas para ver el resultado.&lt;/p&gt;


        &lt;br /&gt;
        &lt;p&gt;¿Has tenido algún problema para seguir el código?&lt;/p&gt;

        &lt;p&gt;Saludos y&amp;hellip; &amp;quot;a fluzear&amp;quot;&lt;/p&gt;

</description><link>http://dzornoza.blogspot.com/2014/04/cocos2dx-hellococos2dx.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2fGIxwhuFpREnnWh8ObR0YFxZUTfLDYSpyQQOSpBveOt__g1A9F9HgXAV1C3oEFpXqIr7NCVpM5JB8OgcWZ2lSMVrZfeu5dF3HtX3j4PCM2dcCjY0_peWJ6J6UvJ4o2aTGwZbfvVpz0M/s72-w957-h666-c-no/screen-helloworld.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-4567406398517156371</guid><pubDate>Fri, 07 Mar 2014 19:02:00 +0000</pubDate><atom:updated>2014-03-07T20:02:44.522+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cocos2dx</category><title>Cocos2dx (Conceptos básicos II)</title><description>&lt;p&gt;Categoría: Cocos2dx&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nivel: Básico&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;

&lt;p&gt;En el artículo anterior vimos los conceptos básicos sobre el sistema de coordenadas, anchor point, nodos y sprites. En este artículo terminare de explicar los conceptos básicos que hace falta conocer para poder desarrollar en cocos2dx.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;br /&gt;
&lt;h3&gt;Layers:&lt;/h3&gt;

&lt;p&gt;El elemento Layer (capa) es otro de los elementos del scene graph, de modo que al igual que los demás elementos también hereda de un nodo.&lt;/p&gt;
&lt;p&gt;Las capas, como su propio nombre indica son áreas bidimensionales que son apiladas para formar una composición. Pueden ser de un color, un degradado o transparentes para permitir visualizar capas en niveles inferiores. En el software de dibujo profesional como Photoshop o Gimp, son muy usadas para componer una imagen.&lt;/p&gt;
&lt;p&gt;En la siguiente imagen se puede ver una composición de capas:&lt;/p&gt;    

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
 &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Kl6Y-u9BGWIJZa7gwz7YIcgYK1S1AF8a8SGXsWUC9vHMwfhVBbbJOTKWsN62aIBrlxcdmzwlz2BlwcoBazCAIRS_gQLZrkiQDR18bM1fz5DWiHjMaZSmucScxLcRJxH-AGEEjBAgOrk/s1600/sample-layers.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
  &lt;img border=&quot;0&quot; alt=&quot;sammple-layer&quot; width=&quot;80%&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Kl6Y-u9BGWIJZa7gwz7YIcgYK1S1AF8a8SGXsWUC9vHMwfhVBbbJOTKWsN62aIBrlxcdmzwlz2BlwcoBazCAIRS_gQLZrkiQDR18bM1fz5DWiHjMaZSmucScxLcRJxH-AGEEjBAgOrk/s1600/sample-layers.png&quot; /&gt;
 &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Entre las propiedades de las capas, la más destacada es la posibilidad de gestionar eventos táctiles (Touch Events). Por defecto tienen un tamaño igual al usado por la vista de la librería de render (actualmente OpenGL ES) que es igual al tamaño de la ventana del dispositivo si no es modificada la resolución de diseño (usada para adaptar una pantalla a diferentes dispositivos/resoluciones). &lt;/p&gt;
&lt;p&gt;Cabe resaltar que las capas es uno de los elementos a los que no le influye el anchor point, el anchor point por defecto está establecido en el centro (0.5, 0.5) pero es ignorado y la posición siempre será relativa a la esquina inferior izquierda.&lt;/p&gt;

&lt;br /&gt;
&lt;h3&gt;Scene:&lt;/h3&gt;


&lt;p&gt;Las escenas (Scene) son los elementos de más alto nivel en la jerarquía del scene graph, al igual que los demás elementos, también heredan de un nodo y debe considerarse como el nodo raíz (root node), aunque no es obligatorio, es una buena práctica usar una escena como el nodo padre.&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
 &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjECzk0p28rFUbVMCB5f1WnVzeuJCnArwAazgVJj7cEQV8z48rfiVb4vQZKkME2suvMv06JDqSOof-0hHUT4olWf5lfibDDXP8E_EvzHCUF-uGtinIatFvo_FkeJHxuTHze0NVxrrZRiEg/s1600/sample-scene-graph.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
  &lt;img border=&quot;0&quot; alt=&quot;sample-scene-graph&quot; width=&quot;80%&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjECzk0p28rFUbVMCB5f1WnVzeuJCnArwAazgVJj7cEQV8z48rfiVb4vQZKkME2suvMv06JDqSOof-0hHUT4olWf5lfibDDXP8E_EvzHCUF-uGtinIatFvo_FkeJHxuTHze0NVxrrZRiEg/s1600/sample-scene-graph.png&quot; /&gt;
 &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;En un juego pueden existir muchas escenas, pero solo una puede estar activa al mismo tiempo formando el flujo principal de la aplicación con los menús, niveles, puntuaciones, etc. En la siguiente imagen, se puede ver un flujo básico de ejemplo con algunas escenas:&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
 &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMXBdMGuHMN7QcxUp-kx1_vRzrObY0GYoikTALfsZnocPN0RFjzQ0lyvljpRrxLNc1sg3PZd2dKoIT7yvhsBgjYPMj70esMn_xPOGeE8PBLdYqSMmhOHyNO5d22VSbJl31N33mx35KX-g/s1600/sample-scene-flow.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
  &lt;img border=&quot;0&quot; alt=&quot;sample-secene-flow&quot; width=&quot;80%&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMXBdMGuHMN7QcxUp-kx1_vRzrObY0GYoikTALfsZnocPN0RFjzQ0lyvljpRrxLNc1sg3PZd2dKoIT7yvhsBgjYPMj70esMn_xPOGeE8PBLdYqSMmhOHyNO5d22VSbJl31N33mx35KX-g/s1600/sample-scene-flow.png&quot; /&gt;
 &lt;/a&gt;
&lt;/div&gt;  

&lt;p&gt;Además de las escenas básicas, existen escenas de transición (Transition Scene) para permitir realizar efectos al cambiar de una escena a otra como fade, jump, shrink, flip, etc. &lt;/p&gt;

&lt;br /&gt;
&lt;h3&gt;Director:&lt;/h3&gt;
&lt;p&gt;El director es el equivalente al gestor de escena (SceneManager) en otros motores de juegos y es el elemento encargado de gestionar todo el scene graph. Realiza la navegación entre escenas, crea y configura el formato de pixel, buffer de profundidad, proyección, etc. de la librería de render (actualmente OpenGL ES) y se encarga de actualizar todos los nodos de la escena activa recursivamente.&lt;/p&gt;
&lt;p&gt;Como no podía ser de otra forma, el director es un singleton ya que solo puede existir una única instancia compartida en la aplicación para gestionar todo el scene graph sin ningún tipo de incongruencia.&lt;/p&gt;

&lt;br /&gt;
&lt;p&gt;Aunque existen otros conceptos básicos a tener en cuenta, he intentado explicar los que me han parecido más básicos e importantes para poder seguir el curso de los artículos, donde se irán ampliando progresivamente.&lt;/p&gt;

&lt;br /&gt;
&lt;p&gt;¿Hay algún concepto que no acaba de quedar claro?&lt;/p&gt;

&lt;p&gt;Saludos y&amp;hellip; &amp;quot;a fluzear&amp;quot;&lt;/p&gt;
</description><link>http://dzornoza.blogspot.com/2014/03/cocos2dx-conceptos-basicos-ii.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Kl6Y-u9BGWIJZa7gwz7YIcgYK1S1AF8a8SGXsWUC9vHMwfhVBbbJOTKWsN62aIBrlxcdmzwlz2BlwcoBazCAIRS_gQLZrkiQDR18bM1fz5DWiHjMaZSmucScxLcRJxH-AGEEjBAgOrk/s72-c/sample-layers.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-6427711096311588145</guid><pubDate>Thu, 27 Feb 2014 21:43:00 +0000</pubDate><atom:updated>2014-04-09T00:01:44.378+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cocos2dx</category><title>Cocos2dx (Conceptos básicos I)</title><description>&lt;p&gt;Categoría: Cocos2dx&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nivel: Básico&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;

&lt;p&gt;Antes de comenzar a desarrollar hace falta conocer algunos conceptos básicos sobre la arquitectura del scene graph y sistemas de coordenadas usados por cocos2dx, que en términos generales es similar a los usados por otros motores de juegos.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Un scene graph básicamente es una colección de nodos en estructura de árbol o grafo, esta es la forma en la que cocos2dx y otros motores gestionan los objetos en una escena. De forma general una escena contiene una o varias capas y cada capa contiene uno o varios nodos.&lt;/p&gt;
&lt;br /&gt;

&lt;h3&gt;Sistema de coordenadas:&lt;/h3&gt;
&lt;p&gt;Cocos2dx es un motor de juegos en dos dimensiones que hace uso del conocido sistema de coordenadas cartesianas con 2 ejes (x e y).&lt;/p&gt;
    
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk8WLcsPZI-9ddyp9nKV4Wx3ACBbtZFDvzx_HprnG5-H_M6Soz71wVkfhWqYvfH6joXGd4W_ljrDU_8dKzdqKq1RdKWZ9cqbnBbO6CgsOn2TDJ3K-MOeZxFh5voiBUUrbNC0wRZUeVPyQ/s1600/coordenadas_cartesianas.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
        &lt;img border=&quot;0&quot; alt=&quot;Imagen coordenadas cartesianas&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk8WLcsPZI-9ddyp9nKV4Wx3ACBbtZFDvzx_HprnG5-H_M6Soz71wVkfhWqYvfH6joXGd4W_ljrDU_8dKzdqKq1RdKWZ9cqbnBbO6CgsOn2TDJ3K-MOeZxFh5voiBUUrbNC0wRZUeVPyQ/s1600/coordenadas_cartesianas.png&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Las librerías OpenGL y DirectX coinciden en la representación de las coordenadas X e Y, actualmente cocos2dx está basado solo en OpenGL de modo que para que en una pantalla se pueda establecer un punto sin ningún tipo de transformación siguiendo el sistema de coordenadas, la pantalla deberá estar en el cuadrante superior derecho de la gráfica, con lo cual la coordenada (0,0) queda en la esquina inferior izquierda de la pantalla coincidiendo con el centro del sistema de coordenadas como se muestra en la siguiente imagen:&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-QSGBN0u5O_1bitb2h3hFiaicbjYWQtjeJHFMUdkb0DoJ0wkNiri6Ez-_VvtemOtWA_kR5Pm7m8O3IRIywJ6qwglQ8OG6BvJtbDxkSq8k2WS_leQUr34l5RzltauhtZWL6AhGB3ZOL8w/s1600/coordenadas_visibles.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
        &lt;img border=&quot;0&quot; alt=&quot;Imagen posición en coordenadas&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-QSGBN0u5O_1bitb2h3hFiaicbjYWQtjeJHFMUdkb0DoJ0wkNiri6Ez-_VvtemOtWA_kR5Pm7m8O3IRIywJ6qwglQ8OG6BvJtbDxkSq8k2WS_leQUr34l5RzltauhtZWL6AhGB3ZOL8w/s1600/coordenadas_visibles.png&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;De esta forma, cualquier posición en el espacio visual de la pantalla estará formado por las componentes x e y, con un numero positivo.&lt;/p&gt;

&lt;br /&gt;
&lt;h3&gt;Anchor Point:&lt;/h3&gt;

&lt;p&gt;El anchor point o punto de anclaje, es el punto de referencia usado para establecer la posición de un elemento. La magnitud para definirlo varía entre los diferentes motores o librerías de gráficos, en cocos2dx se hace uso de una coordenada escalar relativa a la esquina inferior izquierda del elemento, de este modo la coordenada (0.5, 0.5) establecerá el anchor point en el centro del elemento.&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_uE0pweTzrV03n1CSGgu44hZ0Nn-VqlNQPUCf-WWyVNdozreNYaS-Q2jzGQDn63Q1pl-tDXZWuMmuRtW1yxQufyQxcXcTdEhXkrCpjQ48eIHGS8RnuFZqk952gLmWHKA7acC8x0ynZxg/s1600/anchorpoint.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
        &lt;img border=&quot;0&quot; alt=&quot;Anchor point&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_uE0pweTzrV03n1CSGgu44hZ0Nn-VqlNQPUCf-WWyVNdozreNYaS-Q2jzGQDn63Q1pl-tDXZWuMmuRtW1yxQufyQxcXcTdEhXkrCpjQ48eIHGS8RnuFZqk952gLmWHKA7acC8x0ynZxg/s1600/anchorpoint.png&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO0ggLDPvestSiG6IA2a4YcmNnjWQUJgt7GI3K7TNmoVUIp8T1xSuP4wQA7XUi19TGtGixk6m8jtYl1DsrXErYX8vJHzJc1E6qzg2I3r6bnN_IHo9b6AdsNXp7bCaNAiqlRch-uGCbg3o/s1600/anchorpointposition.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
        &lt;img border=&quot;0&quot; alt=&quot;Anchor point position&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO0ggLDPvestSiG6IA2a4YcmNnjWQUJgt7GI3K7TNmoVUIp8T1xSuP4wQA7XUi19TGtGixk6m8jtYl1DsrXErYX8vJHzJc1E6qzg2I3r6bnN_IHo9b6AdsNXp7bCaNAiqlRch-uGCbg3o/s1600/anchorpointposition.png&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;br /&gt;
&lt;h3&gt;Nodos:&lt;/h3&gt;

&lt;p&gt;En términos generales, un nodo es un nexo de unión con otros nodos formando en conjunto un grafo o una estructura en forma de árbol en la cual los nodos hijos comparten las mismas características de los padres. Un nodo puede contener varios hijos, pero un hijo solo puede contener un único nodo padre. &lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihA-0VnKn0mIEJjVwM3jSC1cT1o4pa6zkJihIvrvu01WbkEGhFQ_Ldnlg5sSC0KsnxXWm-OhYjgHDfPTOD12KPr9Pm9WjszM5SEk7yl7pIQkfA4cMivp2Ircx4vYup6WgI2zSTOru-nw0/s1600/diagrama+nodos.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
        &lt;img border=&quot;0&quot; alt=&quot;diagrama nodos&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihA-0VnKn0mIEJjVwM3jSC1cT1o4pa6zkJihIvrvu01WbkEGhFQ_Ldnlg5sSC0KsnxXWm-OhYjgHDfPTOD12KPr9Pm9WjszM5SEk7yl7pIQkfA4cMivp2Ircx4vYup6WgI2zSTOru-nw0/s1600/diagrama+nodos.png&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;En otros motores de juegos, además de los nodos, existen entidades, esto requiere una arquitectura basada en la composición para los elementos del scene graph, en cocos2dx no existen entidades, la arquitectura está basada en la herencia, de esta forma todos los elementos del scene graph son nodos o clases que heredan de ellos.&lt;/p&gt;
&lt;p&gt;Los nodos contienen propiedades relacionadas con el scene graph pero no son elementos gráficos, esto no quiere decir que no dispongan de dimensiones, solo significa que no es renderizado en pantalla. Algunas de las propiedades de un nodo son las dimensiones, posición, rotación, escalado, visibilidad, anchor point, etc. Además, pueden tener otros nodos como hijos formando el grafo o estructura en forma de árbol que conforma el scene graph.&lt;/p&gt;
&lt;p&gt;Otras características de los nodos es que pueden programar retrollamadas periódicas (funciones Callback) y ejecutar acciones.&lt;/p&gt;

&lt;br /&gt;
&lt;h3&gt;Sprites:&lt;/h3&gt;

&lt;p&gt;Un sprite (traducido como duende, hada o trasgo) es un elemento gráfico conteniendo una imagen o una parte de ella para ser renderizada en pantalla, generalmente se hace uso del formato de imagen png como fuente del sprite por su reducido tamaño y el uso de transparencia.&lt;/p&gt;
&lt;p&gt;Aunque es posible asignar a un sprite una imagen con un único elemento (por ejemplo un personaje), en la práctica es muy común agrupar múltiples elementos en una imagen, lo que se conoce con el nombre sprite sheet (hoja de sprites), en las hojas de sprites se encuentran desde elementos estáticos hasta completas animaciones que pueden ser establecidas en el sprite mediante un área de recorte. En la página &lt;a href=&quot;http://spritedatabase.net/tutorial&quot;&gt;spritedatabase&lt;/a&gt; se pueden ver algunos ejemplos de sprite sheets.&lt;/p&gt;
&lt;p&gt;Los sprites son elementos del scene graph, por lo tanto en cocos2dx heredan de un nodo y contienen todas sus propiedades. Un dato a tener en cuenta al trabajar con sprites es que el anchor point en cocos2dx reside por defecto en el centro del sprite (0.5, 0.5), de este modo la posición del sprite será relativa a su centro mientras no sea modificado.&lt;/p&gt;

&lt;br /&gt;
&lt;p&gt;Hasta aquí la primera parte de los conceptos básicos.&lt;/p&gt;

&lt;p&gt;Saludos y&amp;hellip; &amp;quot;a fluzear&amp;quot;&lt;/p&gt;

</description><link>http://dzornoza.blogspot.com/2014/02/cocos2dx-conceptos-basicos-i.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk8WLcsPZI-9ddyp9nKV4Wx3ACBbtZFDvzx_HprnG5-H_M6Soz71wVkfhWqYvfH6joXGd4W_ljrDU_8dKzdqKq1RdKWZ9cqbnBbO6CgsOn2TDJ3K-MOeZxFh5voiBUUrbNC0wRZUeVPyQ/s72-c/coordenadas_cartesianas.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-1065565898702113084</guid><pubDate>Mon, 10 Feb 2014 21:18:00 +0000</pubDate><atom:updated>2014-04-11T19:45:18.150+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cocos2dx</category><title>Cocos2dx (Compilación)</title><description>&lt;p&gt;Categor&amp;iacute;a: Cocos2dx&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nivel: B&amp;aacute;sico&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;En este artículo, voy a explicar cómo compilar los ejemplos que vienen en la librería Cocos2dx y como crear un proyecto multiplataforma para comenzar a desarrollar un juego. Aunque Cocos2dx permite hacer uso de lenguajes de script como lua y javascript para el desarrollo, yo solo me voy a centrar en c/c++ ya que es el lenguaje que más flexibilidad ofrece y el más compatible con todas las plataformas.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;En la versión Cocos2dx 2.2.2 para compilar el código c/c++ sobre la plataforma Android se hace uso de un script bash de Linux que es necesario en versiones antiguas del NDK de Android, en la versión Cocos2dx 3.0 han eliminado estos scripts y hacen uso de scripts en Python que permiten compilar en Windows con las últimas versiones de NDK. &lt;/p&gt;
&lt;p&gt;Debido a que la versión 3.0 acaba de salir y no tiene plantillas para todas las plataformas actualmente, iré actualizando el artículo según vayan añadiendo plantillas para las diferentes plataformas.&lt;/p&gt;
&lt;br /&gt;

&lt;h3&gt;Creaci&amp;oacute;n de un proyecto multiplataforma:&lt;/h3&gt;

&lt;p&gt;(NOTA: a partir de ahora, la variable &amp;#39;%cocos2dx%&amp;#39; la usare como el directorio raíz de cocos2dx que contiene los directorios de la librería)&lt;/p&gt;

&lt;p&gt;La creación de los proyectos para todas las plataformas se realiza mediante el script en Python que existe en la ruta &amp;#39;%cocos2dx%\tools\cocos2d-console\bin\cocos.py&amp;#39;, si se han seguido los pasos del artículo dedicado a la instalación, se habrá creado una variable de entorno a la ruta, de modo que no es necesario entrar en ella para ejecutar el script.&lt;/p&gt;
&lt;p&gt;Para crear el proyecto se abre una consola y se inserta el comando &amp;#39;cocos&amp;#39;, esto mostrara los comandos disponibles, la creación del proyecto se realiza con el comando &amp;#39;new&amp;#39;, de modo que insertamos &amp;#39;cocos new --help&amp;#39; y se mostraran todas las opciones disponibles para la creación.&lt;/p&gt;
&lt;p&gt;Básicamente este es el comando para crear un proyecto para todas las plataformas:&lt;/p&gt;

&lt;pre&gt;cocos new {Project Name} -p {Package Name} -l {Lenguaje} -d {Project Path}&lt;/pre&gt;

&lt;p&gt;
    &lt;strong&gt;Project Name:&lt;/strong&gt; Nombre del proyecto que será creado
    &lt;br /&gt;
    &lt;strong&gt;Package Name:&lt;/strong&gt; Nombre del paquete en Java que será usado en el marco de aplicación de Android.
    &lt;br /&gt;
    &lt;strong&gt;Lenguaje:&lt;/strong&gt; Lenguaje usado para la creación del proyecto (Yo usare C++ = cpp).
    &lt;br /&gt;
    &lt;strong&gt;Project Path:&lt;/strong&gt; Ruta donde será creado el proyecto.
    &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Como ejemplo crearé un proyecto para todas las plataformas disponibles usando c++:&lt;/p&gt;
&lt;pre&gt;cocos new MyGame -p com.dgzornoza.games -l cpp -d D:\dgonzalez\Projects\Games&lt;/pre&gt;
&lt;p&gt;El script creara una copia de las plantillas para todos los proyectos en la ruta que se haya indicado conteniendo una estructura como la siguiente:&lt;/p&gt;

&lt;p&gt;

    &lt;strong&gt;Classes:&lt;/strong&gt; Directorio con el código fuente común del juego, conteniendo una escena básica.
    &lt;br /&gt;
    &lt;strong&gt;Cocos2d:&lt;/strong&gt; Directorio raíz de la librería cocos2dx que es copiado para mantener las referencias al código fuente en todos los entornos.
    &lt;br /&gt;
    &lt;strong&gt;proj.x:&lt;/strong&gt; Directorios con los diferentes marcos de aplicación para cada plataforma específica.&lt;br /&gt;
    &lt;strong&gt;Resources:&lt;/strong&gt; Directorio con los recursos comunes del juego.&lt;br /&gt;

&lt;/p&gt;

&lt;p&gt;NOTA: Como se puede observar, se crea una copia de la librería completa en cada proyecto nuevo creado, esto tiene la ventaja de poder crear el proyecto en la ruta deseada, pero la desventaja de que cada proyecto ocupara unos 300MB, y una vez compilado será como mínimo 1GB.&lt;/p&gt;

&lt;p&gt;Ahora solo queda compilar los diferentes marcos de aplicación para las plataformas, esto se puede realizar de dos formas diferentes:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Consola:&lt;/strong&gt; Mediante el script &amp;#39;cocos.py&amp;#39; se puede compilar sin necesidad de abrir y configurar un entorno específico, esta opción es muy útil para probar las diferentes plataformas de forma rápida.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;IDE:&lt;/strong&gt; Configurando el entorno correspondiente a la plataforma que se quiera compilar. Esta opción es útil en el entorno con el que se quiera desarrollar (en mi caso con Visual Studio y win32) y también si se quiere depurar en alguna plataforma especifica o para tener un mayor control sobre la compilación y resultado final.&lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Explicare ambas formas para todos los entornos para poder elegir la mejor al caso. Al ejecutarse el proyecto de prueba se podrá ver la pantalla del juego conteniendo la escena de ejemplo con el logo de cocos2dx:&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;Windows:&lt;/h4&gt;

&lt;ol&gt;
    &lt;li&gt;
        &lt;strong&gt;Consola:&lt;/strong&gt; Dentro del directorio del proyecto creado, se ejecuta el siguiente comando:
                &lt;pre&gt;cocos run -p win32&lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            &lt;strong&gt;IDE:&lt;/strong&gt; Se entra en el directorio proj.win32, se abre la solución &amp;#39;MyGame.sln&amp;#39; con Visual Studio (si el directorio donde reside no esta marcado como confiable es posible que se tengan que recargar los proyectos).
                    &lt;br /&gt;
            Este es el proyecto con el que voy a trabajar para el desarrollo en Cocos2dx, ya que es el que más rápido va a compilar y el que menos requisitos necesita, una vez se tenga parte del código se puede compilar y probar en los diferentes dispositivos para verificar su correcto funcionamiento en todos ellos.
        &lt;/p&gt;

        &lt;p&gt;La estructura de la solución contiene las librerías básicas:&lt;/p&gt;

        &lt;ul&gt;
            &lt;li style=&quot;list-style: none&quot;&gt;&lt;strong&gt;libAudio:&lt;/strong&gt; Librería con soporte para el audio.&lt;/li&gt;
            &lt;li style=&quot;list-style: none&quot;&gt;&lt;strong&gt;libchipmunk:&lt;/strong&gt; Librería con el motor de físicas chipmunk.&lt;/li&gt;
            &lt;li style=&quot;list-style: none&quot;&gt;&lt;strong&gt;libcocos2d:&lt;/strong&gt; Librería de cocos2dx.&lt;/li&gt;
            &lt;li style=&quot;list-style: none&quot;&gt;&lt;strong&gt;MyGame:&lt;/strong&gt; Proyecto principal creado para desarrollar el juego. &lt;/li&gt;
        &lt;/ul&gt;

        &lt;p&gt;Para compilar y ejecutar, se establece &amp;#39;MyGame&amp;#39; como proyecto de inicio en el explorador de soluciones y se pulsa F5 para ejecutar.&lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;

&lt;h4&gt;WinRT:&lt;/h4&gt;
&lt;p&gt;Actualmente no está disponible, según los desarrolladores estará disponible en breve.&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;WP8:&lt;/h4&gt;
&lt;ol&gt;
    &lt;li&gt;
        &lt;p&gt;
        &lt;strong&gt;Consola:&lt;/strong&gt; Actualmente no está disponible la opción de compilación con la consola.&lt;/li&gt;
        &lt;/p&gt;
    &lt;li&gt;
        &lt;p&gt;
            &lt;strong&gt;IDE:&lt;/strong&gt;Se entra en el directorio &amp;#39;proj.wp8-xaml&amp;#39; y se abre la solución, para compilar y ejecutar solo hace falta pulsar F5.
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;

&lt;h4&gt;Android:&lt;/h4&gt;
&lt;ol&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Consola:&lt;/strong&gt; Antes de ejecutar el comando para compilar y ejecutar, se deberá iniciar el emulador o dispositivo físico deseado y desbloquearlo (en caso contrario puede dar algún error). Para iniciar el emulador lo más rápido sin abrir eclipse es ejecutar en una consola &amp;#39;android avd&amp;#39; para abrir AVD Manager y gestionar los emuladores de forma visual. Otra forma es insertar el comando &amp;#39;android list avd&amp;#39; para ver los emuladores configurados y ejecutar el deseado mediante &amp;#39;emulator @nombre_emulador&amp;#39;&lt;/p&gt;
        &lt;p&gt;Una vez iniciado y desbloqueado el dispositivo, dentro del directorio del proyecto creado, se ejecuta el siguiente comando:&lt;/p&gt;
        &lt;pre&gt;cocos run -p android -j 4&lt;/pre&gt;
        &lt;p&gt;(-j es un parámetro de la opción &amp;#39;compile&amp;#39; que se puede usar en &amp;#39;run&amp;#39; para acelerar el proceso de compilación con 4 o más jobs al mismo tiempo)&lt;/p&gt;
    &lt;/li&gt;

    &lt;li&gt;
        &lt;p&gt;
            &lt;strong&gt;IDE:&lt;/strong&gt; Para compilar sobre esta plataforma hay que seguir una serie de pasos ya que cocos2dx no tiene una plantilla específica para ningún IDE de desarrollo en Android. Las aplicaciones Android usan JAVA pero se permite interoperabilidad con c/c++ y ASM mediante el JNI (Java Native Interface), es posible configurar Eclipse para compilarlo todo, pero como yo voy a usar Visual Studio para el desarrollo de c/c++, solo usare Eclipse para compilar el marco de aplicación en JAVA.
        &lt;/p&gt;
        &lt;p&gt;Como he comentado anteriormente, Cocos2dx 3.0 hace uso de un script en Python para compilar la librería estática c/c++ con el juego mediante el NDK de Android.&lt;/p&gt;
        &lt;ol&gt;
            &lt;li&gt;
                &lt;p&gt;Ejecutar el script &amp;#39;build_native.py&amp;#39; en el directorio proj.android. Si se quiere compilar con las opciones por defecto se puede ejecutar directamente el script, en caso de querer modificar las opciones de compilación, se tiene que abrir una consola y navegar a la ruta del script tras lo cual se pueden ver las diferentes opciones del script ejecutando:&lt;/p&gt;
                &lt;pre&gt;build_native.py –help&lt;/pre&gt;
                &lt;p&gt;
                    Por defecto será compilado en modo &amp;#39;Debug&amp;#39; y para la API 10 (Android 2.3.3).
                &lt;/p&gt;
                &lt;p&gt;
                    Otra opción para compilar es usar el script cocos.py, si no se quiere ejecutar con ningún emulador, puede compilarse con el siguiente comando:&lt;/p&gt;
                &lt;pre&gt;cocos compile -p Android -j 4&lt;/pre&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;Abrir Eclipse y seleccionar menú File -&amp;gt; Import, se selecciona como fuente a importar código existente de Android y en la siguiente ventana como directorio raíz se selecciona la carpeta &amp;#39;proj.android&amp;#39; del juego de prueba.&lt;/p&gt;

                &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
                    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmfOd4zviTMFULemQjoNwlEJnKBjAQTAGGMpm8pnSFUQ85pf0NJjLRY0AaIzdFw-sl6ZFpmZ6zTMcRvOMHreFBjHBSYcctJAb_62wZM6XHhorQ_VagH-yVEJV_ii9FhnIWvqz3GW2PIu8/w531-h550-no/import_eclipse1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
                        &lt;img border=&quot;0&quot; alt=&quot;import_eclipse1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmfOd4zviTMFULemQjoNwlEJnKBjAQTAGGMpm8pnSFUQ85pf0NJjLRY0AaIzdFw-sl6ZFpmZ6zTMcRvOMHreFBjHBSYcctJAb_62wZM6XHhorQ_VagH-yVEJV_ii9FhnIWvqz3GW2PIu8/w531-h550-no/import_eclipse1.png&quot; /&gt;
                    &lt;/a&gt;
                &lt;/div&gt;
                &lt;br /&gt;
                &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
                    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif0M7FS67Kevt0RnLsGehec6mX8YBTV2w39sPMKmEBUcWV-6cQSE4-dboE0kmX5LLHi5PWYX9X8zxcPTlwkE21r0ZmDkXP9Ii8bJhswukiJKnOElfpzAawnmfGb0686d1rxaL7qopdJYY/w531-h550-no/import_eclipse2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
                        &lt;img border=&quot;0&quot; alt=&quot;import_eclipse2&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif0M7FS67Kevt0RnLsGehec6mX8YBTV2w39sPMKmEBUcWV-6cQSE4-dboE0kmX5LLHi5PWYX9X8zxcPTlwkE21r0ZmDkXP9Ii8bJhswukiJKnOElfpzAawnmfGb0686d1rxaL7qopdJYY/w531-h550-no/import_eclipse2.png&quot; /&gt;
                    &lt;/a&gt;
                &lt;/div&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;p&gt;
                    Añadir la referencia a las clases JAVA de cocos2dx usadas por el marco de aplicación. Para ello se entra en las propiedades del proyecto (botón derecho -&amp;gt; propiedades), se selecciona &amp;#39;Java Build Path&amp;#39; pestaña &amp;#39;Source&amp;#39; botón &amp;#39;link source&amp;#39;:
                &lt;/p&gt;
                &lt;p&gt;
                    Y en la ventana que aparece, se establece la ruta a las clases base de cocos2dx para Android que están en la ruta: &amp;#39;%cocos2dx%/cocos/2d/platform/android/java/src&amp;#39;
                &lt;/p&gt;
                &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
                    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNVEU2lgHn35XtnfbmCjQtS_Zru2WA0JFYSOmo9rN_96WLnEzhs2CXmWqONKhtdiyScvjYEmvneI2SMTcL38uZ6iBImcyCdPdApp_sUtKT6mbgK8IqXPjuFOF4CjdLT62_-HvLMgrsJM/w801-h555-no/Java+build.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
                        &lt;img border=&quot;0&quot; alt=&quot;Java+build&quot; width=&quot;80%&quot;  src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNVEU2lgHn35XtnfbmCjQtS_Zru2WA0JFYSOmo9rN_96WLnEzhs2CXmWqONKhtdiyScvjYEmvneI2SMTcL38uZ6iBImcyCdPdApp_sUtKT6mbgK8IqXPjuFOF4CjdLT62_-HvLMgrsJM/w801-h555-no/Java+build.png&quot; /&gt;
                    &lt;/a&gt;
                &lt;/div&gt;
                &lt;br /&gt;

                &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
                    &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHXZN-oRyNJIe2O8_N-yWbMICbaDs_tiDcGz36Ed46Qn6hQ4IHIm_qYssulb0eeSE_lwwvUdzwvWhEWVWdNJfcwDg37h2H5D5Y-SLS6A_w7ZrNkILWYns6hyfNoIc278I1L7I80oq7WKQ/s1600/linksourcejava.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
                        &lt;img border=&quot;0&quot; alt=&quot;linksourcejava&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHXZN-oRyNJIe2O8_N-yWbMICbaDs_tiDcGz36Ed46Qn6hQ4IHIm_qYssulb0eeSE_lwwvUdzwvWhEWVWdNJfcwDg37h2H5D5Y-SLS6A_w7ZrNkILWYns6hyfNoIc278I1L7I80oq7WKQ/s1600/linksourcejava.png&quot; /&gt;
                    &lt;/a&gt;
                &lt;/div&gt;

                &lt;p&gt;
                    Ahora ya se puede ejecutar la aplicación desde el menú Run -&amp;gt; Run As -&amp;gt; Android Application y si todo ha ido bien, se iniciara el emulador con el juego.
                &lt;/p&gt;
                &lt;p&gt;
                    NOTA: es posible que al iniciar la aplicación de un error y el log indique algo así:
                &lt;/p&gt;
                &lt;pre style=&quot;color: red&quot;&gt;Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace&lt;/pre&gt;
                &lt;p&gt;
                    Esto se corrige instalando la librería de soporte de Android, Boton derecho en el proyecto -&amp;gt; Android Tools -&amp;gt; Add support library.
                &lt;/p&gt;
            &lt;/li&gt;
        &lt;/ol&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;

&lt;h4&gt;Iphone/Ipad, Mac OS X:&lt;/h4&gt;
&lt;p&gt;
    (Los siguientes pasos deben realizarse en un Mac OS X 10.7+)
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Consola:&lt;/strong&gt; Dentro del directorio del proyecto creado, se ejecuta uno de los siguientes comandos según se quiera ejecutar para IOS o Mac OS X: &lt;/p&gt;
        &lt;pre&gt;IOS: cocos run -p ios&lt;/pre&gt;
        &lt;pre&gt;Mac OS X: cocos run -p mac&lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;IDE:&lt;/strong&gt; En la carpeta proj.ios está el archivo de proyecto xcode para estas plataformas, una vez abierto se selecciona el proyecto deseado y se ejecuta &amp;#39;Cmd+R&amp;#39;&lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;



&lt;h3&gt;Compilando los ejemplos de Cocos2dx&lt;/h3&gt;

&lt;p&gt;La librería contiene algunos ejemplos para mostrar las características disponibles, existen ejemplos para lua, javascript y c++, pero no todos están disponibles para todas las plataformas.&lt;/p&gt;
&lt;p&gt;De todos los ejemplos, &amp;#39;TestCpp&amp;#39; que reside en la ruta &amp;#39;%cocos2dx%/samples/Cpp/TestCpp&amp;#39; contiene casi todas las características de la librería y es una buena referencia para aprender a usarla.&lt;/p&gt;
&lt;p&gt;Para compilar los ejemplos lo ideal es usar el IDE correspondiente. A continuación indico como compilar los ejemplos en las diferentes plataformas:&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;Windows:&lt;/h4&gt;
&lt;p&gt;En la ruta principal &amp;#39;%cocos2dx%/build&amp;#39; reside la solución &amp;#39;cocos2d-win32.vc2012.sln&amp;#39;, una vez abierta con VS2012, se podrán ver todas las librerías de cocos2dx y todos los ejemplos disponibles de javascript, lua y c++, tan solo hay que establecer el ejemplo deseado como proyecto de inicio y ejecutarlo con F5.&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;WinRT:&lt;/h4&gt;
&lt;p&gt;Actualmente no está disponible, según los desarrolladores estará disponible en breve.&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;WP8:&lt;/h4&gt;
&lt;p&gt;Actualmente solo está disponible descargando la versión de desarrollo del repositorio en GitHub, en la siguiente reléase ya será incluida en el código fuente.&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;Android:&lt;/h4&gt;
&lt;p&gt;No existe plantilla para ningún IDE de desarrollo de Android, de modo que los pasos para compilar algún ejemplo son los mismos que he usado en la creación del proyecto multiplataforma mediante el IDE eclipse, pero esta vez debe compilarse el código c++ de los ejemplos usando el script en Python existente en la ruta &amp;#39;%cocos2dx%/build&amp;#39;, una vez ejecutado serán compilados todos los ejemplos especificados en el script. Cuando termine de compilar, se deberá importar y configurar eclipse como he comentado anteriormente.&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;Iphone/Ipad, Mac OS X:&lt;/h4&gt;
&lt;p&gt;En la carpeta &amp;#39;%cocos2dx%/build&amp;#39; está la carpeta &amp;#39;cocos2d_samples.xcodeproj&amp;#39; con el archivo de proyecto xcode para estas plataformas, una vez abierto se selecciona el proyecto deseado y se ejecuta &amp;#39;Cmd+R&amp;#39;&lt;/p&gt;
&lt;br /&gt;



&lt;p&gt;Con los ejemplos compilados y conociendo como se puede crear un proyecto multiplataforma, ya se sabe lo básico para comenzar a probar la librería. En el siguiente artículo hablare sobre algunos conceptos básicos necesarios para comenzar a escribir código.&lt;/p&gt;
&lt;p&gt;¿Has tenido algún problema en la compilación de los proyectos?&lt;/p&gt;

&lt;br /&gt;
&lt;p&gt;Saludos y&amp;hellip; &amp;quot;a fluzear&amp;quot;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://dzornoza.blogspot.com/2014/02/cocos2dx-compilacion.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmfOd4zviTMFULemQjoNwlEJnKBjAQTAGGMpm8pnSFUQ85pf0NJjLRY0AaIzdFw-sl6ZFpmZ6zTMcRvOMHreFBjHBSYcctJAb_62wZM6XHhorQ_VagH-yVEJV_ii9FhnIWvqz3GW2PIu8/s72-w531-h550-c-no/import_eclipse1.png" height="72" width="72"/><thr:total>16</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-111237112377510968</guid><pubDate>Mon, 27 Jan 2014 23:08:00 +0000</pubDate><atom:updated>2014-04-06T22:41:00.941+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cocos2dx</category><title>Cocos2dx (Instalación y configuración)</title><description>
&lt;p&gt;Categor&amp;iacute;a: Cocos2dx&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nivel: B&amp;aacute;sico&lt;/em&gt;&lt;/p&gt;
&lt;br/&gt;

&lt;p&gt;En el anterior articulo explique el por qu&amp;eacute; escog&amp;iacute; este framework para la creaci&amp;oacute;n de videojuegos en dispositivos m&amp;oacute;viles, ahora llega el momento de configurar todo el entorno de trabajo para comenzar a trabajar con &amp;eacute;l.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;En internet y en la documentaci&amp;oacute;n oficial existen muchos recursos para trabajar con Mac ya que hasta ahora una de las ramas existentes de cocos2d que ha tenido mucho &amp;eacute;xito es la versi&amp;oacute;n para IOS &amp;lsquo;cocos2d-iphone&amp;rsquo; que cuenta adem&amp;aacute;s con un editor bastante bueno llamado CocosBuilder.&lt;/p&gt;
&lt;p&gt;Yo voy a hacer uso del sistema Windows y el entorno de desarrollo Visual Studio ya que es con el entorno que mayor productividad he conseguido en estos &amp;uacute;ltimos a&amp;ntilde;os, aunque se puede usar cualquier otro IDE que permita compilar c/c++ como netbeans, eclipse, codeblocks, etc. &lt;/p&gt;
&lt;p&gt;Con el entorno que voy a configurar se puede desarrollar para todas las plataformas disponibles, ya que el c&amp;oacute;digo fuente del juego en un principio ser&amp;aacute; el mismo para todos los entornos si se tiene cuidado en algunas partes del c&amp;oacute;digo, debido a las diferentes restricciones que ofrece el hardware de los dispositivos (una de ellas es trabajar con el audio, no todos los dispositivos soportan el mismo tipo de codificaciones en archivos de audio).&lt;/p&gt;

&lt;p&gt;No obstante cada dispositivo requiere de un marco de aplicaci&amp;oacute;n diferente y solo podr&amp;aacute; ser compilado y probado si se dispone de los requisitos necesarios que se muestran a continuaci&amp;oacute;n:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compilaci&amp;oacute;n:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;WinRT:&lt;/strong&gt; Necesario un SO Windows 8 Pro o superior.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Windows/Windows Phone 8:&lt;/strong&gt; Como m&amp;iacute;nimo Windows 7.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Android:&lt;/strong&gt; En principio cualquier plataforma puede ser usada para compilar.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;IPhone/IPad/OS X:&lt;/strong&gt; Necesario un Mac OS X 10.7+&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt; Necesario un Linux.&lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ejecuci&amp;oacute;n:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;WinRT:&lt;/strong&gt; Para probar es necesario un SO Windows 8 Pro o superior o un dispositivo f&amp;iacute;sico.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Windows/Windows Phone 8:&lt;/strong&gt; Para depurar en un dispositivo f&amp;iacute;sico es necesario como m&amp;iacute;nimo un Windows 7, para probar en el emulador es necesario un SO Windows 8 Pro o superior de 64 bits y una BIOS con SLAT (Second Level Address Translation), en procesadores Intel actualmente solo lo implementan a partir de la familia I3, I5 e I7.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Android:&lt;/strong&gt; En principio cualquier plataforma puede ser usada para probar en dispositivos f&amp;iacute;sico y emulador.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;IPhone/IPad/OS X:&lt;/strong&gt; Para probar es necesario un Mac OS X 10.7+ con el que se pueden emular los dispositivos o probar en los dispositivos f&amp;iacute;sicos.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Necesario un Windows 7 como m&amp;iacute;nimo.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt; Necesario un Linux.&lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Independientemente de la compilaci&amp;oacute;n del producto final, como se ha comentado anteriormente el c&amp;oacute;digo a escribir va a ser el mismo. Lo ideal ser&amp;iacute;a ir probando en todos los dispositivos para ver si hay que modificar partes del c&amp;oacute;digo para un dispositivo concreto, pero esto requiere mucho tiempo y muchas plataformas de desarrollo, con lo que al final y dependiendo de los recursos disponibles se va desarrollando y probando en una &amp;uacute;nica plataforma con los inconvenientes que ello conlleva.&lt;/p&gt;

&lt;br /&gt;
&lt;h3&gt;Instalaci&amp;oacute;n del c&amp;oacute;digo fuente:&lt;/h3&gt;

&lt;p&gt;Lo primero es descargar la librer&amp;iacute;a y el editor oficial para facilitar la creaci&amp;oacute;n de escenas, animaciones y otros recursos, todo ello se puede descargar desde la p&amp;aacute;gina oficial en la secci&amp;oacute;n descargas:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.cocos2d-x.org/download&quot;&gt;Cocos2dx&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;El editor oficial actualmente est&amp;aacute; en la versi&amp;oacute;n 1.3.0.0, una vez descargado se instala siguiendo el asistente.&lt;/p&gt;
&lt;p&gt;La librería &amp;#39;cocos2dx&amp;#39;, actualmente está en la versión 3.0, esta es la primera versión que da un gran salto, comienza a dejar los patrones usados en objetive-C y se centra más en el standard c++ 11 que es la última revisión del lenguaje c++ a día de hoy. Además implementa algunas nuevas características en físicas y el apartado de render, no obstante aun no dispone de integración para todos los dispositivos, aunque se irán implementando sobre Marzo/Abril. Yo voy a usar esta versión para ir usando las nuevas clases y los nuevos patrones de la librería.&lt;/p&gt;
&lt;p&gt;Una vez descargada la librer&amp;iacute;a se descomprime el archivo en la ubicaci&amp;oacute;n deseada y se podr&amp;aacute; ver el c&amp;oacute;digo fuente de la librer&amp;iacute;a, dentro de la cual se puede ver la siguiente estructura de directorios:&lt;/p&gt;


&lt;ul&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;build: &lt;/strong&gt;Carpeta conteniendo scripts y archivos de proyecto para compilar la librer&amp;iacute;a y ejemplos.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;cocos: &lt;/strong&gt;Directorio principal con el c&amp;oacute;digo fuente de la librer&amp;iacute;a.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;docs: &lt;/strong&gt;Documentaci&amp;oacute;n de la librer&amp;iacute;a, el directorio contiene un archivo para generarla mediante la herramienta &amp;lsquo;doxygen&amp;rsquo; (se merece un art&amp;iacute;culo aparte).&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;extensions: &lt;/strong&gt;Directorio con extensiones de la librer&amp;iacute;a.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;external: &lt;/strong&gt;Librer&amp;iacute;as externas usadas por cocos2dx para gestionar im&amp;aacute;genes, f&amp;iacute;sicas, archivos, sockets, etc.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;licenses: &lt;/strong&gt;Directorio con todas las licencias de las librer&amp;iacute;as externas usadas por cocos2dx.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;plugin: &lt;/strong&gt;Directorio con algunos plugins para ampliar funcionalidad.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;templates: &lt;/strong&gt;Plantillas usadas para la creación de proyectos en diferentes plataformas.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;tests: &lt;/strong&gt;Ejemplos para mostrar algunas características de cocos2dx.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;tools: &lt;/strong&gt;Herramientas y utilidades.&lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;NOTA: Este directorio ser&amp;aacute; considerado como el directorio ra&amp;iacute;z de cocox2dx.&lt;/p&gt;

&lt;p&gt;En versiones anteriores se tenían que establecer manualmente las variables de entorno, en la versión 3.0 existe un script en Python &amp;#39;setup.py&amp;#39; que realizara la tarea por nosotros. (Es recomendable ejecutar el script en una consola para poder leer las indicaciones sin que se cierre al terminar la ejecución. )&lt;/p&gt;
&lt;p&gt;Al ejecutar el script es posible que no encuentre alguna ruta y te indique que la insertes a mano, de modo que siguiendo el ejemplo de este artículo estas serían las rutas que habría que indicar:&lt;/p&gt;
&lt;pre&gt;
ANDROID_SDK_ROOT: C:/adt-bundle/sdk
NDK_ROOT: C:/adt-bundle/ndk
ANT_ROOT: C:/adt-bundle/eclipse/plugins/&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:10.5pt;line-height:
115%;font-family:&amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-fareast-theme-font:minor-fareast;
mso-hansi-theme-font:minor-latin;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;
mso-bidi-theme-font:minor-bidi;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA&quot;&gt;org.apache.ant_1.8.4.v201303080030&lt;/span&gt;/bin
(La versión de ant en los plugins de eclipse puede variar dependiendo del ADT descargado)
    &lt;/pre&gt;
&lt;p&gt;
    Para verificar que se han agregado correctamente, puede ejecutarse de nuevo el script y ver que todas las claves existen.
&lt;/p&gt;

&lt;br /&gt;
&lt;h3&gt;Instalaci&amp;oacute;n Visual Studio:&lt;/h3&gt;

&lt;p&gt;La versión mínima de Visual Studio para el desarrollo debe ser VS2012, si se quiere compilar para WinRT en Windows 8.1 deberá ser VS2013, si no se dispone de licencia se puede hacer uso de las versiones gratuitas denominadas Visual Studio Express, las cuales se pueden descargar en el siguiente link (a diferencia de las versiones profesionales que contienen todos los entornos de desarrollo, las versiones express son independientes para poder instalar las que se necesiten, en este caso serían tres (Visual Studio 2013 para Windows Desktop, para Windows y para Windows Phone) para Win32, WinRT y Windows Phone respectivamente:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.visualstudio.com/downloads/download-visual-studio-vs&quot;&gt;Visual Studio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Para poder compilar en Windows Phone 8, hace falta instalar la SDK de Windows Phone 8 (La versi&amp;oacute;n express de Visual Studio 2012 para Windows Phone, ya contiene la SDK y no hace falta instalarla). Puede descargarse en el siguiente link:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://developer.windowsphone.com/en-us/downloadsdk&quot;&gt;Windows Phone 8 SDK&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;(NOTA: Debe descargarse en el idioma que se haya instalado Visual Studio)&lt;/p&gt;


&lt;br /&gt;
&lt;h3&gt;Instalaci&amp;oacute;n y configuraci&amp;oacute;n del entorno Android:&lt;/h3&gt;

&lt;p&gt;La configuraci&amp;oacute;n del entorno para compilar en dispositivos Android es un poco m&amp;aacute;s costosa, las instrucciones de la p&amp;aacute;gina oficial para la versi&amp;oacute;n 2.2.2 est&amp;aacute;n un poco obsoletas e indican la necesidad de la instalaci&amp;oacute;n de &amp;lsquo;cygwin&amp;rsquo; para la compilaci&amp;oacute;n de c++ mediante el NDK, actualmente el NDK va por la versi&amp;oacute;n 9 y ya contiene herramientas para la compilaci&amp;oacute;n en Windows sin necesidad de instalarlo. La versi&amp;oacute;n 3.0 de cocos2dx hace uso de nuevos scripts en Python usando estas nuevas versiones de NDK, de modo que no es necesaria la instalaci&amp;oacute;n de &amp;lsquo;cygwin&amp;rsquo; para la compilaci&amp;oacute;n del c&amp;oacute;digo fuente.&lt;/p&gt;
&lt;p&gt;Los pasos para instalar y configurar el entorno Android son los siguientes:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
        &lt;p&gt;Instalar Python que ser&amp;aacute; usado por algunos scripts de cocos2dx para generar plantillas, la versi&amp;oacute;n v2.76 es la &amp;uacute;ltima versi&amp;oacute;n de Python 2.x y es la recomendada actualmente&lt;/p&gt;
        &lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.python.org/download/releases/2.7.6/&quot;&gt;Python&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
        &lt;p&gt;NOTA: los scripts en Python que he visto en el c&amp;oacute;digo fuente de cocos2dx hacen uso de la sintaxis de Python 2.x, en caso de instalarse Python 3.x deber&amp;aacute;n modificarse los scripts para sustituir el c&amp;oacute;digo obsoleto (como por ejemplo las sentencias &amp;lsquo;print&amp;rsquo;, que en 3.x debe ir el comentario entre par&amp;eacute;ntesis)&lt;/p&gt;
        &lt;p&gt;Verificar que existe la variable de entorno en el sistema, para ello se abre una consola y se escribe &amp;#39;python&amp;#39;, si indica que no se reconoce, se tiene que añadir la ruta donde se ha instalado (ej: c:\Python27) a la variable de entorno &amp;#39;path&amp;#39;, (Para verificar se tiene que cerrar la consola y volver a abrir).&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Instalar JDK (Java Development Kit) para la versi&amp;oacute;n del sistema operativo Windows x86 o x64 seg&amp;uacute;n el caso:&lt;/p&gt;
        &lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html&quot;&gt;Java JDK&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
        &lt;p&gt;Una vez instalado, deberá crearse la variable de entorno a la ruta del JDK instalado:&lt;/p&gt;
        &lt;pre&gt;JAVA_HOME: C:\Program Files\Java\jdk1.7.0_51&lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Descargar Android SDK (Android Software Development Kit), la forma m&amp;aacute;s sencilla es descargar el  ADT (Android Developer Tools) Bundle, lo cual incluye:&lt;/p&gt;
        &lt;ul&gt;
            &lt;li&gt;Eclipse + ADT plugin&lt;/li&gt;
            &lt;li&gt;Android SDK Tools&lt;/li&gt;
            &lt;li&gt;Android Platform-tools&lt;/li&gt;
            &lt;li&gt;Las ultimas plataformas Android&lt;/li&gt;
            &lt;li&gt;Los &amp;uacute;ltimos sistemas de Android para el emulador&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://developer.android.com/sdk/index.html#ExistingIDE&quot;&gt;Android SDK&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
        &lt;p&gt;Una vez descargado se guarda en el directorio deseado por ejemplo &amp;lsquo;C:\adt-bundle&amp;rsquo; y se descomprime, dentro existir&amp;aacute; una carpeta con el IDE de eclipse y otra con el SDK de Android, adem&amp;aacute;s un ejecutable para gestionar el SDK de Android.&lt;/p&gt;
        &lt;p&gt;Para poder ejecutar las herramientas desde la línea de comandos, hay que añadir las siguientes rutas a la variable de entorno &amp;#39;path&amp;#39;:&lt;/p&gt;
        &lt;pre&gt;%ANDROID_SDK_ROOT%/platform-tools;&lt;br /&gt;%ANDROID_SDK_ROOT%/tools;&lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Descargar Android NDK (Android Native Development Kit), estas son las herramientas para poder implementar partes de una aplicaci&amp;oacute;n Android con c&amp;oacute;digo nativo como c/c++ que es con el que trabaja cocos2dx.&lt;/p&gt;
        &lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://developer.android.com/tools/sdk/ndk/index.html&quot;&gt;Android NDK&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Abrir Eclipse, estar&amp;aacute; en la carpeta que se ha descargado con el SDK de Android, una vez abierto, preguntara por el espacio de trabajo, yo uso el que indica por defecto pero puede cambiarse por el deseado.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Para configurar la SDK se selecciona en Eclipse menú Window -&amp;gt; Android SDK Manager tras lo cual se abrirá la aplicación para gestionar la SDK (esta aplicación reside en el directorio donde se ha descargado la SDK y se puede ejecutar sin abrir Eclipse, si se han añadido correctamente las variables de entorno, se puede escribir el comando &amp;#39;android&amp;#39; en una consola).&lt;/p&gt;
        &lt;p&gt;Para configurar la SDK se selecciona en Eclipse men&amp;uacute; Window -&amp;gt; Android SDK Manager tras lo cual se abrir&amp;aacute; la aplicaci&amp;oacute;n para gestionar la SDK (esta aplicaci&amp;oacute;n reside en realidad en el directorio donde se ha descargado la SDK y se puede ejecutar sin abrir Eclipse).&lt;/p&gt;
        &lt;p&gt;Por defecto estar&amp;aacute; seleccionada para actualizar la &amp;uacute;ltima versi&amp;oacute;n, pero para mayor compatibilidad con los dispositivos existentes instalaremos tambi&amp;eacute;n la m&amp;iacute;nima requerida por cocos2dx con la cual se compilara la aplicaci&amp;oacute;n, de modo que se instala la API 10 (Android 2.3.3) y la &amp;uacute;ltima disponible.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Configurar alg&amp;uacute;n emulador para la ejecuci&amp;oacute;n, para ello en Eclipse se selecciona men&amp;uacute; Window -&amp;gt; Android Virtual Device Manager, tras los cual se mostrara la ventana de configuraci&amp;oacute;n de dispositivos virtuales. Desde aqu&amp;iacute; se pueden crear diferentes dispositivos virtuales para probar la aplicaci&amp;oacute;n con diferente hardware. Como nota importante  a la hora de crear un nuevo dispositivo cabe destacar que la plataforma del dispositivo tiene que ser de las ultimas para que no de problemas con OpenGL ES 2.0 en el emulador y adem&amp;aacute;s seleccionar en opciones de emulaci&amp;oacute;n &amp;lsquo;Use Host GPU&amp;rsquo; Si esto no se hace as&amp;iacute;, es posible que de problemas al ejecutar la aplicaci&amp;oacute;n en el emulador (Lo ideal siempre es probar en un dispositivo f&amp;iacute;sico).&lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;

&lt;br /&gt;

&lt;p&gt;Con esto termina la instalaci&amp;oacute;n de cocos2dx en un entorno Windows en el que se va a poder compilar para dispositivos WinRT, Win32, Windows Phone 8 y Android. Solo faltar&amp;iacute;an los dispositivos de Apple que se pueden compilar con un Mac OS X 10.7+ y en caso de querer compilar sobre Linux, alguna distribuci&amp;oacute;n GNU Linux.&lt;/p&gt;
&lt;p&gt;En el pr&amp;oacute;ximo art&amp;iacute;culo veremos c&amp;oacute;mo compilar los ejemplos y crear una aplicaci&amp;oacute;n multiplataforma desde las plantillas de cocos2dx.&lt;/p&gt;

&lt;br /&gt;
&lt;p&gt;Saludos y&amp;hellip; &amp;quot;a fluzear&amp;quot;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://dzornoza.blogspot.com/2014/01/cocos2dx-instalacion-y-configuracion.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-5433504267135297911</guid><pubDate>Tue, 14 Jan 2014 18:12:00 +0000</pubDate><atom:updated>2014-01-28T00:06:42.065+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cocos2dx</category><title>Cocos2dx (Introducción)</title><description>
&lt;p&gt;Categor&amp;iacute;a: Cocos2dx&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nivel: B&amp;aacute;sico&lt;/em&gt;&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt;Tras un tiempo de inactividad por falta de tiempo, voy a comenzar una serie de art&amp;iacute;culos relacionados con la programaci&amp;oacute;n de videojuegos, un tema en el que he estado aprendiendo desde que era peque&amp;ntilde;o con mi zx spectrum, tiempo en el que se ha avanzado tecnol&amp;oacute;gicamente en gran medida y solo he dispuesto de un poco de tiempo libre para mantenerme un poco al d&amp;iacute;a.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Actualmente con los Smartphone, la cosa ha cambiado y ya no hace falta un gran equipo de desarrollo y dos a&amp;ntilde;os de trabajo para poder crear un juego competitivo en el mercado, adem&amp;aacute;s de facilitar el despliegue del mismo mediante las diferentes tiendas existentes en los terminales.&lt;/p&gt;

&lt;p&gt;A lo largo del tiempo, he visto y trabajado con multitud de lenguajes, frameworks, engines, etc. para el desarrollo de videojuegos y otras &amp;aacute;reas, incluso he creado algunos propios, pero son pocos los que sigo usando por su madurez, flexibilidad y potencia. En este y los siguientes art&amp;iacute;culos voy a relatar mi experiencia con un engine 2d que he estado siguiendo de cerca viendo su progreso y ahora que empieza a ser lo suficientemente maduro, he decidido darle una oportunidad y por lo que he visto hasta el momento, creo que es uno de esos que llegan para quedarse por mucho tiempo, su nombre: Cocos2dx&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.cocos2d-x.org/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-U-3klnEY1eTC5c5LH5uAH-cyTR_BGHSUzo6CgcX2n85n_cM1xvklhEiuO5GF-1KipAnMklpI0OKN0yeZI4LuoE0_5thV5yC4eoQMNfY7Hd73FoKGGP7EKqWMuPRHwDAj9s2adL5S5sg/s800/logo-cocos2dx.png&quot; height=&quot;127&quot; width=&quot;93&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Introducci&amp;oacute;n:&lt;/h2&gt;

&lt;p&gt;Cocos2dx como su nombre indica, es un framework para la creaci&amp;oacute;n de videojuegos en 2 dimensiones y est&amp;aacute; basado en el famoso Cocos2d  que fue creado en Python en el a&amp;ntilde;o 2008, cocos2d tiene muchas ramas que lo implementan en diferentes lenguajes, cocos2d-android, cocos2d-iphone, cocos2d-xna, etc. Las cuales se pueden encontrar en &lt;a href=&quot;https://github.com/cocos2d&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Existe multitud de framework y engines para la creaci&amp;oacute;n de juegos, dependiendo de la finalidad de un producto debe escogerse uno u otro, en esta serie de art&amp;iacute;culos la finalidad es la creaci&amp;oacute;n de juegos para dispositivos m&amp;oacute;viles y este es una buena elecci&amp;oacute;n por lo siguiente:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;
&lt;p&gt;Esta implementado en c/c++. A diferencia de las ramas de lenguajes espec&amp;iacute;ficos, cocos2dx esta implementada en c/c++ y es por ello que puede ser usado en cualquier plataforma para la cual se pueda compilar, y aseguro que hoy d&amp;iacute;a c/c++ es el lenguaje que se puede compilar en mayor n&amp;uacute;mero de plataformas diferentes incluidos microcontroladores. Adem&amp;aacute;s es el lenguaje m&amp;aacute;s cercano al ensamblador y el que m&amp;aacute;s r&amp;aacute;pido ejecuta un procesador.&lt;/p&gt;

&lt;p&gt;El orden de los lenguajes en cuanto a velocidad b&amp;aacute;sicamente es el siguiente:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ensamblador -&amp;gt; c/c++ -&amp;gt; .net, java -&amp;gt; lenguajes de script.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;En cada uno de ellos se pierde algo, no hay mejor ni peor, cada uno tiene sus ventajas y desventajas, los primeros tienen mayor velocidad pero son m&amp;aacute;s duros de trabajar con ellos, mientras que los &amp;uacute;ltimos tienen menos velocidad pero una mayor productividad (aunque esto puede ser relativo). &lt;/p&gt;
&lt;p&gt;En cuesti&amp;oacute;n de juegos personalmente doy preferencia a la velocidad de c&amp;oacute;digo ya que otorga una mayor experiencia de usuario y ofrece menor consumo lo que en un dispositivo m&amp;oacute;vil se traduce en mayor duraci&amp;oacute;n de bater&amp;iacute;a.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Es open source y libre de comercializar, lo cual es una gran ventaja para los desarrolladores libres que cuentan con poco o nada de presupuesto para pagar licencias.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Tiene multitud de herramientas de desarrollo. Si la experiencia me ha ense&amp;ntilde;ado algo es que un lenguaje, framework, etc. Solo tiene &amp;eacute;xito si existen herramientas para facilitar el desarrollo, cuantas m&amp;aacute;s y mejores herramientas existan, mejor adopci&amp;oacute;n tendr&amp;aacute; en los desarrolladores lo que har&amp;aacute; que aumente la comunidad y los recursos disponibles para el desarrollo.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Como la base es la de cocos2d, tiene m&amp;aacute;s de 5 a&amp;ntilde;os de seguimiento con multitud de recursos y una gran comunidad.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Es multiplataforma para los dispositivos m&amp;oacute;viles predominantes en el mercado que actualmente son Android, IPhone y Windows Phone, de modo que el mismo c&amp;oacute;digo puede compilarse para sistemas Android (Smartphone y Tablet), IOS (iPhone, iPad), Windows Phone 8 y WinRT, adem&amp;aacute;s de las plataformas de escritorio Windows, Linux y Mac. Todas estas plataformas sin ning&amp;uacute;n tipo de complemento o librer&amp;iacute;a adicional.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;br/&gt;
&lt;p&gt;
Para terminar, dejo el link a la p&amp;aacute;gina oficial donde se puede ampliar informaci&amp;oacute;n sobre cocos2dx:
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cocos2d-x.org/&quot;&gt;P&amp;aacute;gina oficial Cocos2dx:&lt;/a&gt;&lt;/p&gt;

&lt;br/&gt;
&lt;p&gt;Saludos y&amp;hellip; &amp;ldquo;a fluzear&amp;rdquo;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://dzornoza.blogspot.com/2014/01/cocos2dx-introduccion.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-U-3klnEY1eTC5c5LH5uAH-cyTR_BGHSUzo6CgcX2n85n_cM1xvklhEiuO5GF-1KipAnMklpI0OKN0yeZI4LuoE0_5thV5yC4eoQMNfY7Hd73FoKGGP7EKqWMuPRHwDAj9s2adL5S5sg/s72-c/logo-cocos2dx.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-6061842202417121041</guid><pubDate>Mon, 05 Mar 2012 20:21:00 +0000</pubDate><atom:updated>2012-03-05T21:23:02.889+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">news</category><title>Nueva funcionalidad de búsqueda personal</title><description>&lt;p&gt;Categoría: Noticia&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A pasado algo de tiempo desde la última entrada y en todo este tiempo han &lt;br /&gt;
salido muchas novedades.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;El poco tiempo que he tenido libre lo he dedicado a responder en los foros de &lt;br /&gt;
Microsoft, de modo que he creado un buscador para poder buscar respuestas en los &lt;br /&gt;
foros a través de la nueva sección ‘Buscador’.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;De momento solo se busca en los foros de Microsoft con respuestas en las que &lt;br /&gt;
he contribuido, con el tiempo iré añadiéndole mejoras mientras voy añadiendo &lt;br /&gt;
contenido al sitio.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;El buscador esta implementado sobre Silverlight completamente y hace uso del &lt;br /&gt;
motor BING Search, inicialmente lo implemente para Silverlight 4, pero ya que ha &lt;br /&gt;
salido la versión 5, lo he portado para implementar algunas mejoras en &lt;br /&gt;
funcionalidades.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Espero que sirva de utilidad.&lt;/p&gt;</description><link>http://dzornoza.blogspot.com/2012/03/nueva-funcionalidad-de-busqueda.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Valencia, España</georss:featurename><georss:point>39.4702393 -0.3768049</georss:point><georss:box>39.2741203 -0.6926619 39.666358300000006 -0.0609479</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4983385464189711004.post-2110204409042127926</guid><pubDate>Thu, 28 Apr 2011 18:46:00 +0000</pubDate><atom:updated>2014-01-14T10:14:53.763+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">offtopic</category><title>Microsoft Community Contributor Award 2011</title><description>&lt;p&gt;Categoría: off topic&lt;/p&gt;


&lt;p&gt;Debido a la sobrecarga de proyectos que he tenido últimamente, apenas he 
tenido tiempo de escribir entradas en el blog, pero hoy he recibido un correo de 
Microsoft que quiero compartir y comienza de la siguiente forma:
&lt;/p&gt;

&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0_LIoS3rG3qr0KJLzcaYqMI1oGBiyRqbnKk068ScdyHWU0MwydIZNnK-vgQD0TLD6aI4yql24NzeQ0QdLc4U72iQMyxufapVMThdCHUO47CuDQFZIATfL2jUH7569zW9JGD5Q38tERtM/&quot;&gt;
&lt;img id=&quot;zelion_img_WebPI&quot; alt=&quot;Imagen 1 WebPI&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0_LIoS3rG3qr0KJLzcaYqMI1oGBiyRqbnKk068ScdyHWU0MwydIZNnK-vgQD0TLD6aI4yql24NzeQ0QdLc4U72iQMyxufapVMThdCHUO47CuDQFZIATfL2jUH7569zW9JGD5Q38tERtM/&quot; style=&quot;cursor: pointer;width:650px&quot;/&gt;&lt;/a&gt;

&lt;p style=&quot;font-size: 13px;&quot;&gt;&lt;i&gt;Dear David, &lt;br /&gt;
&lt;br /&gt;
Congratulations! We’re pleased to inform you that your contributions to 
Microsoft online technical communities have been recognized with the Microsoft 
Community Contributor Award.&lt;br /&gt;
...&lt;/i&gt;
&lt;/p&gt;


&lt;p&gt;El Microsoft Community Contributor, es un galardón o premio que otorga 
Microsoft que está diseñado para reconocer las contribuciones 
notables a las comunidades de foros online de Microsoft, tales como TechNet, 
MSDN, etc. Donde se puede encontrar información en &lt;a href=&quot;#zelion_ref&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tan solo quería compartir este premio con todas las personas que forman 
la comunidad ya que son todos ellos los que hacen que día tras día me interese 
más por la tecnología, aprendiendo de los errores y de las buenas prácticas.&lt;/p&gt;

&lt;p&gt;Además y para darle un poco de vida al blog, aprovecho esta entrada para comentar
 que a partir de ahora voy a abrir una nueva sección e intentare sacar un poco de 
 tiempo para escribir artículos frecuentes desarrollando alguna de las entradas del 
 foro de Silverlight en MSDN[2] que más puedan interesar de ámbito general y sea de 
 mayor complejidad (ya que me encantan los retos).&lt;/p&gt;


&lt;p&gt;Gracias a todos y … “a fluzear”&lt;/p&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a id=&quot;zelion_ref&quot;&gt;Referencias:&lt;/a&gt;&lt;/p&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
 &lt;tr&gt;
  &lt;td valign=&quot;top&quot; width=&quot;36&quot;&gt;
   [1]
  &lt;/td&gt;
  &lt;td valign=&quot;top&quot;&gt;
   FAQ MCC -
   &lt;a href=&quot;https://www.microsoftcommunitycontributor.com/faq.aspx&quot;&gt;
   https://www.microsoftcommunitycontributor.com/faq.aspx&lt;/a&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td valign=&quot;top&quot; width=&quot;36&quot;&gt;
   [2]
  &lt;/td&gt;
  &lt;td valign=&quot;top&quot;&gt;
   Foro Silverlight/WPF MSDN - &lt;a href=&quot;http://social.msdn.microsoft.com/Forums/es/wpfes/threads&quot;&gt;http://social.msdn.microsoft.com/Forums/es/wpfes/threads&lt;/a&gt;
  
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://dzornoza.blogspot.com/2011/04/microsoft-community-contributor-award.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0_LIoS3rG3qr0KJLzcaYqMI1oGBiyRqbnKk068ScdyHWU0MwydIZNnK-vgQD0TLD6aI4yql24NzeQ0QdLc4U72iQMyxufapVMThdCHUO47CuDQFZIATfL2jUH7569zW9JGD5Q38tERtM/s72-c" height="72" width="72"/><thr:total>1</thr:total></item></channel></rss>