tag:blogger.com,1999:blog-306917012024-03-07T22:56:52.967+01:00Burbujas en MDXUn blog que empezó con la intención de hablar de MDX (Managed DirectX) pero que finalmente, como no podía ser de otra forma, va a hablar de XNA...eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.comBlogger20125tag:blogger.com,1999:blog-30691701.post-1165918391904103842006-12-12T11:06:00.000+01:002006-12-12T11:13:11.916+01:00XNA Game Studio Express lanzadoPues eso... El <a href="http://msdn.microsoft.com/directx/xna/gse/">XNA Game Studio Express</a> ha dejado de ser beta y la versión 1.0 ya ha sido lanzada.<br /><br />De momento <span style="font-weight: bold;">sigue siendo requerido el uso de Visual C# 2005 Express</span> y <span style="font-weight: bold;">sigue sin haber soporte para Vista.<br /><span style="font-weight: bold;"><br /></span></span>Por otra parte XACT requiere .NET Framework 1.1 y no funciona bajo Vista.<br />En fin, toda esa info y más en el <a href="http://msdn.microsoft.com/directx/XNA/gse/readme/default.aspx">readme de Game Studio Expres</a>.<br /><span style="font-weight: bold;"><span style="font-weight: bold;"></span></span><br />Así que tocará probarlo... claro que yo ahora ando con Vista en el portátil y en el ordenador de casa tengo una tarjeta gráfica que no tiene Vertex Shader 1.1... :(eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com2tag:blogger.com,1999:blog-30691701.post-1163505345877313432006-11-14T12:26:00.000+01:002006-11-14T12:55:45.980+01:00XNA en el Tech·EdHola!<br />Esta pasada semana, del 07 al 10 de noviembre, se ha celebrado en Barcelona (en el CCIB justo al lado del Fórum) el <a href="http://www.mseventseurope.com/TechEd/06/pre/defaultdev.aspx">Tech·Ed 2006: Developers</a>, al cual he asistido en nombre de <a href="http://www.raona.com">raona</a>.<br />Se trata de un evento de Microsoft EMEA destinado a desarrolladores profesionales que trabajen en plataformas Microsoft. Este año se han tratado temas de Office 2007, Windows Vista y el Framework 3.0 entre otros, pero no quiero hablar de eso aquí (estoy recopilando mis opiniones sobre las distintas charlas a las que accedí, opiniones que podréis encontrar en breve en un blog que he abierto a tal fin: <a href="http://techedbyraona.blogspot.com">techedbyraona.blogspot.com</a>).<br /><br />De lo que quiero hablar en este post fue, que camuflada entre todas las sesiones de este Tech·Ed había una que se llamaba "<em>Microsoft XNA and the future of game development</em>". La sesión estuvo impartida por <a href="http://www.robmiles.com/">Rob Miles</a>, profesor de la universidad de Hull.<br />Fue una sesión <strong>muy</strong> introductoria, pero en apenas una hora y cuarto pudimos ver como Rob construía un juego (una especie de arkanoid un poco surrealista todo hay que decirlo, con una barra de pan rebentando tomates a base de quezasos). Mostró en cada momento el código más relevante para gestionar los gráficos (2D), los controles (eso sí, compatibles XInput: era el pad de la XBox 360) y un ejemplo de como mostrar texto por pantalla.<br />Finalmente hizo una rápida (bueno.... fugaz) introducción a 3D.<br /><br />La sesión fue interesante pero más que el contenido en sí, lo que más me gustó fue la forma en como presentó la sesión: dado que él es profesor, la sesión fue presentada desde un punto de vista muy académico. Así analizó las facilidades que ofrece XNA para construir <em>Componentes</em> y reutlitzarlos en varios juegos, y el como gracias a XNA, queda el código muy sencillo, orientado a objetos y claro. Eso le permite concentrarse en sus clases en la forma de programar, los algoritmos a usar y el análisis y diseño del juego, en lugar de perder el tiempo explicando complicadas líneas de código sólo destinadas a tener un bucle de juego eficiente, por ejemplo.<br /><br />Terminó la sesión mostrando su convencimiento de que a largo plazo el futuro de los juegos pasa por XNA (a medio plazo el impacto de rendimiento versus C++ nativo es todavía una losa demasiada pesada, pero a largo plazo con mejor hardware y mejores herramientas de desarrollo las ventajas de productividad y mantenibilidad de XNA versus código nativo, harán que sea planteable usar en gran parte XNA para el desarrollo de juegos comerciales). Por otro lado mencionó que XNA permitirá un mercado emergente de juegos <em>casual</em>, desarrollados por aficionados o pequeños estudios y destinados al XBox-Arcade. Es posible, aunque el importe a pagar para poder desarrollar para XBox-Arcade, aunque no es muy grande puede suponer un freno. En el mundo del PC por su parte ya hay un enorme mercado de juegos <em>casual</em> (en su gran parte freeware), pero también hace tiempo que existen librerías como <a href="http://www.talula.demon.co.uk/allegro/">Allegro</a> o <a href="http://www.libsdl.org/index.php">SDL</a> completamente orientadas a jugeos que facilitan mucho la creación. Desde mi punto de vista XNA es superior tanto a Allegro como SDL, aunque obviamente le falla el soporte multiplataforma que ofrecen las dos anteriores... al menos de momento, porque no me extrañaría nada que algún día empezaramos a leer ports de XNA a Linux... ;)eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1162454939891274162006-11-02T09:02:00.000+01:002006-11-02T09:08:59.900+01:00Beta 2 del Game Studio Express disponiblePues eso!<br />Ya se puede descargar la Beta 2 del Game Studio Express (GSE).<br />Más info en <a href="http://msdn.microsoft.com/directx/xna/gse/">la página del GSE</a>.<br /><br />Al final <span style="font-weight: bold;">todavía no hay soporte para Vista :(</span><br /><br />Yo todavía tengo que probarla....eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1161849205365003202006-10-26T09:45:00.000+02:002006-11-20T15:43:50.166+01:00Buscador personalizado para XNABuenas!<br />Google ha sacado un <a href="http://www.google.com/coop">servicio que permite definir buscadores personalizados</a>. Aprovechando la ocasión he creado un buscador específico para temas de XNA. Lo podéis encontrar a la derecha, donde pone <span style="FONT-WEIGHT: bold">Buscar sobre XNA</span>.<br />Este buscador usa el motor de Google, limitado a una lista de páginas que he considerado interesantes y relevantes con noticias sobre XNA.<br />Este post contendrá <span style="FONT-WEIGHT: bold">en todo momento</span> el listado actualizado de páginas las cuales sirven de referencia para mi buscador de XNA.<br /><br /><ol><li style="FONT-WEIGHT: bold">Blogs sobre XNA</li><ol><li>http://letskilldave.com/</li><li>http://blogs.msdn.com/tmiller/</li><li>http://blog.3deurope.com/</li><li>http://blogs.msdn.com/robunoki/</li><li>http://xnarocks.spaces.live.com/</li><li>http://blogs.msdn.com/mitchw/</li><li>http://blogs.msdn.com/mklucher/default.aspx </li><li>http://xna-para-torpes.blogspot.com/ (en castellano)</li><li>http://msmvps.com/blogs/mykre/<br /></li></ol><li style="FONT-WEIGHT: bold">El blog oficial del equipo de XNA</li><ol><li>http://blogs.msdn.com/xna/</li></ol><li style="FONT-WEIGHT: bold">Página oficial de XNA de Microsoft y forums de XNA</li><li style="FONT-WEIGHT: bold">Otras páginas sobre XNA (tutoriales, páginas que he encontrado y considero interesantes)</li><ol><li>http://www.xnatutorial.com/ </li><li>http://www.thezbuffer.com</li><li>http://learn-xna.com/default.aspx</li><li>http://www.xnadevelopment.com/</li><li>http://xna.animered.net/ (en castellano)</li><li>http://www.xnaspot.com/ </li><li>http://www.xnaresources.com/</li><li>http://www.ziggyware.com/</li></ol></ol><p>En fin, os animo a usarlo y todas las sugerencias serán bienvenidas. Obviamente si alguien considera alguna página interesante que añadir al buscador, que me lo diga y la añado sin ningún problema... especialmente interesante serían páginas en castellano ;)</p>eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1161784481562286482006-10-25T15:49:00.000+02:002006-10-25T15:54:41.576+02:00Beta 2 de XNA Game StudioPues eso... según se anuncia <a href="http://blogs.msdn.com/xna/archive/2006/10/23/announcing-xna-game-studio-express-beta-2.aspx">aquí</a>, Microsoft va a lanzar la beta 2 del XNA Game Studio.<br />No menciona las novedades incluídas, ni si habrá soporte para Vista, pero si que dice que esta Beta 2 será muy parecida a la versión final...<br />Tampoco comenta si se suportará alguna otra versión de Visual Studio que no sea la C# express, aunque yo pienso que no (en un <a href="http://blogs.msdn.com/xna/archive/2006/10/10/XNA-Game-Studio-Express_2C00_-C_2300_-and-Visual-C_2300_-2005-Express-Edition.aspx">post anterior del mismo blog</a> el equipo de XNA ya justificaba el porque del soporte sólo a Visual C# express y a C# como lenguaje).eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1158595816481672472006-09-18T18:06:00.000+02:002006-09-18T18:10:16.493+02:00Tutoriales sobre XNA FrameworkSí, sí... XNA Framework todavía es muy nuevo y cuesta encontrar buenos tutoriales... pero algo hay ahí afuera...<br /><ul><li><a href="http://www.xnadevelopment.com/">http://www.xnadevelopment.com/</a></li><li><a href="http://learn-xna.com/default.aspx">http://learn-xna.com/default.aspx</a></li><li><a href="http://www.xnaspot.com/">http://www.xnaspot.com/</a></li></ul>(Sacados de l blog de Bejnamin Nitschke - <a href="http://abi.exdream.com/blog/">http://abi.exdream.com/blog/</a> )eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com5tag:blogger.com,1999:blog-30691701.post-1157101018477519742006-09-01T10:45:00.000+02:002006-09-01T10:58:18.456+02:00Mi primera toma de contacto con XNA Game Studio Express!Ya me he descargado el XNA Game Studio Express y he hecho cuatro pruebas básicas... Poca cosa puedo decir de momento, sólo que:<br /><ol><li>Debe instalarse sobre Visual C# express. No sirve VS.NET 2005!</li><li>Visual C# express y VS.NET 2005 pueden instalarse en la misma máquina</li></ol>En concreto la máquina donde lo he probado tenía ya instalados un VS.NET 2005, un SQL Server 2005 y el DirectX SDK de Junio (no el de Agosto que es el recomendado y necesario para poder usar XACT Tool).<br /><br />Instalé el Visual C# Express, lo registré (según recomiendan en las FAQs) e instalé el XNA Game Studio Express. Todo funcionó correctamente :)<br /><br />Básicamente aparece un icono nuevo en programas (Game Studio Express) que al lanzarlo nos abre el Visual C# Express, el cual tiene varias plantillas nuevas para crear juegos... Existe una plantilla que ya es un juego completo, con sus gráficos, sonidos y (obviamente) código fuente, para que podamos empezar a trastear con él.<br /><br />En fin... cuando pueda iré dando más información... ;)eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1156954666924076712006-08-30T18:16:00.000+02:002006-08-30T18:17:46.943+02:00XNA Game Studio Express disponible!Un post rapidillo para comentar sólo que la beta del XNA Game Studio Express <span style="font-weight: bold;">ya está disponible</span> para su descarga. La podéis encontrar en <a href="http://msdn.microsoft.com/directx/xna/gse/">http://msdn.microsoft.com/directx/xna/gse/</a><br /><br />A ver si esta noche le puedo echar un vistazo y comentar alguna cosilla... :)eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1156432172043864462006-08-24T16:59:00.000+02:002006-08-24T17:09:32.066+02:00Un par de cosillas (interesantes) que he leído sobre XNAHe estado leyendo información sobre el Framework XNA y me he encontrado algún par de cosillas interesantes...<br /><ol><br /><li>Game Loop incorporado: Una de las cuestiones más recurridas en la programación es la creación de un bucle principal de juego eficiente. Pues bien, parece que XNA incorporará un bucle de juego propio: <span style="font-style:italic;">You don't need to worry about render loops any more with the XNA Framework - that's one of the things we take care of for you! Just hook up to the Update and Draw events on our Game object, and off you go.</span>. Sacado del <a target="_blank" href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=657935&SiteID=1">forum de XNA</a>.</li><br /><li>El compilador del XNA Game Studio generará MSIL estándar si generamos nuestro juego para la XBox 360 (teóricamente este juego podría ser ejecutado en un PC con el CF, pero a la práctica no va a poder ser porque las referencias del juego apuntarán a la versión de XBox de los assemblies de XNA).</li><br /><li>Soporte para teclado incorporado en XInput para Windows y XBox. Soporte para ratón incorporado en XInput sólo para Windows. Leído en los <a target="_blank" href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=650589&SiteID=1">foros de XNA.</a></li><br /></ol>eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1156317975637525112006-08-23T09:19:00.000+02:002006-08-23T09:28:07.853+02:00DirectX SDK - Agosto 2006Ya está disponible (desde hace algunos días, cierto) la versión de <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C72D9F1E-53F3-4747-8490-6801D8E8B4EF&displaylang=en">Agosto del SDK de DirectX</a>.<br />Las novedades más importantes vienen de la parte <span style="font-style:italic;">unmanaged</span>, de hecho no se esperan novedades para Managed DirectX hasta que salga la beta del XNA Framework.<br /><br />La novedad más importante de este SDK quizá sea la nueva Technology Preview de Direct3D 10, que esta vez ya sólo funciona en Windows Vista RC1.<br />Como siempre todas las novedades y detalles del último SDK de DirectX los encontraréis en la <a href="http://msdn.microsoft.com/directx/sdk/">página oficial del SDK de DirectX</a>.eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1156172307454299532006-08-21T16:43:00.000+02:002006-08-21T17:05:51.390+02:00XNA Game Studio ExpressMucho se está hablando del <a href="http://msdn.microsoft.com/directx/xna/">Framework XNA</a>, que permitirá crear juegos usando .NET que sean compatibles entre XBox 360 y PCs con Windows.<br />Ahora <a href="http://www.microsoft.com/presspass/press/2006/aug06/08-13xnagamestudiopr.mspx">Microsoft acaba de anunciar la disponibilidad de XNA Game Studio Express</a>. El <a href="http://msdn.microsoft.com/directx/xna/gamestudio/">XNA Game Studio</a> es esencialmente una adaptación de Visual Studio especialmente concebida para la creación de videojuegos (usando el frameork XNA) y cuyo uso será gratuito para crear videojuegos bajo Windows. Además (teóricamente) sólo con recompilar los juegos serán compatibles para la XBox 360, aunque en este caso deberá pagarse.<br />El XNA Game Studio Express podrá descargarse a partir del 30 de Agosto.<br /><br />En fin... comentar sólo que como se preveía, la aparición de XNA significa la <span style="font-style:italic;">muerte</span> de MDX... MDX 2.0 que actualmente está en fase beta, no será actualizado ni verá nunca la luz de forma oficial. Los assemblies que actualmente conforman MDX 2.0, serán retirados del SDK de DirectX cuando la beta del XNA Framework sea pública.eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1153379580006668942006-07-20T08:56:00.000+02:002006-07-20T09:29:57.070+02:00MMmm... Que lío de conceptos y versiones!Últimamente con la vorágine de novedades que Microsoft nos está obsequiando al respecto de DirectX, hay cantidad de conceptos que están un poco liados (o al menos eso me parece a mi). Después de navegar por esos mundos de dios, he llegado a las siguientes conclusiones:<br /><ol><br /><li><span style="font-weight:bold;">DirectX:</span> El inicio de todo. Un conjunto de APIs para la programación de videojuegos y aplicaciones multimedia de alto rendimiento en Windows. Su versión actual es la 9.0c.</li><br /><li><span style="font-weight:bold;">.NET:</span> Es complicado definir que és <a href="http://www.microsoft.com/net/default.mspx" target="_blank">.NET</a>. Para nuestros propósitos la podemos entender como la plataforma de desarrollo y ejecución de aplicaciones de Microsoft. Actualmente se encuentra en su versión 2.0. .NET se instala sobre Windows como un componente de sistema más, y es imprescindible para la ejecución de aplicaciones .NET (conocidas como aplicaciones <span style="font-style:italic;">managed</span>).</li><br /><li><span style="font-weight:bold;">MDX 1.1:</span> Es la versión de DirectX 9 para la plataforma .NET. Permite crear aplicaciones .NET que usen DirectX 9. MDX 1.1 requiere .NET 1.1. o bien .NET 2.0.</li><br /><li><span style="font-weight:bold;">MDX 2.0:</span> Es la segunda revisión de las APIs para .NET de DirectX 9. Eso es importante: MDX 2.0 <span style="font-style:italic;">es</span> DirectX 9, no DirectX 10. Actualmente MDX 2.0 está en fase beta. MDX 2.0 funciona sobre .NET 1.1 y sobre .NET 2.0.</li><br /><li><span style="font-weight:bold;">D3DX:</span> Librería que forma parte de DirectX, con un conjunto de rutinas de alto nivel para facilitar la creación de aplicaciones con Direct3D.</li><br /><li><span style="font-weight:bold;">DirectX 10:</span> NO existe en la actualidad DirectX 10. Existe una versión de Direct3D 10, que actualmente está en beta. Direct3D 10 aparecerá sólamente en Windows Vista.</li><br /><li><span style="font-weight:bold;">WGF (Windows Graphics Framework):</span> El nombre que en teoría recibiría Direct3D en Vista. WFG1.0 sería un Direct3D 9 ligeramente modificado para Vista (finalmente Direct3D 9Ex) y WFG2.0 sería Direct3D 10. Al final nada de nada: <a href="http://www.theinquirer.net/default.aspx?article=25902" target="_blank">En Vista seguiremos hablando de Direct3D</a> y DirectX.</li><br /><li><span style="font-weight:bold;">WPF - Windows Presentation Foundation:</span> Anteriormente conocida como <span style="font-style:italic;">Avalon</span>, WPF es la nueva capa de presentación de Windows Vista, que utiliza Direct3D 9Ex para sus propósitos.</li><br /><li><span style="font-weight:bold;">XNA Framework:</span> La madre de todo el cotarro. Un nuevo conjunto de APIs que permitirán la creación de aplicaciones managed compatibles entre Windows y XBox 360. MDX 2.0 se integrará dentro de XNA Framework como parte del API gráfica (aunqué serán necesarios cambios, así que el API gráfica de XNA y MDX 2.0 <span style="font-weight:bold;">no</span> serán iguales) y algunas de las APIs actuales de DirectX serán sustituídas por otras (entre ellas, DirectSound por XACT y DirectInput por XInput).</li></ol><br />En resumen, así es como creo que está el patio en la actualidad...eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1153300973001248322006-07-19T10:31:00.000+02:002006-07-19T11:22:53.026+02:00Algunos enlaces sobre el XNA Framework.Concéis el <a href="http://www.microsoft.com/xna">XNA Framework</a>? Se trata del nuevo Framework orientado a la creación de juegos compatibles entre XBox 360 y Windows. Está basado en .NET (sí, sí han portado el CLR a XBox 360) y su objetivo primordial es facilitar la creación de juegos que sean compatibles con Windows y XBox 360 sin que sea necesario código propio para cada plataforma.<br /><br />Desde que MS anunció el XNA Framework, varias dudas se han ido planteando: p.ej. qué ocurrirá con Managed DirectX (actualmente MDX 2.0 está en fase beta), o como se gestionarán las diferencias de dispositivos entre plataformas (p.ej. como se gestionarán ratones o teclados que son más propios de PC que de XBox).<br /><br />Os dejo algunos posts muy interesantes sobre XNA para que les vayais hechando un vistazo si os apetece.<br /><ul><br /><li>Para empezar un post donde <a href="http://blogs.msdn.com/al_msft/archive/2006/03/20/555065.aspx">Albert Ho habla de XNA Framework</a>. Resumiendolo muy por encima, comenta que MDX pasará a convertirse en el API gráfico de XNA y que DirectSound será reemplazado por XACT y DirectInput por XInput. Lo que no queda muy claro es como podremos gestionar dispositivos no compatibles con XInput desde XNA, p.ej.</li><br /><li>Una <a href="http://arstechnica.com/articles/culture/mattlee.ars/1">entrevista con Matt Lee</a>. Mucho, mucho no habla de XNA, si acaso cuatro cosillas sobre XNA Build (variación de MSBuild) y XNA Studio (un Visual Studio orientado a la creación de juegos). Pese a no hablar mucho de XNA es una entrevista bastante interesante.</li><br /><li>Un <a href="http://letskilldave.com/archive/2006/06/29/XNA-Framework-tidbits_2E002E002E00_.aspx">post de David Weller</a> donde se mencionan algunos de los puntos claves del XNA Framework. Interesante el último punto donde menciona que XNA Framework no admitirá referencias a System.Drawing o System.Windows.Forms. Veremos como impacta esto en el desarrollo de aplicaciones no full-screen en XNA.</li><br /></ul><br />En resumen, todavía hay muy poca información sobre XNA y es cierto que quedan muchas dudas en el tintero, pero la verdad es que las noticias que van apareciendo son muy interesantes ;-)eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1153290713363057942006-07-19T08:22:00.000+02:002006-07-19T08:31:53.370+02:00Un par de buenos tutoriales de MDXSi estais empezando a batallar com Managed DirectX, os recomiendo los siguientes tutoriales:<br /><ol><br /><li><a href="http://www.c-unit.com/tutorials/mdirectx/">Tutorial de Managed DirectX de C-Unit</a>. Tienen también un tutorial de DirectX no managed.</li><br /><li><a href="http://www.riemers.net/">Riemer's DirectX Tutorials for C# and C++</a>. La parte de C# es Managed DirectX, la parte de C++ es DirectX <span style="font-style:italic;">tradicional</span>.</li><br /></ol><br />Por otro lado en breve empezaré a publicar una serie de posts-tutoriales sobre Managed DirectX. No voy a contar nada que no esté ya publicado por esos mundos de dios, pero intentaré que sea un tutorial fácil de entender, orientado básicamente a programación 2D usando Direct3D y en castellano.eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1152733001176810682006-07-12T21:29:00.000+02:002006-07-12T21:39:37.476+02:00[OT] Sintaxis coloreada de VS.NET en bloggerJejejee... habéis visto el post justo anterior a éste?<br />Que os parece la sintaxis coloreada del código? ;)<br /><br />Algunos sistemas de blog (como p.ej. la <a href="http://blogs.clearscreen.com" target="_blank">comunidad clearscreen</a> tienen un sistema de coloreado automático de sintaxis (cosa lógica, pues son sistemas de blogs orientados al desarrollo de S/W), pero blogger no. Y hombre, colorear la sintaxis "a mano" es posible para trozos de código pequeños, pero puede ser un infierno para trozos de código más largos.<br /><br />Por eso he estado buscando algún sistema para pasar código coloreado de VS.NET a formato HTML, manteniendo los colores... y lo he encontrado <a href="http://www.jtleigh.com/people/colin/software/CopySourceAsHtml/">aquí</a>. Es un add-in para VS.NET 2005 que añade una opción en el menú contextual llamada <span style="font-style: italic;">Copy as HTML</span>. Además permite establecer bastantes parámetros para personalizar el HTML generado.<br /><br />O sea que, ahora ya podré colorear los trozos de código que vaya poniendo por ahí! ;)<br /><br /><span style="font-weight: bold;">PD:</span> Si usais blogger y este add-in, ojo si usáis el modo wysiwyg de blogger, ya que tiene la manía de sustituir los &nbsp; por un espacio en blanco... con lo que se pierden las indentaciones!eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1152732519230153902006-07-12T21:23:00.000+02:002006-07-12T21:28:39.246+02:00El bucle de juego definitivoEl bucle de juego (game loop) es una de las características más importantes de los juegos. Al revés de las aplicaciones de gestión, que estan guiadas por eventos, un juego generalmente tiene cosas que hacer (p.ej. animaciones) aunque el usuario no haga nada.<br />Un bucle de juego eficiente hará que el juego ocupe menos CPU y por lo tanto indirectamente, pueda generar más fps.<br /><br />En <a href="http://blogs.msdn.com/tmiller/archive/2005/05/05/415008.aspx">este post</a>, Tom Miller propone un bucle de juego muy interesante, tanto por su sencillez como por su eficiencia. Se basa en el uso del API Win32 <span style="font-style:italic;">PeekMessage()</span>.<br /><br />Basándome en este bucle de juego he creado una clase que simplemente lo encapsula. El código de la clase (a la que presuntuosamente he llamado GameEngine) es el siguiente:<br /><br /><div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"><p style="margin: 0px;"><span style="color: blue;">namespace</span> foo</p><p style="margin: 0px;">{</p><p style="margin: 0px;"> <span style="color: blue;">class</span> <span style="color: teal;">GameEngine</span></p><p style="margin: 0px;"> {</p><p style="margin: 0px;"> Form1 frm = <span style="color: blue;">new</span> Form1();</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: blue;">void</span> MainLoop()</p><p style="margin: 0px;"> {</p><p style="margin: 0px;"> System.Windows.Forms.<span style="color: teal;">Application</span>.Idle += <span style="color: blue;">new</span> <span style="color: teal;">EventHandler</span>(OnApplicationIdle);</p><p style="margin: 0px;"> frm.InitializeGraphics();</p><p style="margin: 0px;"> System.Windows.Forms.<span style="color: teal;">Application</span>.Run(frm);</p><p style="margin: 0px;"> }</p><p style="margin: 0px;"> </p><p style="margin: 0px;"> <span style="color: blue;">private</span> <span style="color: blue;">void</span> OnApplicationIdle(<span style="color: blue;">object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;"> {</p><p style="margin: 0px;"> <span style="color: blue;">while</span> (AppIddle)</p><p style="margin: 0px;"> {</p><p style="margin: 0px;"> <span style="color: green;">// Update Graphics</span></p><p style="margin: 0px;"> <span style="color: green;">// Render Graphics</span></p><p style="margin: 0px;"> }</p><p style="margin: 0px;"> }</p><p style="margin: 0px;"> </p><p style="margin: 0px;"> <span style="color: blue;">private</span> <span style="color: blue;">bool</span> AppIddle</p><p style="margin: 0px;"> {</p><p style="margin: 0px;"> <span style="color: blue;">get</span></p><p style="margin: 0px;"> {</p><p style="margin: 0px;"> <span style="color: teal;">NativeMethods</span>.<span style="color: teal;">Message</span> msg;</p><p style="margin: 0px;"> <span style="color: blue;">return</span> !<span style="color: teal;">NativeMethods</span>.PeekMessage(<span style="color: blue;">out</span> msg, <span style="color: teal;">IntPtr</span>.Zero, 0, 0, 0);</p><p style="margin: 0px;"> }</p><p style="margin: 0px;"> }</p><p style="margin: 0px;"> }</p><p style="margin: 0px;">}</p><p style="margin: 0px;"><span style="color: blue;">static</span> <span style="color: blue;">class</span> <span style="color: teal;">NativeMethods</span></p><p style="margin: 0px;">{</p><p style="margin: 0px;"> [<span style="color: teal;">StructLayout</span>(<span style="color: teal;">LayoutKind</span>.Sequential)]</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: blue;">struct</span> <span style="color: teal;">Message</span></p><p style="margin: 0px;"> {</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: teal;">IntPtr</span> hWnd;</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: teal;">IntPtr</span> msg;</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: teal;">IntPtr</span> wParam;</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: teal;">IntPtr</span> lParam;</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: blue;">uint</span> time;</p><p style="margin: 0px;"> <span style="color: blue;">public</span> System.Drawing.<span style="color: teal;">Point</span> p;</p><p style="margin: 0px;"> }</p><p style="margin: 0px;"> </p><p style="margin: 0px;"> [System.Security.<span style="color: teal;">SuppressUnmanagedCodeSecurity</span>]</p><p style="margin: 0px;"> [<span style="color: teal;">DllImport</span>(<span style="color: maroon;">"User32.dll"</span>, CharSet = <span style="color: teal;">CharSet</span>.Auto)]</p><p style="margin: 0px;"> <span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">bool</span> PeekMessage(<span style="color: blue;">out</span> <span style="color: teal;">Message</span> msg, <span style="color: teal;">IntPtr</span> hWnd, <span style="color: blue;">uint</span> messageFilterMin, <span style="color: blue;">uint</span> messageFilterMax, <span style="color: blue;">uint</span> flags);</p><p style="margin: 0px;">}</p></div><br /><br /><span style="font-weight:bold;">Nota:</span> Form1 es el nombre de la clase formulario principal.<br /><br />Usando esa clase la función Main() quedaría de la siguiente manera:<br /><br /><div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"><p style="margin: 0px;"> [<span style="color: teal;">STAThread</span>]</p><p style="margin: 0px;"> <span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()</p><p style="margin: 0px;"> { </p><p style="margin: 0px;"> <span style="color: green;">// Inicializaciones previas</span></p><p style="margin: 0px;"> GameEngine ge = <span style="color: blue;">new</span> GameEngine();</p><p style="margin: 0px;"> ge.MainLoop(); </p><p style="margin: 0px;"> <span style="color: green;">// Destrucciones finales</span></p><p style="margin: 0px;"> }</p><p style="margin: 0px;"> }</p></div><br /><br />Simple, sencillo... y eficaz!eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1152651748811901832006-07-11T22:58:00.000+02:002006-07-11T23:02:28.823+02:00Reiner's Tilesets - recursos gráficos freewareSi como muchos desarrolladores el tema gráfico no es lo vuestro ;) y buscais recursos gráficos para desarrollar vuestros juegos (2D) echad un vistazo a <a href="http://reinerstileset.4players.de/englisch.htm">Reiner's Tilesets</a>. Contiene varios gráficos freeware que podeis usar en vuestros desarrollos... Están orientados a juegos de estrategia o tipo Diablo, aunque hay un poco de todo... :-)<span style="font-family:Arial, Helvetica, sans-serif;font-size:-1;"><b><a href="http://www.reinerstileset.de/" target="_blank"></a></b></span>eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1152563404562330152006-07-10T22:27:00.000+02:002006-07-10T22:52:11.726+02:00ColorKey en texturas PCXEn el post anterior puse una posible manera de obtener texturas a partir de archivos PCX. Dado que se usa <span style="font-style: italic;">Texture.FromBitmap</span>, no se puede establecer el ColorKey de la textura, lo que invalida el método para crear Sprites (o lo complica demasiado, vamos).<br /><br />Los métodos que permiten establecer el ColorKey de una textura están en la clase <a href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_m/directx/ref/ns/microsoft.directx.direct3d/c/textureloader/textureloader.asp">TextureLoader </a>en los métodos <span style="font-style: italic;">FromStream</span> y <span style="font-style: italic;">FromFile</span> respectivamente.<br />Así que reescribí el código para cargar la texura usando TextureLoader. Teoricamente no debía ser muy complicado, pues en el MemoryStream tenía la información de la Textura en formato BMP que es uno de los soportados.<br />El código que probé era:<br /><br /><span style=";font-family:courier new;font-size:85%;" > public Texture TextureFromDIB(uint dib, Device device)<br /> {<br /> uint hmem;<br /> byte[] content;<br /> // open and allocate a memory stream<br /> hmem = FreeImage.OpenMemory(IntPtr.Zero, 0);<br /> bool b = FreeImage.SaveToMemory(FreeImageAPI.FIF.FIF_BMP, dib, hmem, 0);<br /> FreeImage.Unload(dib);<br /> IntPtr ptr = IntPtr.Zero;<br /> int size_in_bytes = 0; <br /> FreeImage.AcquireMemory(hmem, ref ptr, ref size_in_bytes);<br /> content = new byte[size_in_bytes];<br /> Marshal.Copy(ptr, content, 0, size_in_bytes);<br /> System.IO.MemoryStream ms = new System.IO.MemoryStream(content);<br /> Bitmap bmp = new Bitmap(ms, false);<br /> FreeImage.CloseMemory(hmem);<br /> ms.Seek(0, System.IO.SeekOrigin.Begin);<br /> Texture t = TextureLoader.FromStream(device, ms, 0, 0, 0, Usage.SoftwareProcessing, Format.P8, Pool.Managed, Filter.Point, Filter.Point, Color.Magenta.ToArgb());<br /> ms.Close();<br /> return t;<br /> }</span><br /><br />Al probarlo mi gozo en un pozo :(<br />El código me lanzaba una excepción Microsoft.DirectX.Direct3D.InvalidDataException (D3DXERR_INVALIDDATA).<br />Primero pensé que quizá FreeImage guardaba los datos en alguna variación de BMP que quizá no era soportada por TextureLoader, así que guardé el contenido del MemoryStream en un fichero y intenté cargar la textura usando el mismo método FromStream, pasándole un FileStream apuntando al fichero recién creado: funcionó.<br /><br />Al final pude dar con el problema: faltaba posicionar el puntero de lectura del MemoryStream al inicio de los datos:<br /><br /><span style=";font-family:courier new;font-size:85%;">FreeImage.CloseMemory(hmem);<br /><strong>ms.Seek( 0, System.IO.SeekOrigin.Begin );</strong><br />Texture t = TextureLoader.FromStream(device, ms, ...);</span><br /><span style="font-size:100%;">Llamando a <span style="font-style: italic;">Seek</span> justo antes de la llamada a FromStream funcionó todo perfectamente! ;)</span>eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1152354098656692802006-07-08T11:49:00.000+02:002006-07-09T20:45:48.966+02:00Texturas a partir de archivos PCXPara el proyecto que estoy desarrollando me intersaba dar soporte a archivos PCX: es decir crear texturas a partir de archivos PCX.<br /><br />La clase <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_m/directx/ref/ns/microsoft.directx.direct3d/c/textureloader/textureloader.asp">TextureLoader</a> permite cargar una textura a partir de un archivo gráfico, da soporte a varios formatos (entre ellos .bmp, .jpg y .png como más destacados) pero no da soporte a arhivos PCX.<br />Así pues intenté ver como podía cargar un archivo PCX y crear una textura Direct3D a partir de él.<br />Para ello el primer paso fue encontrar alguna librería para leer archivos PCX. Estuve buscando por google a ver si encontraba alguna librería .NET (gratuita) para leer este tipo de archivos. No encontré ninguna pero vi que <a href="http://freeimage.sourceforge.net">FreeImage</a> tenia un wrapper de C#, así que me decidí utilizarla. Ya había usado FreeImage en proyectos anteriores (con DirectDraw y C++) y me había gustado así que me pareció una buena idea.<br /><br />La clase <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_m/directx/ref/ns/microsoft.directx.direct3d/c/texture/texture.asp">Texture</a> tiene un método llamado <span style="font-style: italic;">fromBitmap</span>, que a partir de un objeto System.Drawing.Bitmap crea el objeto Textura correspondiente. Así que en resumen se trataba de obtener un Bitmap a partir de FreeImage.<br /><br />FreeImage és una librería que trabaja con varios formatos gráficos, pero internamente los convierte todos al formato DIB (Device Independent Bitmap).<br /><br />El primer paso era cargar la imagen con FreeImage:<br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">uint handle = FreeImage.Load(FIF.FIF_PCX, System.Windows.Forms.Application.StartupPath + @"\..\..\texture.pcx", 0);<br /></span></span><br />Para pasar la imagen del formato DIB interno de FreeImage al formato Bitmap de .NET se me ocurrió utilizar las funciones de memoria de la propia FreeImage. En concreto lo que quería hacer era:<br /><ol><li>Guardar la imagen en un bloque de memoria en formato Bitmap<br /></li><li>Copiar la información en un array de bytes</li><li>Crear un objeto Bitmap inicializado con los datos del array de bytes.</li></ol>El primer problema que me encontré era que el wrapper de C# para FreeImage <span style="font-weight: bold;">estaba incompleto</span>: Las funciones de manejo de memoria de FreeImage no aparecían en el wrapper. Por suerte el wrapper no es nada más que un pequeño archivo .cs con las definiciones de P/Invoke de las funciones de FreeImage, así que pude añadir las definiciones que me faltaban:<br /><span style="font-size:85%;"><span style="font-family:courier new;"></span><span style="font-family:courier new;"></span><span style="font-family:courier new;"><br />[DllImport(dllName, EntryPoint = "FreeImage_OpenMemory")]</span><span style="font-family:courier new;"><br />public static extern FIMEMORY OpenMemory(IntPtr bits, Int32 size_in_bytes);</span><span style="font-family:courier new;"><br />[DllImport(dllName, EntryPoint = "FreeImage_CloseMemory")]</span><span style="font-family:courier new;"><br />public static extern void CloseMemory(FIMEMORY stream);</span><span style="font-family:courier new;"></span><span style="font-family:courier new;"><br />[DllImport(dllName, EntryPoint = "FreeImage_SaveToMemory")]</span><span style="font-family:courier new;"><br />public static extern bool SaveToMemory(FIF fif, FIBITMAP dib, FIMEMORY stream, int flags);</span><span style="font-family:courier new;"></span><span style="font-family:courier new;"><br />[DllImport(dllName, EntryPoint = "FreeImage_AcquireMemory")]</span><span style="font-family:courier new;"><br />public static extern long AcquireMemory(FIMEMORY stream, ref IntPtr data, ref int size_in_bytes);</span></span><br /><br />Una vez añadido esto en el wrapper (y recompilarlo) usé el siguiente código para obtener un objeto System.Drawing.Bitmap:<br /><br /><span style=";font-family:courier new;font-size:85%;" >uint hmem;<br />int w, h, stride;<br />byte[] content;<br />// Obtenemos un buffer de memoria de FreeImage<br />hmem = FreeImage.OpenMemory(IntPtr.Zero, 0);<br />// Grabamos la imagen en el buffer de memoria en formato BMP<br />bool b = FreeImage.SaveToMemory(FreeImageAPI.FIF.FIF_BMP, dib, hmem, 0);<br />FreeImage.Unload(dib);<br />// Obtenemos un puntero (unmanaged) al buffer de memoria de FreeImage<br />IntPtr ptr = IntPtr.Zero;<br />int size_in_bytes = 0;<br />FreeImage.AcquireMemory(hmem, ref ptr, ref size_in_bytes);<br />content = new byte[size_in_bytes];<br />// Copiamos el contenido del buffer de memoria unmanaged a un byte[]<br />Marshal.Copy(ptr, content, 0, size_in_bytes);<br />// Creamos un MemoryStream que apunte al contenido copiado y creamos el Bitmap<br />System.IO.MemoryStream ms = new System.IO.MemoryStream(content);<br />Bitmap bmp = new Bitmap(ms, false);<br />// Cerramos el buffer de memoria de FreeImage (para evitar memory-leaks)<br />FreeImage.CloseMemory(hmem);<br />ms.Close();<br />// Listos.<br />return bmp;</span><br /><br />En este punto el Bitmap está creado, así que ya sólo queda usar el método <span style="font-style: italic;">fromBitmap</span> de la clase Texture y ya tenemos una textura Direct3D lista para usar.<br /><br />En mi caso para hacer una prueba rápida cogí el Tutorial #5 de Direct3d (muestra un cilindro texturizado) y lo ejecuté dos veces: una con una textura PCX y otra con un archivo BMP convertido (usé <a href="http://www.irfanview.com/">Irfanview</a>) a partir del PCX , y comprobé que en ambos casos el resultado era el mismo.<br /><br /><span style="font-weight: bold;">Nota:</span> Aparte del wrapper "oficial" de FreeImage, que se encuentra en su página oficial, encontré otro wrapper que incluía las definiciones de P/Invoke de todas las funciones de FreeImage que le faltan al wrapper "oficial" además de ofrecer algunas funciones helper adicionales. Este wrapper está en <a href="http://hauntedhousesoftware.com/blog/Files/FreeImage.cs">http://hauntedhousesoftware.com/blog/Files/FreeImage.cs</a><br /><span style="font-size:85%;"><span style="font-family:courier new;"><span style="font-weight: bold;"><br /></span></span></span>eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0tag:blogger.com,1999:blog-30691701.post-1152115459247724302006-07-05T17:58:00.000+02:002006-07-05T18:04:19.250+02:00El comienzo de todo...Hola a todos!<br />Al final me he decidido a crear este blog, donde voy a comentar mis experiencias, frustraciones, alegrías y demás sobre Managed DirectX.<br /><br />Antes que nada... ¿quien soy yo? Pues me llamo Eduard Tomàs, edu para los amigos, y en la actualidad trabajo como director de proyectos para <a href="http://www.raona.com">raona</a>. Pero este blog no tiene nada que ver con temas profesionales, si no con uno de mis hobbies: el desarrollo de videojuegos, y más concretamente usando Managed DirectX.<br /><br />Pues nada... espero que nos sigamos leyendo por ahí ;-)eiximenishttp://www.blogger.com/profile/02568454383791432108noreply@blogger.com0