tag:blogger.com,1999:blog-311523502024-03-07T02:02:43.496-06:00hoper journalcarloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.comBlogger28125tag:blogger.com,1999:blog-31152350.post-83547458118093046362010-11-13T00:56:00.000-06:002010-11-13T00:56:59.039-06:00Diseño de videojueos<embed allowfullscreen="true" allowscriptaccess="always" bgcolor="#000000" flashvars="config=http://www.themis-media.com/videos/config/2443-b3ea814fac5f5bca85bb398adfacd83d.js%3Fplayer_version%3D2.5%26embed%3D1" height="271" pluginspage="http://www.adobe.com/go/getflashplayer" quality="high" src="http://cdn2.themis-media.com/media/global/movies/player/flowplayer.commercial-3.2.5.swf" type="application/x-shockwave-flash" width="450" wmode="opaque"></embed><br />
<br />
<br />
<br />
Este es un exelente ejemplo no sólo de<b> game design</b>, sino que también ejemplifica lo que se necesita para ser un buen <b>project manager</b>, muchas de estas habilidades son despreciadas por la parte técnica de un equipo de desarrollo, y esto hace que no siempre se cumplan los objetivos del software.carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-55023168339051633752010-11-08T01:54:00.000-06:002010-11-08T01:54:46.462-06:00Tetris vs ContraEste son el tipo de videos buenazos que hay que compartir :P<br />
<br />
<object height="385" width="480"><param name="movie" value="http://www.youtube.com/v/n-Ywxox2kvM?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/n-Ywxox2kvM?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-32369638265197892732010-10-15T16:44:00.000-05:002010-10-15T16:44:07.548-05:00SugarBlast!Me di a la tarea de probar <b>XNA 4</b> para <b>Windows Phone Series 7</b>, después de jugar un rato con él me gustaría compartir mis observaciones:<br />
<br />
<b>Fácil</b>: Programar para <b>WP7 </b>es practicamente igual que porgamar un juego para PC, y el rendimiento que tiene en el simulador es bastante bueno, las caractarísitas de un juego de computadora están ahí, y los equipos que hay hasta el momento permiten tener juegos de calidad.<br />
<br />
Además, los desarrolladores no tenemos que aprender a programar en un tecnología nueva, puesto que es <b>C#</b> y de IDE podemos utilizar <b>Visual Studio</b>.<br />
<br />
<b>Portabilidad</b>: Lo anterior significa que podemos hacer juegos tanto para PC, Xbox Live, Zune y WP7 con modificaciones muy pequeñas (al algunas ocasiones sólo basta recompilar).<br />
<br />
Incluso, no me extrañaria que muchos de los juegos actuales puedan liberar versiones disponibles para WP7. :D<br />
<br />
<b>Calidad</b>: Al final, WP7 va a tener juegos de gran calidad, corriendo en equipos que pueden adaptarse a las necesidades de cada usuario.<br />
<br />
Les dejo un video del primer juego que hice para esta plataforma:<br />
<br />
<object height="278" width="450"><param name="movie" value="http://www.youtube.com/v/NC1UPYmYJiU?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NC1UPYmYJiU?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="278"></embed></object>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-87924043716319971932010-10-14T13:21:00.001-05:002010-10-14T13:24:17.214-05:00Taxi que no necesita conductorLa Universidad Libre de Berlín esta trabajando en un modelo de un taxi que puede ser manejado a control remoto por medio de un <b>iPad</b>.<br />
<br />
<br />
Las importancia que tienen los dispositivos móviles cada vez son más evidentes, todos los días vemos proyectos interesantes que se han logrado gracias a ellos, y estos cada vez se integran más a nuestra vida diaria, permitiendonos realizar tareas.<br />
<br />
<object width="450" height="278"><param name="movie" value="http://www.youtube.com/v/Kyk1VLTSH_U?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Kyk1VLTSH_U?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="278"></embed></object><br />
<br />
En el video se puede apreciar la aproximación que tienen al sistema de navegación, el cuál se me hace muy interesante, y creo que se puede trabajar en roconocimiento de patrones para mejorar la seguridad del vehículo sin necesidad de hacer un cambio de tecnolgía que resulte muy significativo.<br />
<br />
<br />
A la larga, un sistema de transporte público autónomo puede ser más seguro y eficiente que uno conducido por humanos... creo que esperamos un sistema así en la ciudad. :P<br />
<br />
<object width="450" height="278"><param name="movie" value="http://www.youtube.com/v/TSv2ca-IECc?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/TSv2ca-IECc?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="278"></embed></object><br />
<br />
<br />
De alguna manera, este proyecto me recurra al "drone" que puede ser controlado con el <b>iPhone</b>, en el que me gustaría destacar la forma en la que maneja la <b>realidad aumentada</b> para simular batallas.<br />
<br />
Vía: <a href="http://alt1040.com/2010/10/la-universidad-alemana-de-freie-crea-un-taxi-sin-conductor">alt1040</a>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-37543796921423480932010-10-14T00:46:00.002-05:002010-10-14T05:04:42.236-05:00De nuevo en líneaDespués de un rato sin actualizar mi blog he decidido retomarlo, y para hacerlo bien, hice unas modificaciones a la plantilla que estaba utilizando, espero que ahora sea más amigable y fácil para navegar.<br />
<br />
También modifiqué la sección de comentarios, ahora utilizaré Disqus, para darle un toque más 2.0 y facilitar el uso,<strike> lo malo es que gracias a eso los comentarios anteriores no se muestran, y además para hacer un bug puesto que blogger son contabiliza en la página principal</strike> :(<br />
<br />
Edit: Después de googlear un rato, encontré la manera de importar los comentarios anteriores y mostrar el contador en la página principal. :)carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-40628196004803407842009-08-19T22:31:00.000-05:002009-08-19T22:31:50.063-05:00Nuevo nanoláser permitiría CPU de 100 THz<a href="http://www.neoteo.com/nuevo-nanolaser-permitiria-cpu-de-100-thz.neo">Nuevo nanoláser permitiría CPU de 100 THz</a>: "Un equipo de científicos de la <em>Cornell University</em> y la <em>Purdue University</em> ha puesto a punto un dispositivo capaz de generar luz láser que utiliza <strong>plasmones</strong> en lugar de fotones. Esta partícula, de sólo 44 nanómetros de longitud, ha posibilitado la creación del láser que abre las puertas para la fabricación de microprocesadores capaces de funcionar a 100 THz, unas 20.000 veces más rápido que los actuales. Sin dudas, éste es uno de los avances más importantes de los últimos tiempos."<br /><br />Artículo interesante, les recomiendo leer la nota completa.carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-1610453167533980262009-07-31T05:12:00.000-05:002009-07-31T05:12:46.435-05:00Mobilin<blockquote>Moblin is an open source project focused on building a Linux-based platform optimized for the next generation of mobile devices including Netbooks, Mobile Internet Devices, and In-vehicle infotainment systems.</blockquote><br /><a href="http://moblin.org/">moblin.org</a><br /><br /><br />Este es un proyecto muy interesante acerca de una plataforma para dispositivos móviles, hace algún tiempo que vi el UbuntuNetbook Remix e inluso una distro de Acer, pero para ser sincero, este me suena mucho más interesante.<br /><br /><br /><img src="http://moblin.org/sites/all/files/imagecache/image_thumb_medium/u4/myzone.jpg" preset="4" class="nofloat" alt="Moblin v2.0 Netbook Beta" /><br /><br /><br />Hasta ahora sólo he visto screenshots, pero estoy descargando la imagen para probarla.carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-74500837566830459062009-07-16T23:51:00.004-05:002009-07-16T23:58:40.516-05:00Atari Street Fighter II<blockquote>Geek Out of the Day: RISD student Dylan Hayes stripped Street Fighter II down to its most basic graphic elements to show what it might have looked like running on an Atari 2600.</blockquote><br /><br />Y pensando en la gráficas de hoy, seria interesante ver un juego de última generación reducido para que funcione en algún hardware antiguo, me imagino un quake3 en algun procesador de 8 bits, por ejemplo... sinceramente lo veo posible dado a la estructura de los árboles bsp, seria cuestión de reducir el número de poligonos cambiando todos los modelos por sprites, quitar texturas, shaders, en fin... seria curioso verlo...<br /><br /><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4504861&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=4504861&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><p><a href="http://vimeo.com/4504861">Block Tests 01</a> from <a href="http://vimeo.com/dylanhayes">Dylan Hayes</a> on <a href="http://vimeo.com">Vimeo</a>.</p><br /><br /><a href="http://livercake.tumblr.com/post/112465653/se-pas-street-fighter-2-como-se-habr-a-visto">Vía...</a>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com2tag:blogger.com,1999:blog-31152350.post-91860406985928068212009-07-14T20:40:00.002-05:002009-07-14T20:53:21.865-05:00Freescale FTFEl día de hoy comienza el <a href="http://www.freescale.com/vftf ">Foro Virtual de Tecnología de Freescale</a>, el cúal es un evento gratuito que se puede seguir via internet.<br /><br />A lo Largo de este evento puedes encontrar conferencias y recursos (Aproximadamente 150 horas de entrenamiento virtual!!) y la posibilidad de interactuar con expertos en los diversos temas que se trataran.<br /><br />Personalmente este evento se me hace interesante por la forma en la que se desarrolla: virtualmente; con lo que eliminas los costos del viaje y las entradas a la exposición, es algo que no he visto en algún otro evento.<br /><br />También quisiera compartir el proyecto que han realizado algunos compañeros de la universidad, que consta de un avión de radio control que utiliza energía solar, dicho proyecto se encuentra participando en el evento.<br /><br /><object width="320" height="265"><param name="movie" value="http://www.youtube.com/v/4g978Se7hUk&hl=en&fs=1&rel=0&color1=0x234900&color2=0x4e9e00"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/4g978Se7hUk&hl=en&fs=1&rel=0&color1=0x234900&color2=0x4e9e00" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"></embed></object><br /><br />En esta dirección encontraras los detalles de como votar por ellos: <a href="http://www.wajo.com.mx/">http://www.wajo.com.mx/</a>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-45093074885111991022009-07-13T18:56:00.003-05:002009-07-13T19:01:43.876-05:00Intel StarAquí les dejo el comercial de intel que por fin comienza a hacer justicia a los inges :P<br /><br /><object width="480" height="295"><param name="movie" value="http://www.youtube.com/v/jqLPHrCQr2I&hl=en&fs=1&color1=0x234900&color2=0x4e9e00"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/jqLPHrCQr2I&hl=en&fs=1&color1=0x234900&color2=0x4e9e00" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"></embed></object><br /><br /><br />En realidad ¿cuantos nombres de personas dedicadas a revolucionar el mundo conocemos?, cuando hablamos de personas que han hecho nuestra vida más fácil y pasan siendo ánonimos la lista es muy grande.carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-91367674608808840122009-02-10T18:38:00.004-06:002009-02-10T18:48:31.046-06:00Macrobús ZMGUju, transporte público :)<br /><br />Algo de lo que siempre me he quejado y quejado de la zona metropolitana de Guadalajara es la dificultad de utilizar el vomiatroz servicio de transporte público, tengo varios años utilizándolo y aún no tengo idea de cómo llegar a la mayor parte de los puntos de la ciudad (por cierto en internet esta los mapas de la mayoría de las rutas, pero es horripilante y tedioso buscar ruta por ruta).<br /><br />Pero en un par de semanas esto está por cambiar, mucho se ha hablado del macrobús, y como estoy encantado también hablare de él.<br /><br />El macrobús es un BRT, o autobús de transito rápido por sus siglas en ingles que como bien lo han descrito muchas personas tiene forma de chorizo, esto gracias a que cuenta con dos vagones que lo convierten en un medio de transporte masivo (se espera que sea de 170,000 personas al día).<br /><br />El macrobús tiene como característica que cuenta con carriles propios, los cuales son para su uso exclusivo (aunque lo pueden utilizar vehículos de emergencia).<br />Este servicio comenzará a funcionar a finales de este mes, y este año estarán construyendo otros dos… en total se prevé que sean 10 líneas, aunque bueno, aquí hay algo que también es interesante, para ninguna de las 7 líneas restantes se ha hecho el plan ejecutivo, solo la planeación de las rutas de acuerdo con el plan de desarrollo y de movilidad en la zona, por lo tanto esas rutas las pueden cubrir más BRT’s, un tranvía, una línea del tren ligero, un metro, o quien sabe hasta una ruta de lanchas o helicópteros, incluso este plan de corredores es muy parecido (o prácticamente el mismo) que tenia originalmente el tren ligero de Guadalajara, donde vemos que la extensión a la línea 2 es el Pretren (que para un mi particular punto de vista muy mío de mi) es uno de los mejores servicios de trasporte en la ciudad.<br />Es especialmente grato ver que al menos las dos líneas que siguen tienen contemplado 2 puntos que eran una mentada de madre, el aeropuerto y la central camionera… pff es de las pocas ciudades en las que he estado en la que moverte de un punto de entrada al centro es carísimo.<br /><br />También cabe señalar que esta planeado un tren subregional, ósea un tren que circule dentro de la zona metropolitana, y que a pesar de que tenga estaciones intermedias no sea cada dos cuadras como un metro, incluso ya se está desarrollando el primer plan ejecutivo para la ruta Tlajomulco – Guadalajara… ok ok, aquí hay varios puntos importantes, Tlajomulco es un municipio grandísimo, y aunque para la mayoría de los tapatíos es un pueblo un tren supondría un desarrollo para esa región, honestamente a mí se me hace muy complicado ir a Tlajomulco, y eso que vivo cerca, pero con un tren que no haga más de 15 o 20 minutos las cosas pueden cambiar, la buena noticia es que se prevé que este tren esté listo en un par de años más. :)<br /><br />Otro avance importante de todo esto es que en la zona metropolitana se le está “quitando” espacio a los vehículos para darle prioridad a los peatones y los ciclistas, parece que aún las personas tenemos una mentalidad de que el auto es primero, pero si tomamos en cuenta que diariamente entran 300 vehículos a la ciudad… Una excelente opción es habilitar más zonas peatonales, como se está haciendo en la Minerva y Chapultepec (por cierto ambas son muy muy turísticas, y en ambas la gente la hace de pedo) y más zonas para ciclistas, ya van los primeros 16 kilómetros :D, y es que quien use una bici se da cuenta al riesgo que se expone en usar una calle (solo piensen en los camioneros) y lo difícil que es de ir sobre la banqueta.<br /><br />En conclusión: Pretren + tren ligero + macrobús + líneas alimentadoras + ciclovias = mejor movilidad + tiempo libre + seguridad – contaminación – accidentes<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj4h08KBPPuGzoayiEcKj4EKTLOUKdlUQu7dl3kyeS-8kj_V90486SPyapu6wCojygrIqjnAOrOI4rwK6jGP_bxPhGVGMSiWWQDHS-zxoZl_kTbNKSUlZ3x8CgP7lZTmVVEPpwXw/s1600-h/rutas3.jpg"><img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer; width: 248px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj4h08KBPPuGzoayiEcKj4EKTLOUKdlUQu7dl3kyeS-8kj_V90486SPyapu6wCojygrIqjnAOrOI4rwK6jGP_bxPhGVGMSiWWQDHS-zxoZl_kTbNKSUlZ3x8CgP7lZTmVVEPpwXw/s320/rutas3.jpg" alt="" id="BLOGGER_PHOTO_ID_5301333592376038162" border="0" /></a>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com5tag:blogger.com,1999:blog-31152350.post-56301202396305649192008-10-28T17:35:00.003-06:002008-10-28T17:43:26.024-06:00PhotosynthDesde hace algún tiempo me he puesto a seguirle los pasos a Photosynth, este tipo de proyectos se me hacen super interesantes y desde luego muy complicados...<br /><br />Imaginen las posibilidades de crear albumes fotográficos así, que podemos subir fotos nuestro facebook (por mencionar alguno), que el server cataloge nuestas fotos y las agregue a un albúm temático donde podamos visualizarlas de una manera nueva, como por ejemplo este tipo de paseo 3D.<br /><br />Les dejo un synth que hice sobre el lugar donde trabajo. (nesecitan instalarse el plugin para verlo, haganlo se los recomiendo :D)<br /><br /><iframe src="http://photosynth.net/embed.aspx?cid=26A4035D-30CA-4967-81C6-826A1EBD6021" width="400" frameborder="0" height="300"></iframe><br /><br /><br />En la página de <a href="http://photosynth.net/">Photosynth</a> pueden encontrar lugares más famosos que me oficina, por ejemplo el vaticano :Pcarloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com1tag:blogger.com,1999:blog-31152350.post-2927123570990588862008-10-14T16:48:00.002-05:002008-10-14T16:59:36.842-05:00Influencias videogamicasEn estos días me metido en el misterioso mundo del Game Design, el arte de hacer un juego divertido, de planear y saber que es lo que quieres hacer para que la gente se quede traumada, así que uno de mis ejercicios es comenzar por definir mis influencias, cuales son los juegos que más me han impactado y por que, bueno si me quedara en una isla decierta llena de mujeres seguramente aparte de cerveza me gustaría tener estos títulos:<br /><br /><br /><span style="font-weight: bold;">Syphon Filter</span><br /> Ofrece una camara exelente en tercera persona, la posibilidad de apuntar con el arma, gran variedad de niveles y armas, la historia es buena, tienes que explorar practicamente todo el nivel y encontrar puntos ocultos.<br /><br /><span style="font-weight: bold;">Tony Hawk's 2</span><br /> El replay value es maravilloso, hay un buen de trucos por aprender, la curva de aprendizaje esta muy bien manejada, el modo multiplayer es genial, tienes muchisimas "gaps" por descubrir.<br /><br /><span style="font-weight: bold;">Starcraft</span><br /> El modo multiplayer es perfecto, el que puedas crear tus escenarios, tengo mas de 6 años jugandolo y no me enfado, TOWER DEFENSE!! la tecnología manejada en aquella época y el juego que lograró hacer...<br /><br /><span style="font-weight: bold;">Final Fantasy 9</span><br /> Tiene una historia envolvente metida en un mundo de fantasia, hay mucho mucho mucho que explorar, las gráficas son geniales, el modo de juego por turnos es divertido e intuitivo.<br /><br /><span style="font-weight: bold;">Silent Hill</span><br /> Acción, terror, una historia que no sabes ni que rollo, el ambiente con poca iluminación, mucha bruma y colores pobres le da un aspecto único.<br /><br /><span style="font-weight: bold;">Resident Evil 2</span><br /> Acción, armas, historia, puzzles.<br /><br /><span style="font-weight: bold;">Wip3out</span><br /> Este juego es el resultado de mezclar la velocidad con la acción, me gusta el ambiente futurista, como manejan las gráficas y la música.<br /><br /><span style="font-weight: bold;">Crash Bandicoot 2</span><br /> Tiene uno de los mejores controles que he visto en videojuego, a pesar de ser de plataforma se puede complicar mucho, hay muchas gemas secretas que sacan de onda.<br /><br /><span style="font-weight: bold;">Cristalys</span><br /> Este pequeño RPG fue divertidismo durante mi infancia, a pesar de que para aquel entonces era un /n00b tenia una jugabilidad donde cualquier persona se podia sumergir, otro aspecto fue el sistema de batallas en tiempo real, algo que me gusta de los RPG.<br /><br /><span style="font-weight: bold;">Quake 3</span><br /> Corre, dispara, asesina, se asesinado, revive, repite... este juego es brutalmente adicitvo, su gameplay es muy sencillo y esta soportado por muchos mods.<br /><br /><span style="font-weight: bold;">Counter Strike</span><br /> La gran diferencia entre quake3 y counter strike es que aquí la estrategia y el trabajo en equipo son importantes.<br /><br /><span style="font-weight: bold;">Golden Eye</span><br /> Otro de dispraros tipo quake, solo que aquí tienes que utilizar un poco más el cerebro y cumplir ciertos objetivos, los tipo de juego en multiplayer son bastante buenos.<br /><br /><span style="font-weight: bold;">Rainbow Six</span><br /> Muchisima más estrategia y realismo que counter strike, la historia es genial, la forma en que planeas las misinoes y haces cambios entre tu equipo, el modo multiplayer :D<br /><br /><span style="font-weight: bold;">Warcraft</span><br /> Básicamente el mero mole son los mods, llamemosle DOTA y Tower Defense :P<br /><br /><span style="font-weight: bold;">Sonic Adventure 2</span><br /> En este juego de plataforma la velocidad es un elemento fundamental, algunas veces no tengo idea de como corro, simplemente no puedo dejar de hacerlo, buen replay value, mini juegos, modo multiplayer, el chaos garden...<br /><br /><br /><br />bueno, aparte un twister, un billar y una baraja para acompañar esa cervezita y esas mujeres no caeria nada mal.......carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com1tag:blogger.com,1999:blog-31152350.post-15852491672173139372008-09-25T16:29:00.002-05:002008-09-25T16:45:49.821-05:00Muere el Hijo del PapáAl igual que la muerte del bien querido Valentin Elizalde nuestro amigo hijo del presi de la CANACA ha muerto y con el miles de ilisiones en nuestros niños mexicanos :(<br /><br /><a href="http://www.dk1250.com/local/2650.html">http://www.dk1250.com/local/2650.html</a><br /><br /><br />Ahora quien servirá de mal ejemplo para esos chamacos ebrios entrados e la pubertad, sinceramente yo esperaba tener otro par de videos del él.<br /><br />Otro hecho inedito en el país es el accidente ocacionado por un elefante en plena autopista, no mms!! puros pinches accidentes :(<br /><br /><a href="http://www.cronica.com.mx/nota.php?id_nota=386781">http://www.cronica.com.mx/nota.php?id_nota=386781</a><br /><br /><br />Don canacas no muere, vive en nuestro corazones.<br /><br />No pongo el link del video porque a menos de que hayan vivido en una alcantarilla los últimos meses ya lo deben de haber visto.<br /><br />La próxima vez que piensen manejar borrachos recuerden que pueden ser amarrados como puercos y perder 50,000 pesos en el acto.carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com2tag:blogger.com,1999:blog-31152350.post-64890484779936498622008-09-19T03:48:00.003-05:002008-09-19T04:07:58.286-05:00Problem with my pong gameHey!! can you help me to fix this code, I get some flicker :S<br /><br /><br /><textarea name="code" class="cpp"><br />#include <cstdlib><br />#include <windows.h><br />#define _s_l33x(_3Ep0x033) Sl##_3Ep0x033<br />void __OxO___(short x0, short Ox){ COORD <br />__0x12o={x0,Ox};SetConsoleCursorPosition<br />(GetStdHandle((DWORD)-0x000b),__0x12o);}<br />#include <iostream><br />void main(){{}short _________,_____=0x00013,____, __0x001__, __0x00l__;<br />_________=____=__0x001__=__0x00l__=0x01;_________ +=0x09;int __0x0__=0;<br />while(true){std::system("CLS");for(int i=0x00;i<39;std::cout<<"_",i++);<br />for(short x0=0x0;x0<24;__OxO___(0x0,x0),std::cout<<"|",__OxO___(39,x0),<br />std::cout<<"|",x0++);{{{{_____ += __0x001__;}}{{____ += __0x00l__;}}}}<br />(_____>37 )||(_____< 0x2)?__0x001__*=-1:void(0x0);(____ <0x2)?__0x00l__ <br />*=-1:(____ >22)&&(_____<(_________+0x007))&&(_____>_________)?__0x00l__<br />*=-1,__0x0__++:____>23?__0x0__=0x000,____=1:void(0x0);int _i_(0x12345);<br />__OxO___(_____,____);std::cout<<"O";{{++(++_i_);}};{{{;}}{{}}};(_i_++);<br />__OxO___(_________,23);std::cout<<"HHHHHHH";{__OxO___(44,4);std::cout<<<br />"Score: "<<__0x0__;}::GetAsyncKeyState(0x25)&&_________>0x1?_________-=<br />0x1:__noop;::GetAsyncKeyState(0x27)&&_________<32?_________+=0x1 :true;<br />{{{::_s_l33x(eep)(100);}}};0x001?true:false;_i_--; } 0x34; return ;{;}}<br /></textarea><br /><br />LOL!!, I hate the "hello, world" introduce code, so when I like to lear a new lenguaje I always try to make a pong (I think you get noticed on my previous post :P), this time I just obsfuscate a c++ pong...<br /><br />And here is a link to one of my favorite one's:<br /><br /><a href="http://www.aerojockey.com/software/ioccc/index.html">http://www.aerojockey.com/software/ioccc/index.html</a>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-45526384614088544812008-09-15T10:52:00.000-05:002008-09-14T08:02:57.360-05:00VHDL Pong<p class="MsoNormal"><span lang="ES-MX">En algunas <span id="SPELLING_ERROR_0">ocasiones</span> cuando uno no tiene nada que hacer se le ocurre cada cosa, como por ejemplo construir tu propia consola de videojuegos. <!--[if !supportLineBreakNewLine]--> <!--[endif]--></span></p> <p class="MsoNormal"><span lang="ES-MX">Tiempo: 1 hora</span></p> <p class="MsoNormal"><span lang="ES-MX">Costo: $30 – $150 US Dlls</span></p> <p class="MsoNormal"><span lang="ES-MX">Dificultad: Fácil</span></p><br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1puINk2wHZiFdr_0ExqvDmSqxxMO58X5rLetsAja-W2K_wo3kwB1ZB_3kB4DDvgoErDp9FdzZKH5M/fig1-cyclone2-staterkit.jpg" alt="" border="0" /><br /><br /><br /><p class="MsoNormal"><span lang="ES-MX"> El primer paso es crear un pequeño juego en VHDL, así podemos entender (o aparentar que entendemos) las entradas de usuario, la lógica del juego y enviar los datos a un monitor VGA.</span></p> <p class="MsoNormal"><span lang="ES-MX">Básicamente el pipeline de lo que haremos será el siguiente:</span></p><br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1pp0m6srWYA_SfttDDMpp09l6yTytClLMMWQaCZwcxA28IIBcjM563YcI58HrDXBBoxQ1FAKuHt1I/pong_testpipeline.png" /><br /><br /><p class="MsoNormal"><span lang="ES-MX">En un post anterior explique como es la lógica del pong, y es la misma que implemento en VHDL.</span></p> <p class="MsoNormal"><span lang="ES-MX">Aquí lo más complejo es poder utilizar el puerto VGA, para esto necesitamos preocuparnos por los 5 pines, uno para cada componente de color en formato RGB, una para saber la posición vertical y horizontal en la que estamos trabajando.</span></p> <p class="MsoNormal"><span lang="ES-MX">Si ya hasta trabajado con Pixel Shaders la teoría te resultara familiar, prácticamente cada ciclo vamos a recorrer un pixel en la pantalla comenzando por la parte superior izquierda, en este punto especifico podemos modificar el color, si es un pixel shader!!! </span></p> <p class="MsoNormal"><span lang="ES-MX">Entonces para lograr esto debemos de sincronizarnos con el monitor, para esto vamos a lanzar nuestros primeros 640 colores para la primera línea con los pines para la sincronía horizontal y vertical con valor de 1, entonces vamos a avisarle al señor don monitor que baje una línea simplemente mandando un valor de 0 al pin de sincronización horizontal, y así nos la llevamos con cada línea hasta que tengamos que hacer lo propio con las 480 líneas verticales, entonces le aplicamos la misma al pin vertical y habremos concluido de dibujar nuestra pantalla así que comenzamos de nuevo. (Y es obvio que debemos de hacer lo mismo ya que el monitor no guarda ningún dato)</span></p> <p class="MsoNormal"><span lang="ES-MX">Una vez dicho esto creo que podemos pasar al código. :)</span></p><br /><br /><textarea name="code" class="pascal" width=90% rows="30"><br /><br />library IEEE;<br />use IEEE.STD_LOGIC_1164.ALL;<br />use IEEE.STD_LOGIC_ARITH.ALL;<br />use IEEE.STD_LOGIC_UNSIGNED.ALL;<br /><br />entity test3 is<br /> port(clk50_in : in std_logic;<br /> red_out : out std_logic;<br /> green_out : out std_logic;<br /> blue_out : out std_logic;<br /> hs_out : out std_logic;<br /> vs_out : out std_logic;<br /> key_0 : in std_logic;<br /> key_1 : in std_logic;<br /> key_2 : in std_logic;<br /> key_3 : in std_logic);<br />end test3;<br /><br />architecture Behavioral of test3 is<br /><br />signal clk25 : std_logic;<br />signal horizontal_counter : std_logic_vector (9 downto 0);<br />signal vertical_counter : std_logic_vector (9 downto 0);<br /><br />signal paddle_x : std_logic_vector (9 downto 0);<br />signal ball_pos_x : std_logic_vector (9 downto 0);<br />signal ball_pos_y : std_logic_vector (9 downto 0);<br />signal ball_dir_x : std_logic_vector (9 downto 0);<br />signal ball_dir_y : std_logic_vector (9 downto 0);<br /><br />signal reset : std_logic;<br />begin<br /><br /><br />-- generate a 25Mhz clock<br />clock:<br />process (clk50_in)<br />begin<br /> if clk50_in'event and clk50_in='1' then<br /> if (clk25 = '0') then<br /> clk25 <= '1';<br /> else<br /> clk25 <= '0';<br /> end if;<br /> end if;<br />end process;<br /><br />draw:<br />process (clk25) <br />begin<br /><br /> <br /> if clk25'event and clk25 = '1' then <br /><br /> if (horizontal_counter >= "0010010000" ) -- 144<br /> and (horizontal_counter < "1100010000" ) -- 784<br /> and (vertical_counter >= "0000100111" ) -- 39<br /> and (vertical_counter < "1000000111" ) then -- 519 <br /> <br /> if (paddle_x <= horizontal_counter + CONV_STD_LOGIC_VECTOR(44,10)) and<br /> (paddle_x + CONV_STD_LOGIC_VECTOR(44,10) >= horizontal_counter) and<br /> (CONV_STD_LOGIC_VECTOR(484,10) <= vertical_counter + CONV_STD_LOGIC_VECTOR(8,10)) and<br /> (CONV_STD_LOGIC_VECTOR(484,10) + CONV_STD_LOGIC_VECTOR(8,10) >= vertical_counter ) then<br /> <br /> red_out <= '0';<br /> green_out <= '1';<br /> blue_out <= '1';<br /> <br /> elsif ('0' & ball_pos_x <= horizontal_counter + CONV_STD_LOGIC_VECTOR(8,10)) and<br /> (ball_pos_x + CONV_STD_LOGIC_VECTOR(8,10) >= '0' & horizontal_counter) and<br /> ('0' & ball_pos_y <= vertical_counter + CONV_STD_LOGIC_VECTOR(8,10)) and<br /> (ball_pos_y + CONV_STD_LOGIC_VECTOR(8,10) >= '0' & vertical_counter ) then<br /> <br /> red_out <= '1';<br /> green_out <= '1';<br /> blue_out <= '0';<br /> <br /> elsif (horizontal_counter < "0010011010" ) or -- 154<br /> (horizontal_counter >= "1100000110" ) or -- 774<br /> (vertical_counter < "0000110001" ) then -- 49<br /> <br /> red_out <= '1';<br /> green_out <= '1';<br /> blue_out <= '1';<br /> <br /> else<br /> red_out <= '0';<br /> green_out <= '0';<br /> blue_out <= '1';<br /> end if;<br /> else<br /> red_out <= '0';<br /> green_out <= '0';<br /> blue_out <= '0';<br /> end if;<br /> <br /> if (horizontal_counter > "0000000000" ) and (horizontal_counter < "0001100001" ) then -- 96+1<br /> hs_out <= '0';<br /> else<br /> hs_out <= '1';<br /> end if;<br /><br /> if (vertical_counter > "0000000000" ) and (vertical_counter < "0000000011" ) then -- 2+1<br /> vs_out <= '0';<br /> else<br /> vs_out <= '1';<br /> end if;<br /><br /> horizontal_counter <= horizontal_counter+"0000000001"; <br /> <br /> if (horizontal_counter="1100100000") then --800<br /> vertical_counter <= vertical_counter+"0000000001";<br /> horizontal_counter <= "0000000000";<br /> end if;<br /> <br /> if (vertical_counter="1000001001") then --521 <br /> <br /> vertical_counter <= "0000000000";<br /> <br /> if (key_1 = '1') then<br /> if ('0' & ball_pos_y) >= CONV_STD_LOGIC_VECTOR(476,10) and<br /> ('0' & ball_pos_y) <= CONV_STD_LOGIC_VECTOR(486,10) and<br /> (ball_pos_x >= paddle_x - CONV_STD_LOGIC_VECTOR(44,10)) and<br /> (ball_pos_x <= paddle_x + CONV_STD_LOGIC_VECTOR(44,10)) then<br /> ball_dir_y <= not CONV_STD_LOGIC_VECTOR(4,10);<br /> elsif ball_pos_y <= CONV_STD_LOGIC_VECTOR(64,10) then<br /> ball_dir_y <= CONV_STD_LOGIC_VECTOR(4,10);<br /> end if;<br /> <br /> if ('0' & ball_pos_x) >= CONV_STD_LOGIC_VECTOR(774,10) - CONV_STD_LOGIC_VECTOR(8,10) then<br /> ball_dir_x <= not CONV_STD_LOGIC_VECTOR(4,10);<br /> elsif ball_pos_x <= CONV_STD_LOGIC_VECTOR(170,10) then<br /> ball_dir_x <= CONV_STD_LOGIC_VECTOR(4,10);<br /> end if;<br /> <br /> -- Compute next ball Y position<br /> ball_pos_y <= ball_pos_y + ball_dir_y;<br /> ball_pos_x <= ball_pos_x + ball_dir_x;<br /> <br /> if (key_2 = '0') then<br /> reset <= '1';<br /> end if;<br /> <br /> if (key_0 = '0') then<br /> paddle_x <= paddle_x + CONV_STD_LOGIC_VECTOR(4,10);<br /> end if;<br /> <br /> if (key_3 = '0') then<br /> paddle_x <= paddle_x + not CONV_STD_LOGIC_VECTOR(4,10);<br /> end if;<br /> <br /> if (paddle_x <= CONV_STD_LOGIC_VECTOR(178,10)) then<br /> paddle_x <= CONV_STD_LOGIC_VECTOR(179,10);<br /> elsif ('0' & paddle_x) >= CONV_STD_LOGIC_VECTOR(730,10) then<br /> paddle_x <= CONV_STD_LOGIC_VECTOR(729,10);<br /> end if;<br /> end if;<br /> end if;<br /> end if;<br />end process;<br /><br />end Behavioral;<br /><br /></textarea><br /><br /><p class="MsoNormal"><span lang="ES-MX"> Al final el resultado debe de ser el del siguiente screenshot.</span></p> <br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1pzgDVe46LrJ2L4Hp4Ydf0oPrtSRtgNk24wVCn1EuAcDIrI1BbSossqsrBLvgXt3s-1TBA33TGR2Y/vhdl_pong.jpg" />carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com6tag:blogger.com,1999:blog-31152350.post-35399293546836851692008-09-14T08:05:00.005-05:002008-09-19T04:09:51.496-05:00Basic4GL PongEn este post vamos a ver como programar el clasico de clasicos, y por ser la primera vez con Basic4GL solo vamos utilizar las funciones print.<br /><br />Primero dibujaremos nuestra pelota y la tabla con la que vamos a jugar:<br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >TextMode(TEXT_BUFFERED)</span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >while true </span><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > cls </span><br /></div><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate 39,10</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "0" </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate 10,40 </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "HHHHHHHH" </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > DrawText()</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >wend</span><br /><br />A diferencia del tutorial anterior aquí agregamos las lineas <span style="font-weight: bold;">locate</span>, estas lineas le siguen dos números, el primero cambiara la posición inicial del texto en la posición X, y el segundo en la posición Y, experimenta un poco con esto a ver que pasa (lo números máximos son 39 para X, 24 para Y).<br /><br />Si ejecutamos nuestro programa (F5), veremos en la pantalla nuestra tabla y una pelota aún sin movimiento.<br /><br />Ahora vamos a controlar nuestra tabla, para esto utilizaremos las teclas de flecha derecha e izquierda:<br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >TextMode(TEXT_BUFFERED) </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" >dim playerX</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >while true </span><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > cls </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate 39,10</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "0" </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate <span style="color: rgb(153, 0, 0);">playerX</span>,40 </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "HHHHHHHH" </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > if ScanKeyDown(VK_LEFT) and playerX > 0 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > playerX = playerX - 1</span><br /></div><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > endif </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > if ScanKeyDown(VK_RIGHT) and playerX <><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > playerX = playerX + 1</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" ><span style="color: rgb(255, 0, 0);"><span style="color: rgb(153, 0, 0);"> endif </span> </span> </span><br /></span></div><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > DrawText()</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >wend</span><br /><br />El pimer cambio es un <span style="font-weight: bold;">dim playerX</span>, <span style="font-weight: bold;">dim </span>es una palabra reservada de Basic para declarar que vamos a crear una variable y <span style="font-weight: bold;">playerX </span>es el nombre de nuestra variable.<br /><br />Después vienen dos estructuras <span style="font-weight: bold;">if </span>que controlan nuestra tabla, en ambas comprobamos si el jugador esta presionando una tecla (<span style="font-weight: bold;">VK_LEFT</span> para la tecla izquierda, y <span style="font-weight: bold;">VK_RIGHT</span> para la derecha), si es así entontences vemos si aún no nos salimos de la pantalla, esto es: si la posición inicial en X es mayor a 0 aún estamos dentro, y si es menor a 31 (los 39 caractéres menos los 8 que mide nuestra tablita) sucede lo mismo así que podemos despazarnos sobre el eje X sin ningún problema.<br /><br />Si ejecutamos, ahora podemos mover nuestra tabla.<br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >TextMode(TEXT_BUFFERED) </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >dim playerX<span style="color: rgb(153, 0, 0);">, ballX, ballY, movX, movY </span></span><br /><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" >movX = 1</span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" >movY = 1</span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >while true </span><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > cls </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > <span style="color: rgb(153, 0, 0);">ballX = ballX + movX </span></span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > ballY = ballY + movY</span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > if ballX <> 38 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > movX = movX * -1</span><br /></div><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > endif</span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > if ballY <> 24 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > movY = movY * -1</span><br /></div><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > endif</span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate <span style="color: rgb(153, 0, 0);">ballX,ballY</span></span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "0" </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate playerX,24 </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "HHHHHHHH" </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > if ScanKeyDown(VK_LEFT) and playerX > 0 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > playerX = playerX - 1</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > endif </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > if ScanKeyDown(VK_RIGHT) and playerX <><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > playerX = playerX + 1</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > endif </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > DrawText()</span><br /></span></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >wend</span><br /><br />Ahora agregamos más variables y otro par de sentencias <span style="font-weight: bold;">if</span>.<br /><br />Las variables <span style="font-weight: bold;">ballX </span>y <span style="font-weight: bold;">ballY </span>controlan la posición de nuestra pelota en los ejes de coordenadas, <span style="font-weight: bold;">movX </span>y <span style="font-weight: bold;">movY </span>controlan la dirección de la misma de la siguiente manera:<br /><br />Si la bola se esta moviendo positivamente <span style="font-weight: bold;">movX </span>y <span style="font-weight: bold;">movY </span>valdran 1, de lo contrario se valor será de -1, por lo que si lo sumamos cada vez a la posición de la pelota esta se movera en dicha dirección.<br /><br />Despúes dentro de los <span style="font-weight: bold;">if</span>'s vamos a comprobar si nuestra pelota aún permanece dentro de la venta de manera similar a lo que hcimos con la tabla pero además agregaremos el eje Y.<br /><br />Si lo ejectuamos podremos ver la bola rebotando por toda la ventana.<br /><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >TextMode(TEXT_BUFFERED) </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >dim playerX, ballX, ballY, movX, movY </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >movX = 1</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >movY = 1</span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >while true </span><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > cls </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > ballX = ballX + movX </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > ballY = ballY + movY</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > if ballX <> 38 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > movX = movX * -1</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > endif</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > if ballY <> 24 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > movY = movY * -1</span><br /></div><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > endif</span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > if ballY > 23 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > if ballX > playerX and ballX < (playerX + 8) then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > movY = movY * -1</span><br /></div><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > else </span><br /> <div style="margin-left: 40px;"><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > cls</span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > locate 15,10</span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > print "Game Over" </span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > DrawText()</span><br /><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > end</span><br /></div><span style="color: rgb(153, 0, 0);font-family:courier new,courier,monospace;" > endif</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" ><span style="color: rgb(153, 0, 0);"> endif </span> </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate ballX,ballY</span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "0" </span><br /><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > locate playerX,24 </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > print "HHHHHHHH" </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > if ScanKeyDown(VK_LEFT) and playerX > 0 then</span><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > playerX = playerX - 1</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > endif </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > if ScanKeyDown(VK_RIGHT) and playerX <><br /> <div style="margin-left: 40px;"><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > playerX = playerX + 1</span><br /></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > endif </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > <span style="color: rgb(153, 0, 0);">Sleep(75)</span></span><br /><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" > DrawText()</span><br /></span></div><span style="color: rgb(0, 0, 204);font-family:courier new,courier,monospace;" >wend</span><br /><br />En esta última parte solo vamos a eliminar el rebote de la pelota con la parte baja de la ventana, y lo vamos a cambiar por un game over, o en el caso de que le peguemos con la tabla programaremos la acción correspondiente.<br /><br />En el primer <span style="font-weight: bold;">if </span>solo eliminamos la última comprobación, y en el segundo sólo vamos a entrar cuando la pelota este al nivel de la tabla, a partir de ahi solo tenemos 2 opciones, le dimos o no le dimos: si la posición x de la pelota se encuentra entre la pocisión inicial y la final (playerX + 8) de la tabla, significa que le dimos, sino simplemente borramos la pantalla y dibujamos un letrero de game over.<br /><br />El utimo <span style="font-weight: bold;">Sleep(75)</span> indica que vamos a esperar 75 milésimas de segundo cada que lleguemos a él, esto causara que el programa se vuelva más lento y la pelota no este desquiciada.<br /><br /><img src="http://cursos.iteso.mx/moodle/theme/Portal_cursos/pix/s/cool.gif" alt="estupendo" title="estupendo" /> <br /><br />Finalmente le ponemos algunos extras, intenten agregarle m[as cosas, por ejemplo acá ya tiene el puntaje implementado:<br /><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" >TextMode(TEXT_BUFFERED)</span><br /><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > dim playerX, ballX, ballY, movX, movY</span><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > dim score as integer</span><br /><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > movX = 1</span><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > movY = 1</span><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > </span><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > reset_game: </span><br /><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > ballY = 0</span><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > ballX = 10 + (Rnd() % 20)</span><br /><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > playerX = 16</span><br /><br /><span style="color: rgb(0, 0, 153);font-family:courier new,courier,monospace;" > while true</span><br /> <div style="margin-left: 40px; color: rgb(0, 0, 153);"><span style="font-family:courier new,courier,monospace;"> cls</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> ballX = ballX + movX</span><br /><span style="font-family:courier new,courier,monospace;"> ballY = ballY + movY</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> if ballX <> 38 then</span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> movX = movX * -1</span><br /></div><span style="font-family:courier new,courier,monospace;"> endif</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> if ballY <> 24 then</span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> movY = movY * -1</span><br /></div><span style="font-family:courier new,courier,monospace;"> endif</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> if ballY > 23 then</span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> if ballX > playerX and ballX < (playerX + 8) then</span><br /> <div style="margin-left: 40px;"> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> movY = movY * -1 </span><br /></div> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> score = score + 1</span><br /></div><span style="font-family:courier new,courier,monospace;"> else </span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> while true</span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> cls </span><br /><br /><span style="font-family:courier new,courier,monospace;"> locate 15,10</span><br /><span style="font-family:courier new,courier,monospace;"> print "Game Over" </span><br /><br /><span style="font-family:courier new,courier,monospace;"> locate 13,12</span><br /><span style="font-family:courier new,courier,monospace;"> print "Try again(y/n)"</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> if KeyDown("Y") then</span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> goto reset_game</span><br /></div><span style="font-family:courier new,courier,monospace;"> end if</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> if KeyDown("N") then</span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> end</span><br /></div><span style="font-family:courier new,courier,monospace;"> end if </span><br /><br /><span style="font-family:courier new,courier,monospace;"> DrawText()</span><br /></div><span style="font-family:courier new,courier,monospace;"> wend</span><br /></div></div><span style="font-family:courier new,courier,monospace;"> endif</span><br /></div><span style="font-family:courier new,courier,monospace;"> endif</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> locate 0,0</span><br /><span style="font-family:courier new,courier,monospace;"> print "Score: " + score</span><br /><br /><span style="font-family:courier new,courier,monospace;"> locate ballX,ballY</span><br /><span style="font-family:courier new,courier,monospace;"> print "0"</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> locate playerX,24</span><br /><span style="font-family:courier new,courier,monospace;"> print "HHHHHHHH"</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> if ScanKeyDown(VK_LEFT) and playerX > 0 then</span><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> playerX = playerX - 1</span><br /></div><span style="font-family:courier new,courier,monospace;"> endif</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> if ScanKeyDown(VK_RIGHT) and playerX <><br /> <div style="margin-left: 40px;"><span style="font-family:courier new,courier,monospace;"> playerX = playerX + 1</span><br /></div><span style="font-family:courier new,courier,monospace;"> endif</span><br /><span style="font-family:courier new,courier,monospace;"> </span><br /><span style="font-family:courier new,courier,monospace;"> WaitTimer(100)</span><br /><span style="font-family:courier new,courier,monospace;"> DrawText()</span><br /></span></div> <span style="font-family:courier new,courier,monospace;"><span style="color: rgb(0, 0, 153);"> wend</span> </span>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com3tag:blogger.com,1999:blog-31152350.post-56439526006727423522008-09-13T06:50:00.002-05:002008-09-13T06:52:04.481-05:00OneNote Sudoku AddinAs many of you know the las months I've wrote a Sudoku Addin for the Office One Note, this was a part of my Student2Business assingment.<br /><br />Finally the last week I get it working so you can take a look from CodePlex -<a href="http://www.codeplex.com/onom" target="_blank">codeplex.com/onom</a>-<br /><br />Also the John Guin blog (The Project Mannager) has a cool installation guide. -<a href="http://blogs.msdn.com/johnguin/archive/2008/06/30/sudoku-addin-for-onenote-beta-is-available.aspx#comments" target="_blank">John Blog</a>-<br /><br /><br /><a href="http://blogs.msdn.com/johnguin/attachment/8671965.ashx" target="_blank">Download</a>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-71914649472126997372008-09-13T06:48:00.000-05:002008-09-13T06:49:47.184-05:00Windows Live AgentsMuchos me han pedido que les explique como hacer un agente para el messenger, en realidad este proceso puede ir desde lo sencillo hasta algo muy complejo, obvio depende de que quieran hacer, por el momento simplemente haremos uno que detecté cuando estas ausente y si recibes un mensaje que le devuelva al remitente una respuesta.<br /><br />Para esto vamos a crear un proyecto de biblioteca de clases.<br /><br />Despúes agregamos como referencia el assembly <b>MessengetClient.dll</b> (que se encuentra dentro de la carpeta Windows Live/Messenger de archivos de programa.<br /><br />Con esto vamos a poder utilizar en namespace Microsoft.Messenger el cual es necesario para crear una interfase en nuestra clase llamada <b>IMessengerAddIn</b>.<br /><br />Para implementar dicha interfase debemo agregar el método <b>Initialize()</b>, aquí vamos a crear una instancia del cliente del cliente del messenger<br /><br /><table style="width: 653px; height: 675px;" align="center"><tbody><tr><td align="left"><pre><span style="font-family:Courier New;"><br /><b>using</b> <span style="color:#2040a0;">System</span><span style="color:#4444ff;">;</span><br /><b>using</b> <span style="color:#2040a0;">System</span>.<span style="color:#2040a0;">Collections</span>.<span style="color:#2040a0;">Generic</span><span style="color:#4444ff;">;</span><br /><b>using</b> <span style="color:#2040a0;">System</span>.<span style="color:#2040a0;">Text</span><span style="color:#4444ff;">;</span><br /><b>using</b> <span style="color:#2040a0;">Microsoft</span>.<span style="color:#2040a0;">Messenger</span><span style="color:#4444ff;">;</span><br /><br /><b>namespace</b> <span style="color:#2040a0;">WindowsLiveMessengerAgent</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <b>public</b> <b>class</b> <span style="color:#2040a0;">MessengerAddIn</span><br /> <span style="color:#4444ff;">:</span> <span style="color:#2040a0;">IMessengerAddIn</span><br /> <span style="color:#4444ff;"><b>{</b></span><br /> <b>private</b> <span style="color:#2040a0;">MessengerClient</span> <span style="color:#2040a0;">_client</span><span style="color:#4444ff;">;</span><br /> <b>private</b> <span style="color:#2040a0;"><b>void</b></span> <span style="color:#2040a0;">IncomingTextMessage</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">object</span> <span style="color:#2040a0;">sender</span>,<br /> <span style="color:#2040a0;">IncomingTextMessageEventArgs</span> <span style="color:#2040a0;">e</span><span style="color:#4444ff;">)</span><br /> <span style="color:#4444ff;"><b>{</b></span><br /> <b>if</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">_client</span>.<span style="color:#2040a0;">LocalUser</span>.<span style="color:#2040a0;">Status</span> == <span style="color:#2040a0;">UserStatus</span>.<span style="color:#2040a0;">Away</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">_client</span>.<span style="color:#2040a0;">SendTextMessage</span><span style="color:#4444ff;">(</span><br /> "<span style="color:#2040a0;">Lo</span> <span style="color:#2040a0;">siento</span>, <span style="color:#2040a0;">en</span> <span style="color:#2040a0;">este</span> <span style="color:#2040a0;">momento</span> <span style="color:#2040a0;">me</span> <span style="color:#2040a0;">encuentro</span> <span style="color:#2040a0;">ausente</span>" <span style="color:#4444ff;">+</span><br /> "\<span style="color:#2040a0;">nDeja</span> <span style="color:#2040a0;">tu</span> <span style="color:#2040a0;">mensaje</span> <span style="color:#2040a0;">y</span> <span style="color:#2040a0;">me</span> <span style="color:#2040a0;">comunico</span> <span style="color:#2040a0;">más</span> <span style="color:#2040a0;">tarde</span>\<span style="color:#2040a0;">n</span>\<span style="color:#2040a0;">n</span>" <span style="color:#4444ff;">+</span><br /> <span style="color:#2040a0;">_client</span>.<span style="color:#2040a0;">LocalUser</span>.<span style="color:#2040a0;">FriendlyName</span>, <span style="color:#2040a0;">e</span>.<span style="color:#2040a0;">UserFrom</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#4444ff;"><b>}</b></span><br /> #<span style="color:#2040a0;">region</span> <span style="color:#2040a0;">IMessengerAddIn</span> <span style="color:#2040a0;">Members</span><br /><br /> <b>public</b> <span style="color:#2040a0;"><b>void</b></span> <span style="color:#2040a0;">Initialize</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">MessengerClient</span> <span style="color:#2040a0;">messenger</span><span style="color:#4444ff;">)</span><br /> <span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;">_client</span> = <span style="color:#2040a0;">messenger</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;">_client</span>.<span style="color:#2040a0;">AddInProperties</span>.<span style="color:#2040a0;">FriendlyName</span> =<br /> "<span style="color:#2040a0;">WindowsLiveMessengerAgent</span>"<span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">_client</span>.<span style="color:#2040a0;">AddInProperties</span>.<span style="color:#2040a0;">Description</span> =<br /> "<span style="color:#2040a0;">Este</span> <span style="color:#2040a0;">agente</span> <span style="color:#2040a0;">responde</span> <span style="color:#2040a0;">cuando</span> <span style="color:#2040a0;">no</span> <span style="color:#2040a0;">estas</span> <span style="color:#2040a0;">en</span> <span style="color:#2040a0;">linea</span>."<span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;">_client</span>.<span style="color:#2040a0;">IncomingTextMessage</span> <span style="color:#4444ff;">+=</span><br /> <b>new</b> <span style="color:#2040a0;">EventHandler</span><<span style="color:#2040a0;">IncomingTextMessageEventArgs</span>><br /> <span style="color:#4444ff;">(</span><b>this</b>.<span style="color:#2040a0;">IncomingTextMessage</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#4444ff;"><b>}</b></span><br /><br /> #<span style="color:#2040a0;">endregion</span><br /> <span style="color:#4444ff;"><b>}</b></span><br /><span style="color:#4444ff;"><b>}</b></span><br /></span></pre></td></tr></tbody></table><p><br /><br />Nota: antes de compilar hay que asegurarnos (de hecho no esta por default) de que nuestro assembly se llame igual que nuestro bot + . + nombre de la clase principal, ejemplo:<br /><br />WindowsLiveMessengerAgent.MessengerAddIn<br /><br />Una vez compilada nuestra biblioteca debemos cargarla en el messenger (Ojo: versión 8.5):<br /><br />Abrimos messenger -> Opciones -> Accesorios -> Agregar a messenger -> Buscamos nuestro assembly;<br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPzrK4pon3tMGwuylc-cJoLpaYpXDh6gH46TOsQbZGQvwGOzGj3h5BI-cOVCcDXg42Soc_zLIwW7Kw/bot1.jpg" alt="" border="0" /><br /><br />Y lo activamos desde el menú principal..<br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPy86EQLsE1li1D5SGi0UzJsr1jNxEeRTO8JCxtK2m9mZDafUm6X_6k0o8FQRyvzoQsv3cpAyWto2Q/bot2.jpg" alt="" border="0" /><br /><br />:D y listo.<br /><br /><br />Las opciones con los agentes son muy divertidas y/o interesantes, por ejemplo unos compañeros y yo hicimos uno que procesaba los mensajes que recibia y mandaba una respuesta, hay uno que es de la Encarta el cául te ayuda a hacer búsquedas, o por ejemplo uno (para mí muy útil por cierto) que manda feeds de RSS.<br /><br />Es cuestión de echarlo coco... </p> <iframe src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/WindowsLiveMessengerAgent.zip" marginheight="0" marginwidth="0" style="margin: 3px; padding: 0pt; width: 240px; height: 66px;" mce_src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/WindowsLiveMessengerAgent.zip" frameborder="0" scrolling="no"></iframe>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-30483398875786114532008-09-13T06:46:00.001-05:002008-09-13T06:48:31.862-05:00CUDAHace algunos dias me tope con una tecnología de nVidia llamada CUDA. uhmmm ¿Para que sirve? básicamente para utilizar el procesamiento many-core de los GPU's.<br /><br />Además los GPU's modernos nos permiten desarrollar programas utilizando vector programming, así como utilizar algunas "opciones extra" a la hora de trabajar con floats...<br /><br />Bien, a esto le vamos a agregar que podemos desarrollar nuestros programas en lenjuague C, e incluso integrarlo en varios IDE's.<br /><br />Hace un rato me puse a integrarlo en VC++ 2005 (<a href="http://forums.nvidia.com/index.php?showtopic=65111" target="_blank">Guía</a> ) y todo funciona perfectamente (ea ojo, solo vamos a utilizar el editor, para compilar necesitamos utilizar el compilador de CUDA)<br /><br />Veamos un pequeño ejemplo pasado en C++<br /><br /><table style="width: 646px; height: 531px;" align="center"><tbody><tr><td align="left"><pre><span style="font-family:Courier New;"><br />#<span style="color:#2040a0;">include</span> "<span style="color:#2040a0;">stdafx</span>.<span style="color:#2040a0;">h</span>"<br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">stdio</span>.<span style="color:#2040a0;">h</span>><br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">stdlib</span>.<span style="color:#2040a0;">h</span>><br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">math</span>.<span style="color:#2040a0;">h</span>><br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">windows</span>.<span style="color:#2040a0;">h</span>><br /><br />#<span style="color:#2040a0;">define</span> <span style="color:#2040a0;">M_PI</span> <span style="color:#ff0000;">3</span>.<span style="color:#ff0000;">14159265358979323846f</span><br /><br /><span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">_tmain</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">argc</span>, <span style="color:#2040a0;">_TCHAR</span><span style="color:#4444ff;">*</span> <span style="color:#2040a0;">argv</span><span style="color:#4444ff;">[</span><span style="color:#4444ff;">]</span><span style="color:#4444ff;">)</span><br /><span style="color:#4444ff;"><b>{</b></span> <br /> <span style="color:#2040a0;">DWORD</span> <span style="color:#2040a0;">start</span> = <span style="color:#2040a0;">GetTickCount</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <b>const</b> <span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">N</span> = <span style="color:#ff0000;">200000</span><span style="color:#4444ff;">;</span> <br /> <span style="color:#2040a0;"><b>float</b></span> <span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#ff0000;">200000</span><span style="color:#4444ff;">]</span> = <span style="color:#4444ff;"><b>{</b></span><span style="color:#ff0000;">0</span><span style="color:#4444ff;"><b>}</b></span><span style="color:#4444ff;">;</span><br /><br /> <b>for</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">i</span>=<span style="color:#ff0000;">0</span><span style="color:#4444ff;">;</span> <span style="color:#2040a0;">i</span><<span style="color:#2040a0;">N</span><span style="color:#4444ff;">;</span> <span style="color:#2040a0;">i</span><span style="color:#4444ff;">++</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">]</span> = <span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>float</b></span><span style="color:#4444ff;">)</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">;</span><br /><br /><br /> <b>for</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">i</span>=<span style="color:#ff0000;">0</span><span style="color:#4444ff;">;</span> <span style="color:#2040a0;">i</span><<span style="color:#2040a0;">N</span><span style="color:#4444ff;">;</span> <span style="color:#2040a0;">i</span><span style="color:#4444ff;">++</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">]</span> = <br /> <span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cosf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">]</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">1024</span> <span style="color:#4444ff;">*</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">M_PI</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">180</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span> <span style="color:#2040a0;">sinf</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">1</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span><br /> <span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cosf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">]</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">1024</span> <span style="color:#4444ff;">*</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">M_PI</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">180</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span> <span style="color:#2040a0;">sinf</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">1</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span><br /> <span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cosf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">]</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">1024</span> <span style="color:#4444ff;">*</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">M_PI</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">180</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span> <span style="color:#2040a0;">sinf</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">1</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <br /> <span style="color:#2040a0;">DWORD</span> <span style="color:#2040a0;">end</span> = <span style="color:#2040a0;">GetTickCount</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">printf</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">Processing</span> <span style="color:#2040a0;">time</span><span style="color:#4444ff;">:</span> <span style="color:#4444ff;">%</span><span style="color:#2040a0;">d</span> <span style="color:#4444ff;">%</span><span style="color:#2040a0;">d</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">ms</span><span style="color:#4444ff;">)</span> \<span style="color:#2040a0;">n</span>" , <span style="color:#2040a0;">end</span> <span style="color:#4444ff;">-</span> <span style="color:#2040a0;">start</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;">system</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">PAUSE</span>"<span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <b>return</b> <span style="color:#ff0000;">0</span><span style="color:#4444ff;">;</span><br /><span style="color:#4444ff;"><b>}</b></span></span></pre></td></tr></tbody></table><br /><br />Sencillo, simplemente creamos un array y le aplicamos operaciones a lo bruto (a lo bruto).<br /><br />Ahora nuestro ejemplo portado a CUDA sería algo así:<br /><br /><table style="width: 641px; height: 931px;" align="center"><tbody><tr><td align="left"><pre><span style="font-family:Courier New;"><br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">tchar</span>.<span style="color:#2040a0;">h</span>><br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">stdio</span>.<span style="color:#2040a0;">h</span>><br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">cuda</span>.<span style="color:#2040a0;">h</span>><br />#<span style="color:#2040a0;">include</span> <<span style="color:#2040a0;">cutil</span>.<span style="color:#2040a0;">h</span>><br /><br />#<span style="color:#2040a0;">define</span> <span style="color:#2040a0;">M_PI</span> <span style="color:#ff0000;">3</span>.<span style="color:#ff0000;">14159265358979323846</span><br /><br /><span style="color:#2040a0;">__global__</span> <span style="color:#2040a0;"><b>void</b></span> <span style="color:#2040a0;">kernel</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>float</b></span> <span style="color:#4444ff;">*</span><span style="color:#2040a0;">a</span>, <span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">N</span><span style="color:#4444ff;">)</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">idx</span> = <span style="color:#2040a0;">blockIdx</span>.<span style="color:#2040a0;">x</span> <span style="color:#4444ff;">*</span> <span style="color:#2040a0;">blockDim</span>.<span style="color:#2040a0;">x</span> <span style="color:#4444ff;">+</span> <span style="color:#2040a0;">threadIdx</span>.<span style="color:#2040a0;">x</span><span style="color:#4444ff;">;</span><br /> <b>if</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">idx</span><<span style="color:#2040a0;">N</span><span style="color:#4444ff;">)</span> <span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">idx</span><span style="color:#4444ff;">]</span> =<br /> <span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cosf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">idx</span><span style="color:#4444ff;">]</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">1024</span> <span style="color:#4444ff;">*</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">M_PI</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">180</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span> <span style="color:#2040a0;">sinf</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">1</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span><br /> <span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cosf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">idx</span><span style="color:#4444ff;">]</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">1024</span> <span style="color:#4444ff;">*</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">M_PI</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">180</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span> <span style="color:#2040a0;">sinf</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">1</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span><br /> <span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">sqrtf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cosf</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">idx</span><span style="color:#4444ff;">]</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">1024</span> <span style="color:#4444ff;">*</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">M_PI</span> <span style="color:#4444ff;">/</span> <span style="color:#ff0000;">180</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">*</span> <span style="color:#2040a0;">sinf</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">1</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><span style="color:#4444ff;"><b>}</b></span><br /><br /><br /><span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">main</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>void</b></span><span style="color:#4444ff;">)</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;"><b>unsigned</b></span> <span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">timer</span> = <span style="color:#ff0000;">0</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">CUT_SAFE_CALL</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cutCreateTimer</span><span style="color:#4444ff;">(</span>&<span style="color:#2040a0;">timer</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">CUT_SAFE_CALL</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cutStartTimer</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">timer</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;"><b>float</b></span> <span style="color:#4444ff;">*</span><span style="color:#2040a0;">a_h</span>, <span style="color:#4444ff;">*</span><span style="color:#2040a0;">a_d</span><span style="color:#4444ff;">;</span> <br /> <b>const</b> <span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">N</span> = <span style="color:#ff0000;">200000</span><span style="color:#4444ff;">;</span> <br /><br /> <span style="color:#2040a0;">size_t</span> <span style="color:#2040a0;">size</span> = <span style="color:#2040a0;">N</span> <span style="color:#4444ff;">*</span> <b>sizeof</b><span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>float</b></span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">a_h</span> = <span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>float</b></span> <span style="color:#4444ff;">*</span><span style="color:#4444ff;">)</span><span style="color:#2040a0;">malloc</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">size</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span> <br /> <br /><br /> <span style="color:#2040a0;">cudaMalloc</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>void</b></span> <span style="color:#4444ff;">*</span><span style="color:#4444ff;">*</span><span style="color:#4444ff;">)</span> &<span style="color:#2040a0;">a_d</span>, <span style="color:#2040a0;">size</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span> <br /><br /> <b>for</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">i</span>=<span style="color:#ff0000;">0</span><span style="color:#4444ff;">;</span> <span style="color:#2040a0;">i</span> < <span style="color:#2040a0;">N</span><span style="color:#4444ff;">;</span> <span style="color:#2040a0;">i</span><span style="color:#4444ff;">++</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">a_h</span><span style="color:#4444ff;">[</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">]</span> = <span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>float</b></span><span style="color:#4444ff;">)</span><span style="color:#2040a0;">i</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;">cudaMemcpy</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a_d</span>, <span style="color:#2040a0;">a_h</span>, <span style="color:#2040a0;">size</span>, <span style="color:#2040a0;">cudaMemcpyHostToDevice</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /><br /> <span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">block_size</span> = <span style="color:#ff0000;">4</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;"><b>int</b></span> <span style="color:#2040a0;">n_blocks</span> = <span style="color:#2040a0;">N</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">block_size</span> <span style="color:#4444ff;">+</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">N</span><span style="color:#4444ff;">%</span><span style="color:#2040a0;">block_size</span> == <span style="color:#ff0000;">0</span> <span style="color:#4444ff;">?</span> <span style="color:#ff0000;">0</span><span style="color:#4444ff;">:</span><span style="color:#ff0000;">1</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /><br /> <span style="color:#2040a0;">kernel</span> <<< <span style="color:#2040a0;">n_blocks</span>, <span style="color:#2040a0;">block_size</span> >>> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">a_d</span>, <span style="color:#2040a0;">N</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /><br /> <span style="color:#2040a0;">cudaMemcpy</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a_h</span>, <span style="color:#2040a0;">a_d</span>, <b>sizeof</b><span style="color:#4444ff;">(</span><span style="color:#2040a0;"><b>float</b></span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">*</span><span style="color:#2040a0;">N</span>, <span style="color:#2040a0;">cudaMemcpyDeviceToHost</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">CUT_SAFE_CALL</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cutStopTimer</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">timer</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /><br /> <span style="color:#2040a0;">printf</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">Processing</span> <span style="color:#2040a0;">time</span><span style="color:#4444ff;">:</span> <span style="color:#4444ff;">%</span><span style="color:#2040a0;">f</span> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">ms</span><span style="color:#4444ff;">)</span> \<span style="color:#2040a0;">n</span>", <span style="color:#2040a0;">cutGetTimerValue</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">timer</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">CUT_SAFE_CALL</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">cutDeleteTimer</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">timer</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;">free</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a_h</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">cudaFree</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">a_d</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">system</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">PAUSE</span>"<span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><span style="color:#4444ff;"><b>}</b></span></span></pre></td></tr></tbody></table><br /><br />Solo que esta pieza corre dos veces más rápido!! (AMD Athlon X2 vs GeForce 8800 GTX) y eso que aún estamos contando el tiempo de creación de datos que en realidad solo pasaría una vez en el programa.<br /><br />¿En que es diferente el código?<br />El código en CUDA, tiene una función extra, esta función es nuestro kernel, en otras palabras la función que cargaremos al GPU; esto es elemental puesto que a todos los datos los vamos a procesar igual (como en los shaders), ademas todos los datos debemos de crearlos en el host, osea en la PC (ouch!! solo imaginen que la tarjeta de video esta aparte) y en el dispositivo (la tarjeta de video que suponemos esta aparte) y al hacer esto debemos de preocuparnos por su sincronización.<br /><br />Este ejemplo es estupidamente sencillo, pero ahora imaginemos que podemos procesar partículas (jejeje voy a hacer eso esta semana), fluidos, física, u otro tipo de cosas donde el procesamiento es elemental, sobre todo cuando vamos a aplicar una misma función a una gran cantidad de datos (SIMD - Simple Input Multiple Data).<pre><span style="font-family:Courier New;"><br /></span></pre>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com1tag:blogger.com,1999:blog-31152350.post-91448714671489028922008-09-13T06:42:00.002-05:002008-09-13T06:45:57.202-05:00F# + XNACuando leí que al correr sobre .NET F# podía utilizar cualquier libreria dije "ya lo veremos", y vaya hasta el momento me ha funcionado bastante bien y para muestra me puse investigar acerca de cómo demonios meterle XNA... y es MUY SENCILLO :D<br /><br /><table style="width: 637px; height: 579px;" align="center"><tbody><tr><td align="left"><pre><span style="font-family:Courier New;"><br />#<span style="color: rgb(32, 64, 160);">light</span><br /><br />#<span style="color: rgb(32, 64, 160);">I</span> @"<span style="color: rgb(32, 64, 160);">C</span><span style="color: rgb(68, 68, 255);">:</span>\<span style="color: rgb(32, 64, 160);">Program</span> <span style="color: rgb(32, 64, 160);">Files</span>\<span style="color: rgb(32, 64, 160);">XNA</span>\<span style="color: rgb(32, 64, 160);">v2</span>.<span style="color: rgb(255, 0, 0);">0</span>\<span style="color: rgb(32, 64, 160);">References</span>\<span style="color: rgb(32, 64, 160);">Windows</span>\<span style="color: rgb(32, 64, 160);">x86</span>"<br /><br />#<span style="color: rgb(32, 64, 160);">r</span> "<span style="color: rgb(32, 64, 160);">Microsoft</span>.<span style="color: rgb(32, 64, 160);">Xna</span>.<span style="color: rgb(32, 64, 160);">Framework</span>.<span style="color: rgb(32, 64, 160);">dll</span>"<br />#<span style="color: rgb(32, 64, 160);">r</span> "<span style="color: rgb(32, 64, 160);">Microsoft</span>.<span style="color: rgb(32, 64, 160);">Xna</span>.<span style="color: rgb(32, 64, 160);">Framework</span>.<span style="color: rgb(32, 64, 160);">Game</span>.<span style="color: rgb(32, 64, 160);">dll</span>"<br /><br /><span style="color: rgb(32, 64, 160);">open</span> <span style="color: rgb(32, 64, 160);">Microsoft</span>.<span style="color: rgb(32, 64, 160);">Xna</span>.<span style="color: rgb(32, 64, 160);">Framework</span><br /><span style="color: rgb(32, 64, 160);">open</span> <span style="color: rgb(32, 64, 160);">Microsoft</span>.<span style="color: rgb(32, 64, 160);">Xna</span>.<span style="color: rgb(32, 64, 160);">Framework</span>.<span style="color: rgb(32, 64, 160);">Graphics</span><br /><span style="color: rgb(32, 64, 160);">open</span> <span style="color: rgb(32, 64, 160);">System</span><br /><br /><span style="color: rgb(32, 64, 160);">type</span> <span style="color: rgb(32, 64, 160);">XNAGame</span> = <b>class</b><br /> <span style="color: rgb(32, 64, 160);">inherit</span> <span style="color: rgb(32, 64, 160);">Game</span> <span style="color: rgb(32, 64, 160);">as</span> <span style="color: rgb(32, 64, 160);">base</span><br /><br /> <span style="color: rgb(32, 64, 160);">val</span> <b>mutable</b> <span style="color: rgb(32, 64, 160);">graphics</span> <span style="color: rgb(68, 68, 255);">:</span> <span style="color: rgb(32, 64, 160);">GraphicsDeviceManager</span><br /><br /> <b>new</b><span style="color: rgb(68, 68, 255);">(</span><span style="color: rgb(68, 68, 255);">)</span> <span style="color: rgb(32, 64, 160);">as</span> <b>this</b> =<br /> <span style="color: rgb(68, 68, 255);"><b>{</b></span><br /> <span style="color: rgb(32, 64, 160);">graphics</span> = <span style="color: rgb(32, 64, 160);">null</span><br /> <span style="color: rgb(68, 68, 255);"><b>}</b></span><br /> <span style="color: rgb(32, 64, 160);">then</span><br /> <b>this</b>.<span style="color: rgb(32, 64, 160);">graphics</span> <<span style="color: rgb(68, 68, 255);">-</span> <b>new</b> <span style="color: rgb(32, 64, 160);">GraphicsDeviceManager</span><span style="color: rgb(68, 68, 255);">(</span><b>this</b><span style="color: rgb(68, 68, 255);">)</span><br /><br /> <b>override</b> <b>this</b>.<span style="color: rgb(32, 64, 160);">Draw</span><span style="color: rgb(68, 68, 255);">(</span><span style="color: rgb(32, 64, 160);">gameTime</span><span style="color: rgb(68, 68, 255);">)</span> =<br /> <span style="color: rgb(32, 64, 160);">let</span> <span style="color: rgb(32, 64, 160);">gd</span> = <b>this</b>.<span style="color: rgb(32, 64, 160);">graphics</span>.<span style="color: rgb(32, 64, 160);">GraphicsDevice</span><br /> <span style="color: rgb(32, 64, 160);">gd</span>.<span style="color: rgb(32, 64, 160);">Clear</span><span style="color: rgb(68, 68, 255);">(</span><span style="color: rgb(32, 64, 160);">Color</span>.<span style="color: rgb(32, 64, 160);">CornflowerBlue</span><span style="color: rgb(68, 68, 255);">)</span><br /> <span style="color: rgb(32, 64, 160);">end</span><br /><br /><span style="color: rgb(32, 64, 160);">let</span> <span style="color: rgb(32, 64, 160);">Main</span><span style="color: rgb(68, 68, 255);">(</span><span style="color: rgb(68, 68, 255);">)</span> =<br /> <span style="color: rgb(32, 64, 160);">let</span> <span style="color: rgb(32, 64, 160);">game</span> = <b>new</b> <span style="color: rgb(32, 64, 160);">XNAGame</span><span style="color: rgb(68, 68, 255);">(</span><span style="color: rgb(68, 68, 255);">)</span><br /> <span style="color: rgb(32, 64, 160);">game</span>.<span style="color: rgb(32, 64, 160);">Run</span><span style="color: rgb(68, 68, 255);">(</span><span style="color: rgb(68, 68, 255);">)</span><br /><br /><span style="color: rgb(68, 68, 255);">[</span><<span style="color: rgb(32, 64, 160);">STAThread</span>><span style="color: rgb(68, 68, 255);">]</span><br /><b>do</b> <span style="color: rgb(32, 64, 160);">Main</span><span style="color: rgb(68, 68, 255);">(</span><span style="color: rgb(68, 68, 255);">)</span><br /></span></pre></td><td style="vertical-align: top;"><br /></td><td style="vertical-align: top;"><br /></td><td style="vertical-align: top;"><br /></td></tr></tbody></table><br />:D ;) :) xD<br /><br />Lo único de deben hacer es establecer el directorio donde tienen alojado el XNA, en este caso la versión 2.0 pero también lo probé con la 1.0 (oh si, mi version de F# es 1.9.3.14) porque tal parece que los assembly no estan en el GlobalAssemblyCache, otra opción es configurar el envoriment path (bucar en google) para poder acceder hasta él desde la linea de comandos.<br /><br />Para compilarlo utilizé el siguiente batch:<br /><br /><table style="width: 635px; height: 227px;" align="center"><tbody><tr><td align="left"><pre><span><span style="font-family:Courier New;"><br />@<b>if</b> "<span style="color: rgb(68, 68, 255);">%</span><span style="color: rgb(32, 64, 160);">_echo</span><span style="color: rgb(68, 68, 255);">%</span>"=="" <span style="color: rgb(32, 64, 160);">echo</span> <span style="color: rgb(32, 64, 160);">off</span><br /><span style="color: rgb(32, 64, 160);">setlocal</span><br /><br />..\..\..\<span style="color: rgb(32, 64, 160);">bin</span>\<span style="color: rgb(32, 64, 160);">fsc</span>.<span style="color: rgb(32, 64, 160);">exe</span> <span style="color: rgb(32, 64, 160);">xna</span>.<span style="color: rgb(32, 64, 160);">fs</span><br /><b>if</b> <span style="color: rgb(32, 64, 160);">ERRORLEVEL</span> <span style="color: rgb(255, 0, 0);">1</span> <b>goto</b> <span style="color: rgb(32, 64, 160);">Exit</span><br /><br /><span style="color: rgb(68, 68, 255);">:</span><span style="color: rgb(32, 64, 160);">Exit</span><br /><span style="color: rgb(32, 64, 160);">pause</span><br /><span style="color: rgb(32, 64, 160);">xna</span>.<span style="color: rgb(32, 64, 160);">exe</span><br /><span style="color: rgb(32, 64, 160);">endlocal</span><br /><br /><span style="color: rgb(32, 64, 160);">exit</span> <span style="color: rgb(68, 68, 255);">/</span><span style="color: rgb(32, 64, 160);">b</span> <span style="color: rgb(68, 68, 255);">%</span><span style="color: rgb(32, 64, 160);">ERRORLEVEL</span><span style="color: rgb(68, 68, 255);">%</span></span></span></pre></td></tr></tbody></table><p><br /><br />Osea un compila y ejecuta.<br /><br />Ya veré más delante que más le meto... </p> <iframe src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/xna.zip" marginheight="0" marginwidth="0" style="margin: 3px; padding: 0pt; width: 240px; height: 66px;" mce_src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/xna.zip" frameborder="0" scrolling="no"></iframe>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com1tag:blogger.com,1999:blog-31152350.post-86323297272646282452008-09-13T06:37:00.002-05:002008-09-13T06:41:20.180-05:00XNA HLSL ShadersEl día de ayer (bueno la madrugada de hoy) hicé un pequeño screencast acerca de shaders en XNA, les dejo el video y el link para descargar el código. <div align="center"><br /><br /><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/mY3lYph1nD8&hl=en&fs=1"><param name="allowFullScreen" value="true"><embed src="http://www.youtube.com/v/mY3lYph1nD8&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" height="344" width="425"></embed></object><br /><br /></div> <p> </p><p><br /></p><p>Tambièn les dejo la imagen de la escena lograda con este tutorial. :D<br /><br /><br /><br /><a href="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPwpKRJKHrPZ5cjARg3mN9KXL2PKO4aSSAMV5ecLpwSNo1oQmEppDAtTbcV_xDNSf7NU4QP1ESd5sQ/Reflection.png"><br /><img src="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPxv2HDz0FHWdp9lrWGVlB0ugI5RNaCpvu4tttwGMUs7mtMyQSyexQN4JZVGnB8kzvj0CJjPfnSzhA/Reflection.jpg" alt="Bloom Cubemap" align="middle" border="0" /></a><a><br /><br /> </a><br /></p> <iframe src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/Reflection.zip" marginheight="0" marginwidth="0" style="margin: 3px; padding: 0pt; width: 240px; height: 66px;" frameborder="0" scrolling="no"></iframe>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com1tag:blogger.com,1999:blog-31152350.post-38457578683974419162008-09-13T06:34:00.001-05:002008-09-13T06:37:28.755-05:00HLSL Shaders: Ejemplo en XNA<p>Hay una parte muy cool de cuando programar gráficos se trata, esa parte es el utilizar el GPU (Graphics Processing Unit) ósea la mismísima tarjeta de video para hacer cálculos y almacenamiento de memoria.<br /><br />La Content Pipeline<br /><br />Actualmente existen lenguajes de alto nivel (Cg de nVidia, HLSL de Microsoft y GLSL para OpenGL) que básicamente funcionan de la siguiente manera:<br /><br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPzicM8YbgrNcLFBK-xCyxiwvDg3k8Ku5wWJHGGmjFfhxo6KPSqHDHTj8fHGUnXyh7KS6V3oGd9Omw/pipeline.png" alt="Content Pipeline" /><br /><br /><br />Primero obviamente lo que necesitamos es crear un shader, este lo podemos hacer desde Visual Studio, o utilizando un programa de autoría de shaders como el Render Monkey de ATI o FX Composser de nVidia, este archivo lo vamos a cargar en nuestra aplicación y la API gráfica se encargará de que la tarjeta de video lo compile en tiempo real, esto se hace para crear una optimización para cada tipo de hardware.<br />Una vez hecho esto nosotros generamos un conjunto de vértices (estos pueden ser por ejemplo un modelo 3D) activamos el shader desde nuestra aplicación y cuando el GPU realice los cálculos para la proyección tomará en cuenta los parámetros y métodos del shader; después nuestra los drivers convertirán esa salida generada (aún 3D) a coordenadas de pantalla, este proceso se le conoce como rasterización, con nuestros objetos proyectados en la pantalla podemos modificarlos una vez más, esta vez píxel a píxel. :D<br />Ejemplo<br /><br />Supongamos que tenemos el siguiente código en un archivo .fx, podemos crear estos archivos dando click derecho en nuestro explorador de soluciones y en agregar nuevo Effect:<br /><br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPyOGeAlYmRb9kDApkNbrD7BEBaRThd3u4fGqW32lCBBTG16jc-_fsqL47sHEpeBfHd3Ys2pzqx7Tw/addeffect.PNG" alt="" /><br /><br /><br />Código en Effect1.fx:<br /></p><table style="width: 673px; height: 820px;" align="center"><tbody><tr><td style="vertical-align: top;"><br /></td><td style="vertical-align: top;"><br /></td><td align="left"><pre><span style="font-family:Courier New;"><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Estas</span> <span style="color:#2040a0;">variables</span> <span style="color:#2040a0;">representan</span> <span style="color:#2040a0;">las</span> <span style="color:#2040a0;">matrices</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">posición</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">nuestro</span> <span style="color:#2040a0;">objeto</span><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">la</span> <span style="color:#2040a0;">matriz</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">nuestra</span> <span style="color:#2040a0;">camara</span>, <span style="color:#2040a0;">y</span> <span style="color:#2040a0;">nuestra</span> <span style="color:#2040a0;">proyección</span><br /><span style="color:#2040a0;"><b>float4x4</b></span> <span style="color:#2040a0;">World</span><span style="color:#4444ff;">;</span><br /><span style="color:#2040a0;"><b>float4x4</b></span> <span style="color:#2040a0;">View</span><span style="color:#4444ff;">;</span><br /><span style="color:#2040a0;"><b>float4x4</b></span> <span style="color:#2040a0;">Projection</span><span style="color:#4444ff;">;</span><br /><br /><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Esta</span> <span style="color:#2040a0;">estructura</span> <span style="color:#2040a0;">indica</span> <span style="color:#2040a0;">que</span> <span style="color:#2040a0;">es</span> <span style="color:#2040a0;">lo</span> <span style="color:#2040a0;">que</span> <span style="color:#2040a0;">va</span> <span style="color:#2040a0;">a</span> <span style="color:#2040a0;">tomar</span> <span style="color:#2040a0;">el</span> <span style="color:#2040a0;">shader</span><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">En</span> <span style="color:#2040a0;">este</span> <span style="color:#2040a0;">caso</span> <span style="color:#2040a0;">solo</span> <span style="color:#2040a0;">tomara</span> <span style="color:#2040a0;">la</span> <span style="color:#2040a0;">posición</span> <span style="color:#2040a0;">del</span> <span style="color:#2040a0;">vértice</span>, <span style="color:#2040a0;">podemos</span> <span style="color:#2040a0;">agregar</span><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">las</span> <span style="color:#2040a0;">coordenadas</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">textura</span>, <span style="color:#2040a0;">normales</span>, <span style="color:#2040a0;">colores</span>, <span style="color:#2040a0;">etc</span>.<br /><b>struct</b> <span style="color:#2040a0;">VertexShaderInput</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;"><b>float4</b></span> <span style="color:#2040a0;">Position</span> <span style="color:#4444ff;">:</span> <span style="color:#2040a0;">POSITION0</span><span style="color:#4444ff;">;</span><br /><span style="color:#4444ff;"><b>}</b></span><span style="color:#4444ff;">;</span><br /><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Esto</span> <span style="color:#2040a0;">es</span> <span style="color:#2040a0;">muy</span> <span style="color:#2040a0;">parecido</span> <span style="color:#2040a0;">a</span> <span style="color:#2040a0;">la</span> <span style="color:#2040a0;">estructura</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">entrada</span>, <span style="color:#2040a0;">pero</span> <span style="color:#2040a0;">aquí</span> <span style="color:#2040a0;">especificamos</span><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">que</span> <span style="color:#2040a0;">queremos</span> <span style="color:#2040a0;">que</span> <span style="color:#2040a0;">devuelva</span> <span style="color:#2040a0;">nuestro</span> <span style="color:#2040a0;">método</span><br /><b>struct</b> <span style="color:#2040a0;">VertexShaderOutput</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;"><b>float4</b></span> <span style="color:#2040a0;">Position</span> <span style="color:#4444ff;">:</span> <span style="color:#2040a0;">POSITION0</span><span style="color:#4444ff;">;</span><br /><span style="color:#4444ff;"><b>}</b></span><span style="color:#4444ff;">;</span><br /><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Esta</span> <span style="color:#2040a0;">función</span> <span style="color:#2040a0;">es</span> <span style="color:#2040a0;">nuestro</span> <span style="color:#2040a0;">vertex</span> <span style="color:#2040a0;">shader</span><br /><span style="color:#2040a0;">VertexShaderOutput</span> <span style="color:#2040a0;">VertexShaderFunction</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">VertexShaderInput</span> <span style="color:#2040a0;">input</span><span style="color:#4444ff;">)</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;">VertexShaderOutput</span> <span style="color:#2040a0;">output</span><span style="color:#4444ff;">;</span><br /> <br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Sólo</span> <span style="color:#2040a0;">aplicaremos</span> <span style="color:#2040a0;">una</span> <span style="color:#2040a0;">sencilla</span> <span style="color:#2040a0;">transormación</span><br /> <span style="color:#2040a0;"><b>float4</b></span> <span style="color:#2040a0;">worldPosition</span> = <span style="color:#2040a0;">mul</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">input</span>.<span style="color:#2040a0;">Position</span>, <span style="color:#2040a0;">World</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;"><b>float4</b></span> <span style="color:#2040a0;">viewPosition</span> = <span style="color:#2040a0;">mul</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">worldPosition</span>, <span style="color:#2040a0;">View</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">output</span>.<span style="color:#2040a0;">Position</span> = <span style="color:#2040a0;">mul</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">viewPosition</span>, <span style="color:#2040a0;">Projection</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <b>return</b> <span style="color:#2040a0;">output</span><span style="color:#4444ff;">;</span><br /><span style="color:#4444ff;"><b>}</b></span><br /><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Esta</span> <span style="color:#2040a0;">función</span> <span style="color:#2040a0;">es</span> <span style="color:#2040a0;">nuestro</span> <span style="color:#2040a0;">pixel</span> <span style="color:#2040a0;">shader</span><br /><span style="color:#2040a0;"><b>float4</b></span> <span style="color:#2040a0;">PixelShaderFunction</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">VertexShaderOutput</span> <span style="color:#2040a0;">input</span><span style="color:#4444ff;">)</span> <span style="color:#4444ff;">:</span> <span style="color:#2040a0;">COLOR0</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Aquí</span> <span style="color:#2040a0;">especificamos</span> <span style="color:#2040a0;">que</span> <span style="color:#2040a0;">queremos</span> <span style="color:#2040a0;">que</span> <span style="color:#2040a0;">para</span> <span style="color:#2040a0;">todo</span> <span style="color:#2040a0;">pí</span><span style="color:#2040a0;">xel</span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">que</span> <span style="color:#2040a0;">se</span> <span style="color:#2040a0;">dibuje</span> <span style="color:#2040a0;">lo</span> <span style="color:#2040a0;">pinte</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">color</span> <span style="color:#2040a0;">rojo</span> <span style="color:#4444ff;">:</span><span style="color:#4444ff;">)</span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">podemos</span> <span style="color:#2040a0;">por</span> <span style="color:#2040a0;">ejemplo</span> <span style="color:#2040a0;">regresar</span> <span style="color:#2040a0;">el</span> <span style="color:#2040a0;">valor</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">una</span> <span style="color:#2040a0;">textura</span> <span style="color:#2040a0;">respecto</span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">a</span> <span style="color:#2040a0;">la</span> <span style="color:#2040a0;">coordenada</span> <span style="color:#2040a0;">actual</span><br /> <b>return</b> <span style="color:#2040a0;"><b>float4</b></span><span style="color:#4444ff;">(</span> <span style="color:#ff0000;">1</span>, <span style="color:#ff0000;">0</span>, <span style="color:#ff0000;">0</span>, <span style="color:#ff0000;">1</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><span style="color:#4444ff;"><b>}</b></span><br /><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Aqui</span> <span style="color:#2040a0;">especificamos</span> <span style="color:#2040a0;">nuestras</span> <span style="color:#2040a0;">técnicas</span><br /><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">un</span> <span style="color:#2040a0;">archivo</span> <span style="color:#2040a0;">fx</span> <span style="color:#2040a0;">puede</span> <span style="color:#2040a0;">tener</span> <span style="color:#2040a0;">varias</span> <span style="color:#2040a0;">técnicas</span><br /><span style="color:#2040a0;">technique</span> <span style="color:#2040a0;">Technique1</span><br /><span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Para</span> <span style="color:#2040a0;">cada</span> <span style="color:#2040a0;">pasada</span> <span style="color:#2040a0;">especificamos</span> <span style="color:#2040a0;">que</span> <span style="color:#2040a0;">funciones</span> <span style="color:#2040a0;">vamos</span> <span style="color:#2040a0;">a</span> <span style="color:#2040a0;">llamar</span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">y</span> <span style="color:#2040a0;">ademas</span> <span style="color:#2040a0;">debemos</span> <span style="color:#2040a0;">de</span> <span style="color:#2040a0;">decirle</span> <span style="color:#2040a0;">bajo</span> <span style="color:#2040a0;">que</span> <span style="color:#2040a0;">perfil</span> <span style="color:#2040a0;">se</span> <span style="color:#2040a0;">compilarán</span><br /> <span style="color:#2040a0;">pass</span> <span style="color:#2040a0;">Pass1</span><br /> <span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;">VertexShader</span> = <span style="color:#2040a0;">compile</span> <span style="color:#2040a0;">vs_1_1</span> <span style="color:#2040a0;">VertexShaderFunction</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">PixelShader</span> = <span style="color:#2040a0;">compile</span> <span style="color:#2040a0;">ps_1_1</span> <span style="color:#2040a0;">PixelShaderFunction</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#4444ff;"><b>}</b></span><br /><span style="color:#4444ff;"><b>}</b></span> <br /></span></pre></td></tr></tbody></table><br /><br /><br />Para utilizarlo vamos a modificar nuestra clase Game1.cs:<br /><br />Primero, vamos a declarar dos objetos en nuestra clase, uno para el modelo que utilizaremos y otro para nuestro efecto:<br /><br /><table style="width: 681px; height: 51px;" align="center"><tbody><tr><td style="vertical-align: top;"><br /></td><td style="vertical-align: top;"><br /></td><td style="vertical-align: top;"><br /></td><td style="vertical-align: top;"></td><td style="vertical-align: top;"><br /></td><td align="left"><pre><span style="font-family:Courier New;"><span style="color:#2040a0;">Model</span> <span style="color:#2040a0;">_model</span><span style="color:#4444ff;">;</span><br /><span style="color:#2040a0;">Effect</span> <span style="color:#2040a0;">_effect</span><span style="color:#4444ff;">;</span><br /></span></pre></td></tr></tbody></table><br />Después vamos a modificar nuestra función LoadContent() para poder cargar nuestros archivos:<br /><br /><br /><table align="center"><tbody><tr><td style="vertical-align: top;"><br /></td><td align="left"><pre><span style="font-family:Courier New;"> <b>protected</b> <b>override</b> <span style="color:#2040a0;"><b>void</b></span> <span style="color:#2040a0;">LoadContent</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><br /> <span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span> <span style="color:#2040a0;">Create</span> <span style="color:#2040a0;">a</span> <b>new</b> <span style="color:#2040a0;">SpriteBatch</span>, <span style="color:#2040a0;">which</span> <span style="color:#2040a0;">can</span> <span style="color:#2040a0;">be</span> <span style="color:#2040a0;">used</span> <span style="color:#2040a0;">to</span> <span style="color:#2040a0;">draw</span> <span style="color:#2040a0;">textures</span>.<br /> <span style="color:#2040a0;">spriteBatch</span> = <b>new</b> <span style="color:#2040a0;">SpriteBatch</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">GraphicsDevice</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;">_model</span> = <span style="color:#2040a0;">Content</span>.<span style="color:#2040a0;">Load</span><<span style="color:#2040a0;">Model</span>><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">model</span>"<span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">_effect</span> = <span style="color:#2040a0;">Content</span>.<span style="color:#2040a0;">Load</span><<span style="color:#2040a0;">Effect</span>><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">Effect1</span>"<span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Esto</span> <span style="color:#2040a0;">va</span> <span style="color:#2040a0;">a</span> <span style="color:#2040a0;">quitarle</span> <span style="color:#2040a0;">el</span> <span style="color:#2040a0;">efecto</span> <span style="color:#2040a0;">actual</span> <span style="color:#2040a0;">al</span> <span style="color:#2040a0;">modelo</span> <span style="color:#2040a0;">y</span> <span style="color:#2040a0;">establecera</span> <span style="color:#2040a0;">el</span> <span style="color:#2040a0;">que</span><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">le</span> <span style="color:#2040a0;">estamos</span> <span style="color:#2040a0;">asignando</span><br /> <b>foreach</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">ModelMesh</span> <span style="color:#2040a0;">mesh</span> <span style="color:#2040a0;">in</span> <span style="color:#2040a0;">_model</span>.<span style="color:#2040a0;">Meshes</span><span style="color:#4444ff;">)</span><br /> <b>foreach</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">ModelMeshPart</span> <span style="color:#2040a0;">part</span> <span style="color:#2040a0;">in</span> <span style="color:#2040a0;">mesh</span>.<span style="color:#2040a0;">MeshParts</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">part</span>.<span style="color:#2040a0;">Effect</span> = <span style="color:#2040a0;">_effect</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span> <span style="color:#2040a0;">TODO</span><span style="color:#4444ff;">:</span> <span style="color:#2040a0;">use</span> <b>this</b>.<span style="color:#2040a0;">Content</span> <span style="color:#2040a0;">to</span> <span style="color:#2040a0;">load</span> <span style="color:#2040a0;">your</span> <span style="color:#2040a0;">game</span> <span style="color:#2040a0;">content</span> <span style="color:#2040a0;">here</span><br /> <span style="color:#4444ff;"><b>}</b></span><br /> <b>protected</b> <b>override</b> <span style="color:#2040a0;"><b>void</b></span> <span style="color:#2040a0;">Draw</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">GameTime</span> <span style="color:#2040a0;">gameTime</span><span style="color:#4444ff;">)</span><br /> <span style="color:#4444ff;"><b>{</b></span><br /> <span style="color:#2040a0;">graphics</span>.<span style="color:#2040a0;">GraphicsDevice</span>.<span style="color:#2040a0;">Clear</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">Color</span>.<span style="color:#2040a0;">CornflowerBlue</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <br /> <span style="color:#2040a0;"><b>float</b></span> <span style="color:#2040a0;">aspectRatio</span> = <span style="color:#2040a0;">graphics</span>.<span style="color:#2040a0;">GraphicsDevice</span>.<span style="color:#2040a0;">Viewport</span>.<span style="color:#2040a0;">Width</span> <span style="color:#4444ff;">/</span><br /><span style="color:#2040a0;">graphics</span>.<span style="color:#2040a0;">GraphicsDevice</span>.<span style="color:#2040a0;">Viewport</span>.<span style="color:#2040a0;">Height</span><span style="color:#4444ff;">;</span><br /><br /><br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Definimos</span> <span style="color:#2040a0;">la</span> <span style="color:#2040a0;">tecnica</span><br /> <span style="color:#2040a0;">_effect</span>.<span style="color:#2040a0;">CurrentTechnique</span> = <span style="color:#2040a0;">_effect</span>.<span style="color:#2040a0;">Techniques</span><span style="color:#4444ff;">[</span>"<span style="color:#2040a0;">Technique1</span>"<span style="color:#4444ff;">]</span><span style="color:#4444ff;">;</span><br /><br /> <span style="color:#2040a0;">_effect</span>.<span style="color:#2040a0;">Parameters</span><span style="color:#4444ff;">[</span>"<span style="color:#2040a0;">World</span>"<span style="color:#4444ff;">]</span>.<span style="color:#2040a0;">SetValue</span><br /><span style="color:#4444ff;">(</span><span style="color:#2040a0;">Matrix</span>.<span style="color:#2040a0;">CreateWorld</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">Vector3</span>.<span style="color:#2040a0;">Zero</span>, <span style="color:#2040a0;">Vector3</span>.<span style="color:#2040a0;">Forward</span>, <span style="color:#2040a0;">Vector3</span>.<span style="color:#2040a0;">Up</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">_effect</span>.<span style="color:#2040a0;">Parameters</span><span style="color:#4444ff;">[</span>"<span style="color:#2040a0;">View</span>"<span style="color:#4444ff;">]</span>.<span style="color:#2040a0;">SetValue</span><br /><span style="color:#4444ff;">(</span><span style="color:#2040a0;">Matrix</span>.<span style="color:#2040a0;">CreateLookAt</span><span style="color:#4444ff;">(</span><b>new</b> <span style="color:#2040a0;">Vector3</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">0</span>.<span style="color:#ff0000;">0f</span>, <span style="color:#ff0000;">5</span>.<span style="color:#ff0000;">0f</span>, <span style="color:#4444ff;">-</span><span style="color:#ff0000;">10</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span>, <span style="color:#2040a0;">Vector3</span>.<span style="color:#2040a0;">Zero</span>, <span style="color:#2040a0;">Vector3</span>.<span style="color:#2040a0;">Up</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#2040a0;">_effect</span>.<span style="color:#2040a0;">Parameters</span><span style="color:#4444ff;">[</span>"<span style="color:#2040a0;">Projection</span>"<span style="color:#4444ff;">]</span>.<span style="color:#2040a0;">SetValue</span><br /><span style="color:#4444ff;">(</span><span style="color:#2040a0;">Matrix</span>.<span style="color:#2040a0;">CreatePerspectiveFieldOfView</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">MathHelper</span>.<span style="color:#2040a0;">ToRadians</span><span style="color:#4444ff;">(</span><span style="color:#ff0000;">45</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span>,<br /> <span style="color:#2040a0;">aspectRatio</span>, <span style="color:#ff0000;">1</span>.<span style="color:#ff0000;">0f</span>, <span style="color:#ff0000;">10000</span>.<span style="color:#ff0000;">0f</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <br /> <span style="color:#4444ff;">/</span><span style="color:#4444ff;">/</span><span style="color:#2040a0;">Actualizamos</span> <span style="color:#2040a0;">el</span> <span style="color:#2040a0;">shader</span><br /> <span style="color:#2040a0;">_effect</span>.<span style="color:#2040a0;">CommitChanges</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /> <b>foreach</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">ModelMesh</span> <span style="color:#2040a0;">mesh</span> <span style="color:#2040a0;">in</span> <span style="color:#2040a0;">_model</span>.<span style="color:#2040a0;">Meshes</span><span style="color:#4444ff;">)</span><br /> <b>foreach</b> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">Effect</span> <span style="color:#2040a0;">effect</span> <span style="color:#2040a0;">in</span> <span style="color:#2040a0;">mesh</span>.<span style="color:#2040a0;">Effects</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">mesh</span>.<span style="color:#2040a0;">Draw</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /><br /> <span style="color:#2040a0;">base</span>.<span style="color:#2040a0;">Draw</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">gameTime</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /> <span style="color:#4444ff;"><b>}</b></span><br /></span></pre></td></tr></tbody></table><br /><br />Por último vamos a dibujar nuestro modelo con el shader correspondiente y el resultado debe de ser el modelo dibujado completamente en rojo, y esta es la imagen de nuestro primer shader:<br /><br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPwbp7iY9G01esO4gKFCRWFl_EoZKtwTBm18DYMNec_jMbhQZmjNCxvQgKQ-AB40cNQswwwRmt8npw/render.PNG" alt="" /><br /><br /><br />¿No es interesante? Bueno, es nuestro "hola, mundo!" de los shaders, así que de aquí podremos partir a cosas más interesantes como iluminación, a continuación les voy a presentar una imagen de un render un poco más complejo:<br /><br /><img src="http://bfhoig.blu.livefilestore.com/y1p_usKbtf9jPyCR-nGrOzXUvODdv0lO8PVhxbPVbZ90fNKWEiRnKjROCREpqBgzxoJW5YxJgxmZH5MaGTILEOL5Q/shaders.jpg" alt="" /><br /><br />Este render contiene 3 shaders, uno para los reflejos del agua, otro para el brillo de la nave, y otro que le da un efecto de zoom radial. :)<br /><br /><br />Conclusiones<br /><br />Los shaders se utilizan para prácticamente todo el procesamiento de gráficos, algunas aplicaciones lo manejan automáticamente pero si quieres tener el control completo y agregar efectos a tus aplicaciones gráficas la mejor manera es meterle mano.<br /><br />Los shaders no solo se utilizan en videojuegos o aplicaciones 3D, también se utilizan en edición de imágenes o vídeo, en un futuro tutorial hablaré de como crear shaders de post producción (como los que se utilizan para las películas). <p> </p> <iframe src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/Shader.zip" marginheight="0" marginwidth="0" style="margin: 3px; padding: 0pt; width: 240px; height: 66px;" mce_src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/Shader.zip" frameborder="0" scrolling="no"></iframe>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-38792917693145463762008-09-13T06:31:00.000-05:002008-09-13T06:33:52.303-05:00SceneGraphs en XNAHoy en día cuando queremos hacer un videojuego relativamente grande con gráficos 3D es muy complicado manejar los objetos necesitamos actualizar de uno por uno, para resolver este problema existe una estructura de datos muy utilizada llamada SceneGraphs, que básicamente son estructuras que almacenan toda la información de manera jerárquica dentro de un grafo o árbol y nos permite “olvidarnos” de cada objeto, ya que esta estructura se encargará de clasificarlos y manejarlos automáticamente.<br /> <br /><a href="http://bfhoig.blu.livefilestore.com/y1pxGdhBeFbUY72p6kDxDNoo_j1R0JxA4UQ2b3C4tj20Ls7FRLmkhAP2oxFS9dE3eg-aqOu2AqP1uKj9nYN9Ew1Hw/01.jpg"><br /><img src="http://bfhoig.blu.livefilestore.com/y1pxGdhBeFbUY72p6kDxDNoo_j1R0JxA4UQ2b3C4tj20Ls7FRLmkhAP2oxFS9dE3eg-aqOu2AqP1uKj9nYN9Ew1Hw/01.jpg" alt="Bloom Cubemap" align="middle" border="0" /></a><a> <br /></a><br /> Para este ejemplo vamos a utilizar una implementación muy sencilla que solo requerirá que almacenemos nuestros datos dentro de una colección linear de elementos esto es que cada nodo contendrá solamente un nodo hijo, con esto vamos a poder viajar a través del SG por medio de iteraciones lineares.<br /><br />Durante estos recorridos nosotros vamos a poder actualizar el estado de nuestro SG, y además vamos a poder dibujar el contenido que necesite ser mostrado.<br /><br /><a href="http://bfhoig.blu.livefilestore.com/y1pPw-mMPRVGDpeXKZCc6qyux0qTWVahhXo9hcDFnz_ntWIR_R7dcEVVXNThYfKZJVn5VR9ljdxldk/02.jpg"><br /><img src="http://bfhoig.blu.livefilestore.com/y1pPw-mMPRVGDpeXKZCc6qyux0qTWVahhXo9hcDFnz_ntWIR_R7dcEVVXNThYfKZJVn5VR9ljdxldk/02.jpg" alt="Bloom Cubemap" align="middle" border="0" /></a><a> <br /></a><br /><br />En nuestro ejemplo cada nodo representara un elemento gráfico del juego, este elemento puede ser un modelo, un terreno, un shader, un sistema de partículas, en fin, prácticamente cualquier objeto que podamos dibujar en la pantalla, claro en este ejemplo nos limitaremos a un modelo 3D.<br /><br />Para esto lo primero que debemos de definir es nuestra Clase Objeto, que es la clase base de donde partirán todas las entidades, en este caso vamos a dejarlas con los elementos más comunes, a su vez vamos a crear una clase Modelo la cual será heredará a la clase objeto y tendrá implementada una interfaz IRendereable, que nos permitirá saber que nuestro modelo se puede dibujar.<br /><br /><a href="http://bfhoig.blu.livefilestore.com/y1pQ7J1_oRhYLUoXLzpdpnhobmoVFqgGxk2ftYNlH1EpsL6Fw4ay8UrCODza6d5dJkaZdV13tuSS4A/03.jpg"><br /><img src="http://bfhoig.blu.livefilestore.com/y1pQ7J1_oRhYLUoXLzpdpnhobmoVFqgGxk2ftYNlH1EpsL6Fw4ay8UrCODza6d5dJkaZdV13tuSS4A/03.jpg" alt="Bloom Cubemap" align="middle" border="0" /></a><a> <br /></a><br /><br /><br />Por ahora el elemento model es el único que vamos a utilizar en nuestro SG, así que vayamos a la parte interesante de este tutorial, el scene graph:<br /><br /><a href="http://bfhoig.blu.livefilestore.com/y1peiocC_giJIGezaJFJkyyosQR09ku4PW2uxlPPgNU9Gm8ikdjFyGFAGJs8XlQftajyO2omhgKyvM/04.jpg"><br /><img src="http://bfhoig.blu.livefilestore.com/y1peiocC_giJIGezaJFJkyyosQR09ku4PW2uxlPPgNU9Gm8ikdjFyGFAGJs8XlQftajyO2omhgKyvM/04.jpg" alt="Bloom Cubemap" align="middle" border="0" /></a><a> <br /></a><br /> <br />Como podemos observar en el diagrama anterior nuestro SG contine un nodo principal que será nuestra raíz, y un método que nos permite agregar más elementos al mismo, después tenemos nuestra clase que contiene la información a nuestra clase object, de la cual se derivan todas las clases que podemos ingresar al SceneGraph para se dibujas, además tenemos una clase que es el nodo básico de cada escena, esta clase nos permite accesar a los nodos de nuestro SG para poder hacer las llamas a los objetos correspondientes a cada nodo.<br /><br /><br />:D, El código esta disponible en mi skydrive por si alguien quiere hecharle un ojo ;) <br /><br /> <iframe src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/SceneGraphTutorial.rar" marginheight="0" marginwidth="0" style="margin: 3px; padding: 0pt; width: 240px; height: 66px;" mce_src="http://cid-a1001085413ee7ad.skydrive.live.com/embedrowdetail.aspx/P%c3%bablico/SceneGraphTutorial.rar" frameborder="0" scrolling="no"></iframe>carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0tag:blogger.com,1999:blog-31152350.post-41546569873792180712008-09-13T06:23:00.001-05:002008-09-13T06:30:40.270-05:00LINQ to XML - El ejemplo de C#<pre>LINQ (Language INtegrated Query) es un conjunto de clases que como su<br />nombre lo dice, te permiten hacer consultas a nivel nativo (dentro de<br />C# y VB.NET) a datos que pueden provenir de un arreglo, de una base de<br />datos relacional, declases enumerables o como lo veremos en este<br />pequeño ejemplo de XML. :D<br /><br /><br />Supongamos que tenemos el siguiente XML en una cadena llamada xmlString:<br /><br /></pre><table align="center" border="0" frame="border" width="80%"><tbody><tr><td align="left"><pre><span style="font-family:Courier New;"><<span style="color:#2040a0;">root</span>><br /> <<span style="color:#2040a0;">var</span>><br /> <<span style="color:#2040a0;">tag</span>><span style="color:#2040a0;">atributo1</span><<span style="color:#4444ff;">/</span><span style="color:#2040a0;">tag</span>><br /> <<span style="color:#4444ff;">/</span><span style="color:#2040a0;">var</span>><br /> <<span style="color:#2040a0;">var</span>><br /> <<span style="color:#2040a0;">tag</span>><span style="color:#2040a0;">atributo2</span><<span style="color:#4444ff;">/</span><span style="color:#2040a0;">tag</span>><br /> <<span style="color:#4444ff;">/</span><span style="color:#2040a0;">var</span>><br /><<span style="color:#4444ff;">/</span><span style="color:#2040a0;">root</span>><br /></span></pre></td></tr></tbody></table><br />Para leer todos las varibles simplemente hacemos una consulta con LINQ en un stilo muy similar a como la realizariamos en SQL:<br /><br /><table align="center" border="0" frame="border" width="80%"><tbody><tr><td align="left"><pre><span style="font-family:Courier New;"><span style="color:#2040a0;">XDocument</span> <span style="color:#2040a0;">data</span> = <span style="color:#2040a0;">XDocument</span>.<span style="color:#2040a0;">Parse</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">xmlSring</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /><span style="color:#2040a0;">var</span> <span style="color:#2040a0;">elements</span> = <span style="color:#2040a0;">from</span> <span style="color:#2040a0;">c</span> <span style="color:#2040a0;">in</span> <span style="color:#2040a0;">data</span>.<span style="color:#2040a0;">Descendants</span><span style="color:#4444ff;">(</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">select</span> <span style="color:#2040a0;">c</span><span style="color:#4444ff;">;</span><br /><br /><strong>foreach</strong> <span style="color:#4444ff;">(</span><span style="color:#2040a0;">var</span> <span style="color:#2040a0;">c</span> <span style="color:#2040a0;">in</span> <span style="color:#2040a0;">data</span>.<span style="color:#2040a0;">Descendants</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">var</span>"<span style="color:#4444ff;">)</span><span style="color:#4444ff;">)</span><br /> <span style="color:#2040a0;">Console</span>.<span style="color:#2040a0;">WriteLine</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">c</span>.<span style="color:#2040a0;">Element</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">tag</span>"<span style="color:#4444ff;">)</span>.<span style="color:#2040a0;">Value</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span> </span></pre></td></tr></tbody></table><br />Este código mostrara en lineas separas todos los elementos "var".<br /><br />Ahora, supongamos que queremos agregar mas elementos "var", lo único que debemos hacer es:<br /><br /><table align="center" border="0" frame="border" width="80%"><tbody><tr><td align="left"><pre><span style="font-family:Courier New;"><span style="color:#2040a0;">XElement</span> <span style="color:#2040a0;">newKey</span> =<br /> <strong>new</strong> <span style="color:#2040a0;">XElement</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">var</span>",<br /> <strong>new</strong> <span style="color:#2040a0;">XElement</span><span style="color:#4444ff;">(</span>"<span style="color:#2040a0;">tag</span>", "<span style="color:#2040a0;">Value</span>"<span style="color:#4444ff;">)</span><br /> <span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><br /><span style="color:#2040a0;">data</span>.<span style="color:#2040a0;">Root</span>.<span style="color:#2040a0;">Add</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">newKey</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span><br /><span style="color:#2040a0;">data</span>.<span style="color:#2040a0;">Save</span><span style="color:#4444ff;">(</span><span style="color:#2040a0;">_file</span><span style="color:#4444ff;">)</span><span style="color:#4444ff;">;</span> </span></pre></td></tr></tbody></table><br />Y listo ;)<br /><br />Para mi gusto LINQ te permite ahorrar muchisimo tiempo, y además es muy amigable, particularme a la hora de manejar XML ya que antes era un tanto enredoso hacer consultas.carloshttp://www.blogger.com/profile/07321172499476049163noreply@blogger.com0