<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Speaking in .NET</title>
	<atom:link href="http://speakingin.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://speakingin.net</link>
	<description></description>
	<lastBuildDate>Mon, 23 Jan 2012 22:25:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Supersampling</title>
		<link>http://speakingin.net/2012/01/17/supersampling/</link>
		<comments>http://speakingin.net/2012/01/17/supersampling/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 21:30:03 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1407</guid>
		<description><![CDATA[Nueva entrega de ja serie sobre técnicas de antialiasing,  esta vez en DesarrolloWeb.com. Espero que os sirva]]></description>
			<content:encoded><![CDATA[<p>Nueva entrega de ja serie <a title="Serie de técnicas de antialiasing" href="http://speakingin.net/introduccion-al-aliasing/" target="_blank">sobre técnicas de antialiasing</a>,  esta vez en<a title="Enlace al artículo en DesarrolloWeb" href="http://desarrolloweb.com/articulos/supersampling.html" target="_blank"> DesarrolloWeb.com.</a></p>
<p>Espero que os sirva</p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/17/supersampling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Azure</title>
		<link>http://speakingin.net/2012/01/16/windows-azure/</link>
		<comments>http://speakingin.net/2012/01/16/windows-azure/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 20:45:44 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Charlas]]></category>
		<category><![CDATA[Scott Guthrië]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[charlas]]></category>
		<category><![CDATA[Scott Guthrie]]></category>
		<category><![CDATA[Scottgu]]></category>
		<category><![CDATA[Windows Azure]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1403</guid>
		<description><![CDATA[Como algunos ya sabréis he pasado la mayor parte del tiempo de los últimos 6 meses trabajando en Windows Azure - que es la plataforma en la nube de Microsoft (Continúo liderando los equipos que han creado ASP.NET, partes del nucleo de .NET y VS, y algunos productos más). Estoy muy orgulloso de lo que vamos <a href='http://speakingin.net/2012/01/16/windows-azure/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Como algunos ya sabréis he pasado la mayor parte del tiempo de los últimos 6 meses trabajando en <a title="Página oficial de Windows Azure" href="https://www.windowsazure.com/es-es/" target="_blank">Windows Azure</a> - que es la plataforma en la nube de <strong>Microsoft</strong> (Continúo liderando los equipos que han creado <strong>ASP.NET</strong>, partes del nucleo de <strong>.NET</strong> y <strong>VS</strong>, y algunos productos más).<span id="more-1403"></span></p>
<p>Estoy muy orgulloso de lo que vamos a hacer con<a title="Página oficial de Windows Azure" href="https://www.windowsazure.com/es-es/" target="_blank"> Windows Azure</a> - va a permitir un montón de nuevos escenarios para los desarrolladores. En los próximos meses voy a hablar un montón sobre esto &#8211; veremos lo que ofrece y cómo podemos aprovecharlo.</p>
<p><span style="text-decoration: underline;"><strong>Charla de Windows Azure</strong></span></p>
<p>Ántes de vacaciones hicimos un evento especial &#8220;Learn Windows zure&#8221;. Tenéis disponible una grabación de la charla que dí. Son unos 90 minutos hablando sobre <strong>Windows Azure, </strong>en la que vemos qué es y cómo funciona, y enseñamos un montón de demos y código sobre cómo programarla. Podéis ver la <a title="Charla de Windows Azure" href="http://channel9.msdn.com/Events/windowsazure/learn/Keynote-Getting-Started-with-Windows-Azure" target="_blank">charla online</a>, descargar <a title="Slides de Windows Azure" href="http://media.ch9.ms/windowsazure/learn/GettingStartedwithWindowsAzure-ScottGuthrie.pptx" target="_blank">las slides </a>y los <a title="DEscarga los ejemplos de Windows Azure" href="http://go.microsoft.com/fwlink/?LinkID=130354" target="_blank">ejemplos</a>:</p>
<p><a href="http://channel9.msdn.com/Events/windowsazure/learn/Keynote-Getting-Started-with-Windows-Azure" target="_blank"><img title="image" src="http://weblogs.asp.net/blogs/scottgu/image_40D30DDF.png" alt="image" width="772" height="392" border="0" /></a></p>
<p>En las próximas semanas y meses blogearé más, conoceremos más profundamente <strong>Windows Azure </strong>y veremos qué podemos hacer, y además aprenderemos a usarla.</p>
<p>Espero que sirva.</p>
<p>Scott.</p>
<p><strong>Traducido por: Juan María Laó Ramos.</strong></p>
<p><strong><a title="Artículo original en inglés" href="http://weblogs.asp.net/scottgu/archive/2012/01/15/windows-azure.aspx" target="_blank">Artículo original.</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/16/windows-azure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Os presento al antipatrón for-if</title>
		<link>http://speakingin.net/2012/01/11/os-presento-al-antipatron-for-if/</link>
		<comments>http://speakingin.net/2012/01/11/os-presento-al-antipatron-for-if/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 00:01:45 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Patrones]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1395</guid>
		<description><![CDATA[Todos lo hemos escrito alguna vez, por prisas, es tarde y queremos irnos a casa, estamos agotados &#8230; Lo cierto es que a todos nos pasa, al menos a mi y termino escribiendo cosas como: for (int i = 0; i &#60; 100; i++) { if (i == 42) { hagoAlgo(i); } } Lo más <a href='http://speakingin.net/2012/01/11/os-presento-al-antipatron-for-if/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Todos lo hemos escrito alguna vez, por prisas, es tarde y queremos irnos a casa, estamos agotados &#8230;<span id="more-1395"></span></p>
<p>Lo cierto es que a todos nos pasa, al menos a mi y termino escribiendo cosas como:</p>
<p>for (int i = 0; i &lt; 100; i++) {<br />
if (i == 42) { hagoAlgo(i); }<br />
}</p>
<p>Lo más normal es haber escrito:</p>
<p>hagoAlgo(42);</p>
<p>Este anti-patrón tiene muchas formas. Por ejemplo:</p>
<p>foreach (string filename in Directory.GetFiles(&#8220;.&#8221;))<br />
{<br />
if (filename.Equals(&#8220;desktop.ini&#8221;, <a href="http://blogs.msdn.com/b/michkap/archive/2005/09/22/472596.aspx" target="_blank">StringComparison.OrdinalIgnoreCase</a>))<br />
{<br />
return new StreamReader(filename);<br />
}<br />
}</p>
<p>Buscamos el archivo que se llame &#8220;desktop.ini&#8221; y devolvemos el stream, sip, cuando lo más natural, una vez visto esto, es haber escrito algo así:</p>
<p>if (File.Exists(&#8220;desktop.ini&#8221;))<br />
{<br />
return new StreamReader(&#8220;desktop.ini&#8221;);<br />
}</p>
<p>Por favor, tomémonos las cosas con más calma que luego pasa lo que pasa.</p>
<p>El problema es que esto es sólo una parte del código, si sumamos todas las &#8220;patochadas&#8221; que hacemos sin pensar resulta que tenemos un proyecto lleno de cosas como esta y terminamos preguntándonos ¿esto lo he hecho yo?. Pero aún peor cuando un compañero o tu mismo jefe ve este tipo de cosas.</p>
<p>Desde aquí pido mis más sinceras disculpas por escribir este tipo de cosas.</p>
<p>Y es que no me doy ni cuenta y llamo a esta forma de programar JITO (&#8220;Just In Time Obfuscation&#8221;).</p>
<p>Espero que os sirva.</p>
<p><strong>Juan María Laó Ramos.</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/11/os-presento-al-antipatron-for-if/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cómo obtener una señal sin aliasing</title>
		<link>http://speakingin.net/2012/01/10/como-obtener-una-senal-sin-aliasing/</link>
		<comments>http://speakingin.net/2012/01/10/como-obtener-una-senal-sin-aliasing/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 00:00:36 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[Desarrollo]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1377</guid>
		<description><![CDATA[Éste es el cuarto post de la serie sobre aliasing. En el segundo post de la serie vimos porqué se producía aliasing cuando digitalizamos señales. Los peores escenarios ocurren cuando se reduce el número de muestras para representar la señal, o cuando la propia señal incluye datos a frecuencia muy altas. En concreto, hay un <a href='http://speakingin.net/2012/01/10/como-obtener-una-senal-sin-aliasing/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Éste es el cuarto post de la <a title="Indice de post sobre aliasing" href="http://speakingin.net/introduccion-al-aliasing/" target="_blank">serie sobre aliasing</a>. En el <a title="SEgundo post de la serie" href="http://speakingin.net/2011/12/06/%c2%bfporque-la-digitalizacion-de-senales-causa-el-aliasing/" target="_blank">segundo post de la serie </a>vimos porqué se producía aliasing cuando digitalizamos señales. Los peores escenarios ocurren cuando se reduce el número de muestras para representar la señal, o cuando la propia señal incluye datos a frecuencia muy altas. En concreto, hay un valor mágico conocido como <a title="Teorema de Nyquist" href="http://es.wikipedia.org/wiki/Teorema_de_muestreo_de_Nyquist-Shannon" target="_blank">el teorema de Nyquist</a>, que indica la mitad de la velocidad de muestreo que debemos usar. Si la señal de origen tiene información a una mayor frecuencia que esa medida, tendremos problemas de aliasing.<br />
<span id="more-1377"></span></p>
<p>En otras palabras: debemos tener al menos una frecuencia de muestreo del doble de aquella frecuencia más alta de la señal origen.</p>
<p>Esto nos deja dos formas de evitar el aliasing:</p>
<ol>
<li>Aumentar la frecuencia de muestreo</li>
<li>Tener menos detalles de la señal de entrada:</li>
</ol>
<p style="padding-left: 60px;">a) Suavizar (a.k.a. blur) la señal de entrada para eliminar las frecuencias altas.</p>
<p style="padding-left: 60px;">b) Suavizar (a.k.a. filter) al vuelo a medida que vamos tomando las muestras.</p>
<p>La opción 2.a se suele aplicar como preprocesamiento, haciéndolo muy eficiente. Pero no es buena idea cuando necesitamos muestrear datos a diferentes frecuencias dependiendo de la situación (por ejemplo las texturas necesitan escalarse dependiendo de la distancia de la camara). Si pre-suavizamos la señal de acuerdo a la frecuencia más baja nunca podremos reconstruirla, el resultado será demasiado borroso cuando la reconstruyamos a altas frecuencias. Y si pre-suavizamos a alta frecuencia, tendremos problemas de aliasing cuando la reconstruyamos a baja frecuencia.</p>
<p>La opción 2.b se puede ajustar dinámicamente a la frecuencia, pero es muy costosa de implementar.</p>
<p>Una tercera opción es asumir que todo es digital y no entrar en esto. En algunas situaciones  es posible trabajar sólo con ecuaciones matemáticas, transformando una señal en otra aplicando transformaciones matemáticas a las ecuaciones que las describen. Esta solución evita de manera inherente la solución digital, evitando así producir cualquier aliasing, pero las matemáticas se vuelven muy complejas. No suele usarse esto, pero muchos renderizadores offline lo usan como RenderMan.</p>
<p>Bueno, ya está bien de teoría. En el próximo post veremos algo de práctica.</p>
<p><strong>Juan María Laó Ramos.</strong><br />
<a href="http://blogs.msdn.com/b/shawnhar/archive/2011/04/20/how-to-resample-a-signal-without-aliasing.aspx">Artículo original</a></p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/10/como-obtener-una-senal-sin-aliasing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El juego de la vida en XNA para Windows Phone</title>
		<link>http://speakingin.net/2012/01/09/el-juego-de-la-vida-en-xna-para-windows-phone/</link>
		<comments>http://speakingin.net/2012/01/09/el-juego-de-la-vida-en-xna-para-windows-phone/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 00:00:54 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[WP7]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[El juego de la vida]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1388</guid>
		<description><![CDATA[Me ha parecido muy interesante el post de Shawn Hargreaves preguntándose si el SpriteBatch es una máquina de Turing, implementado para demostrarlo el juego de la vida y lo ha hecho en http://blogs.msdn.com/b/shawnhar/archive/2011/12/29/is-spritebatch-turing-complete.aspx. Aquí tenéis la traducción: Inspirado por una serie de twitts: Scionwest- @shawnhargreaves @nickgravely Cómo va el post procesado en WP7? He visto <a href='http://speakingin.net/2012/01/09/el-juego-de-la-vida-en-xna-para-windows-phone/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Me ha parecido muy interesante el post de <a title="Enlace al post original" href="http://blogs.msdn.com/b/shawnhar/archive/2011/12/29/is-spritebatch-turing-complete.aspx" target="_blank">Shawn Hargreaves </a>preguntándose si el SpriteBatch es una máquina de Turing, implementado para demostrarlo el juego de la vida y lo ha hecho en <a href="http://blogs.msdn.com/b/shawnhar/archive/2011/12/29/is-spritebatch-turing-complete.aspx">http://blogs.msdn.com/b/shawnhar/archive/2011/12/29/is-spritebatch-turing-complete.aspx.</a></p>
<p>Aquí tenéis la traducción:<span id="more-1388"></span></p>
<p>Inspirado por una serie de twitts:</p>
<p><em>Scionwest- @shawnhargreaves @nickgravely Cómo va el post procesado en WP7? He visto a gente hacer efectos de Bloom y eso no es parte de WP7?</em></p>
<p><em>nickgravelyn &#8211; @Scionwest Los shaders no están disponibles, pero he visto ejemplos de post procesado muy inteligente con custom shaders. Teóricamente puedes hacerlo basándote en la CPU, pero también puedes usar blend states para conseguir efectos increíbles.</em></p>
<p>(Es un tema muy interesante y algún día volveré a él).</p>
<p>Me encontré a mi mismo pensando &#8220;bueno, seguro que puedes implementar bloom,ya que  el subconjunto de gráficos Reach de Windows Phone son <a title="Definición de Turing Complete" href="http://en.wikipedia.org/wiki/Turing_completeness" target="_blank">Turing complete</a>, así que podríamos hacer lo que queramos con el suficiente ingenio. Puede que no se fácil, eficiente o con sentido, pero todo es posible&#8230;&#8221;</p>
<p>Así que pensé ¿es realmente posible?</p>
<p>Podemos sumar y restar a traves de blend states, y realizar comparaciones con AlphaTestEffect, lo que parece ser suficiente para permitir crear algoritmos arbitrarios (al menos si ignoramos cosas mundanas como el tiempo y el espacio <img src='http://speakingin.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ¿Pero puedo &#8220;probar&#8221; que XNA en Windows Phone es suficiente para permitir una computación en la GPU Turing complete?</p>
<p>El juego de la vida de Conway ha probado ser una forma universal de máquina de Turing, así que me puesto a ver si puedo implementarlo en la GPU sin usar custom shaders.</p>
<p>A partir de la plantilla de Game por defecto, he declarado dos rendertargets para que mantengan el estado de la simulación:</p>
<p>&nbsp;</p>
<pre class="csharpcode">    <span class="kwrd">const</span> <span class="kwrd">int</span> width = 256;
    <span class="kwrd">const</span> <span class="kwrd">int</span> height = 128;

    RenderTarget2D currentState;
    RenderTarget2D nextState;</pre>
<p>Además otros dos objetos de ayuda:</p>
<pre class="csharpcode">    AlphaTestEffect alphaTestEffect;

    Texture2D singleWhitePixel;</pre>
<p>Estos objetos los inicializo en el LoadContent:</p>
<pre class="csharpcode">    currentState = <span class="kwrd">new</span> RenderTarget2D(GraphicsDevice, width, height, <span class="kwrd">false</span>, SurfaceFormat.Color, DepthFormat.Depth24Stencil8);
    nextState    = <span class="kwrd">new</span> RenderTarget2D(GraphicsDevice, width, height, <span class="kwrd">false</span>, SurfaceFormat.Color, DepthFormat.Depth24Stencil8);

    alphaTestEffect = <span class="kwrd">new</span> AlphaTestEffect(GraphicsDevice);

    singleWhitePixel = <span class="kwrd">new</span> Texture2D(GraphicsDevice, 1, 1);
    singleWhitePixel.SetData(<span class="kwrd">new</span> Color[] { Color.White });</pre>
<p>Para hacerlo más interesante, el juego de la vida debe ser inicializado a algo más que simples ceros. Este código (al final del LoadContent) hace una inicialización de los datos iniciales:</p>
<pre class="csharpcode">    Color[] initialData = <span class="kwrd">new</span> Color[width * height];

    initialData[3 + 1 * width] = Color.White;
    initialData[3 + 2 * width] = Color.White;
    initialData[3 + 3 * width] = Color.White;
    initialData[2 + 3 * width] = Color.White;
    initialData[1 + 2 * width] = Color.White;

    currentState.SetData(initialData);</pre>
<p>Para un estado inicial más interesante, añadimos esto (ántes de la llamada currenState.SetData) para aleatorizar las células:</p>
<pre class="csharpcode">    Random random = <span class="kwrd">new</span> Random();

    <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; 10000; i++)
    {
        initialData[random.Next(width * height)] = Color.White;
    }</pre>
<p>El código del Draw es simple. Usa SamplerState.PointClamp para escalar el estado de la simulación ha pantalla completa, sin ningún filtro:</p>
<pre class="csharpcode">    SimulateLife();

    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin(SpriteSortMode.Deferred, <span class="kwrd">null</span>, SamplerState.PointClamp, <span class="kwrd">null</span>, <span class="kwrd">null</span>);
    spriteBatch.Draw(currentState, GraphicsDevice.Viewport.Bounds, Color.White);
    spriteBatch.End();</pre>
<p>Vale, esa era la parte repetitiva. Ahora ¿cómo vamos a implementar el método SimluateLife()? La wikipedia define las reglas como:</p>
<ul>
<li>Cualquier célula viva con menos de dos vecinos muere, está despoblada.</li>
<li>Cualquier célula viva con dos o más vecnios vive hasta la próxima generación.</li>
<li>Cualquier célula viva con más de tres vecinos muere, como si fuese por superpoblación.</li>
<li>Cualquier célula muerta con exáctamente tres vecinos se convierte en célula viva, se reproduce.</li>
</ul>
<p>Pero he creido conveniente reagruparlas de manera diferente pero equivalente:</p>
<ul>
<li>Regla 1: Si hay dos vecinos vivos, se mantendrá el estado actual de la célula.</li>
<li>Regla 2: Si hay tres vecinos vivos, la célcula revive.</li>
<li>Regla 3: En otro caso la célula se muere.</li>
</ul>
<p>Ok, vamos a hacerlo, SimluateLife comienza dibujándose en le renderTarget nextState, y seteando el AlphaTestEffect para que sólo acepte píxeles con un alpha mayor de 128, por ejemplo: las células que están vivas:</p>
<pre class="csharpcode">    GraphicsDevice.SetRenderTarget(nextState);

    GraphicsDevice.Clear(Color.Transparent);

    Viewport viewport = GraphicsDevice.Viewport;

    Matrix projection = Matrix.CreateOrthographicOffCenter(0, viewport.Width, viewport.Height, 0, 0, 1);
    Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);

    alphaTestEffect.Projection = halfPixelOffset * projection;

    alphaTestEffect.AlphaFunction = CompareFunction.Greater;
    alphaTestEffect.ReferenceAlpha = 128;</pre>
<p>Vamos a contar cuantos vecinos vivos tiene cada célula, acumulando este valor en un buffer (que se había limpiado con zeros). Hacemos esto dibujando la textura de simulación 8 veces, desplazando un pixel arriba a la izquierda, arriba, arriba y derecha, izquierda, etc. Usamos un blend state que prevenga de dibujar nada al buffer de color, ya que sólo estamos interesados en la generación de símbolos. Este código combina el AlphaTestEffect (que elimina los pixeles de los vecinos muertos) y el buffer de símbolos (que cuenta cuantos vecinos han pasado el test del alpha):</p>
<pre class="csharpcode">    spriteBatch.Begin(SpriteSortMode.Deferred, blendNone, <span class="kwrd">null</span>, stencilAdd, <span class="kwrd">null</span>, alphaTestEffect);

    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2(-1, -1), Color.White);
    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2( 0, -1), Color.White);
    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2( 1, -1), Color.White);
    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2(-1,  0), Color.White);
    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2( 1,  0), Color.White);
    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2(-1,  1), Color.White);
    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2( 0,  1), Color.White);
    spriteBatch.Draw(currentState, <span class="kwrd">new</span> Vector2( 1,  1), Color.White);

    spriteBatch.End();</pre>
<p>Este código usa dos objetos de estado:</p>
<pre class="csharpcode">    <span class="kwrd">static</span> <span class="kwrd">readonly</span> BlendState blendNone = <span class="kwrd">new</span> BlendState
    {
        ColorSourceBlend = Blend.Zero,
        ColorDestinationBlend = Blend.One,

        AlphaSourceBlend = Blend.Zero,
        AlphaDestinationBlend = Blend.One,

        ColorWriteChannels = ColorWriteChannels.None,
    };

    <span class="kwrd">static</span> <span class="kwrd">readonly</span> DepthStencilState stencilAdd = <span class="kwrd">new</span> DepthStencilState
    {
        DepthBufferEnable = <span class="kwrd">false</span>,
        StencilEnable = <span class="kwrd">true</span>,
        StencilFunction = CompareFunction.Always,
        StencilPass = StencilOperation.Increment,
    };</pre>
<p>Ahora tenemos nuestro rendertarget limpiado a cero (lo que significa que están todos muertos, así hemos implementado la tercera regla), mientras que stencil contiene un contador de las celdas vecinas vivas. Ahora vamos a dibujar una copia del estado de la simulación, usando la galería de símbolos para aceptar sólo aquellas células que tengan a dos vecinas vivas, implementando así la regla 1:</p>
<pre class="csharpcode">    spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque, <span class="kwrd">null</span>, stencilDrawIf2, <span class="kwrd">null</span>);
    spriteBatch.Draw(currentState, Vector2.Zero, Color.White);
    spriteBatch.End();</pre>
<p>El último pintado implementa la regla 2 renderizando en blanco (lo que significa que está vivo) aquellas células que tienen 3 vecinos:</p>
<pre class="csharpcode">    spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque, <span class="kwrd">null</span>, stencilDrawIf3, <span class="kwrd">null</span>);
    spriteBatch.Draw(singleWhitePixel, viewport.Bounds, Color.White);
    spriteBatch.End();</pre>
<p>Son necesarios dos objetos de estado:</p>
<pre class="csharpcode">    <span class="kwrd">static</span> <span class="kwrd">readonly</span> DepthStencilState stencilDrawIf2 = <span class="kwrd">new</span> DepthStencilState
    {
        DepthBufferEnable = <span class="kwrd">false</span>,
        StencilEnable = <span class="kwrd">true</span>,
        StencilFunction = CompareFunction.Equal,
        ReferenceStencil = 2,
    };

    <span class="kwrd">static</span> <span class="kwrd">readonly</span> DepthStencilState stencilDrawIf3 = <span class="kwrd">new</span> DepthStencilState
    {
        DepthBufferEnable = <span class="kwrd">false</span>,
        StencilEnable = <span class="kwrd">true</span>,
        StencilFunction = CompareFunction.Equal,
        ReferenceStencil = 3,
    };</pre>
<p>Finalmente, la función SimulateLife quita el rendertarget, intercambia los dos rendertargets, reemplazando el estado actual con el nuevo que hemos calculado:</p>
<pre class="csharpcode">    GraphicsDevice.SetRenderTarget(<span class="kwrd">null</span>);

    Swap(<span class="kwrd">ref</span> currentState, <span class="kwrd">ref</span> nextState);</pre>
<p>La función Swap es tan simple como:</p>
<pre class="csharpcode"><span class="kwrd"> static</span> <span class="kwrd">void</span> Swap&lt;T&gt;(<span class="kwrd">ref</span> T a, <span class="kwrd">ref</span> T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }</pre>
<p>¿Ha funcionado?</p>
<p><a href="http://speakingin.net/wp-content/uploads/2012/01/LifeGame.jpg"><img class="aligncenter size-full wp-image-1389" title="Resultado de la implementación en el emulador de WP7" src="http://speakingin.net/wp-content/uploads/2012/01/LifeGame.jpg" alt="Resultado de la implementación en el emulador de WP7" width="378" height="712" /></a></p>
<p>Chachán!</p>
<p><strong>Traducido por: Juan María Laó Ramos</strong></p>
<p><strong><a title="ARtículo original en Inglés" href="http://blogs.msdn.com/b/shawnhar/archive/2011/12/29/is-spritebatch-turing-complete.aspx" target="_blank">Artículo original.</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/09/el-juego-de-la-vida-en-xna-para-windows-phone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Que significa que mi programa termine con el mensaje &#8220;This application has requested the runtime to terminate it in an unusual way&#8221;?</title>
		<link>http://speakingin.net/2012/01/04/%c2%bfque-significa-que-mi-programa-termine-con-el-mensaje-this-application-has-requested-the-runtime-to-terminate-it-in-an-unusual-way/</link>
		<comments>http://speakingin.net/2012/01/04/%c2%bfque-significa-que-mi-programa-termine-con-el-mensaje-this-application-has-requested-the-runtime-to-terminate-it-in-an-unusual-way/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 00:00:43 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desarrollo]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1375</guid>
		<description><![CDATA[Estamos ejecutando nuestro programa, y de repente sale el mensaje &#8220;This application has requested Runtime to terminate in an unusual way&#8221;. ¿Que ha pasado? El mensaje lo imprime la función abort del runtime de C. Un programa puede llamar a abort explícitamente, o puede ser llamado por el runtime. La macro assert llama a abort cuando ocurre una aserción. Por <a href='http://speakingin.net/2012/01/04/%c2%bfque-significa-que-mi-programa-termine-con-el-mensaje-this-application-has-requested-the-runtime-to-terminate-it-in-an-unusual-way/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div>Estamos ejecutando nuestro programa, y de repente sale el mensaje <strong>&#8220;This application has requested Runtime to terminate in an unusual way&#8221;</strong>. ¿Que ha pasado?</div>
<div></div>
<div>El mensaje lo imprime la función <a title="Descripción de la función abort." href="http://msdn.microsoft.com/en-us/library/k089yyh0.aspx" target="_blank">abort del runtime de C</a>.</div>
<div></div>
<div>Un programa puede llamar a <strong><em>abort</em> </strong>explícitamente, o puede ser llamado por el runtime.</div>
<ul>
<li>La macro <strong><a title="Descripción de la macro Assert" href="http://msdn.microsoft.com/en-us/library/9sb57dw4.aspx" target="_blank"><em>assert</em> </a></strong>llama a abort cuando ocurre una aserción.</li>
<li>Por defecto, la función <a title="Descripción de la función terminate" href="http://msdn.microsoft.com/library/k0k9c522.aspx" target="_blank"><em><strong>terminate</strong></em> </a>llama a <em>abort.</em></li>
</ul>
<p>El estándar de <strong>C++</strong> indica las condiciones bajo las que se llama a <em><strong>terminate</strong>,</em> es una lista muy larga y no vamos a repetirla aquí. Para ver esa lista consulta tu copia favorita de estándares de <strong>C++</strong> para verla. (la razón más común para este problema es que se ha lanzado una excepción y no se ha capturado).</p>
<div>Espero que sirva.</div>
<div></div>
<div><strong>Juan María Laó Ramos.</strong></div>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/04/%c2%bfque-significa-que-mi-programa-termine-con-el-mensaje-this-application-has-requested-the-runtime-to-terminate-it-in-an-unusual-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A mas fps ¿mejor?</title>
		<link>http://speakingin.net/2012/01/03/a-mas-fps-%c2%bfmejor/</link>
		<comments>http://speakingin.net/2012/01/03/a-mas-fps-%c2%bfmejor/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 15:22:45 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1367</guid>
		<description><![CDATA[Ya está disponible la tercera entrega sobre aliasing que estoy realizando desde hace un tiempo. Lo tenéis disponible en Desarrolloweb.com. El índice completo lo podéis encontrar aqui. Espero que os sirva. Juan María Lao Ramos.]]></description>
			<content:encoded><![CDATA[<p>Ya está disponible la tercera entrega sobre aliasing que estoy realizando desde hace un tiempo.</p>
<p>Lo tenéis disponible en <a title="Articulo en desarrollo web." href="http://www.desarrolloweb.com/articulos/mas-fps-mejor.html" target="_blank">Desarrolloweb.com</a>.</p>
<p>El índice completo lo podéis encontrar <a title="Indice de introducción al aliasing" href="http://speakingin.net/introduccion-al-aliasing/" target="_blank">aqui</a>.</p>
<p>Espero que os sirva.</p>
<p><strong>Juan María Lao Ramos.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/03/a-mas-fps-%c2%bfmejor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Determinar programáticamente si un lenguaje es LTR ó RTL</title>
		<link>http://speakingin.net/2012/01/03/determinar-programaticamente-si-un-lenguaje-es-ltr-o-rtl/</link>
		<comments>http://speakingin.net/2012/01/03/determinar-programaticamente-si-un-lenguaje-es-ltr-o-rtl/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 23:04:10 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Desarrollo]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1362</guid>
		<description><![CDATA[LTR= Left To Right y RTL = Right To Left. Dado un LCID en particular, ¿cómo podríamos saber dado un lenguaje determinado si se escribe de izquierda a derecha o de derecha a izquierda? Una primera cosa que se nos podría ocurrir  es &#8220;hard-codear&#8221; la lista de los lenguajes que se escriben de derecha a <a href='http://speakingin.net/2012/01/03/determinar-programaticamente-si-un-lenguaje-es-ltr-o-rtl/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p><strong>LTR= Left To Right y RTL = Right To Left.</strong></p>
<p>Dado un <a title="Qué es LCID." href="http://msdn.microsoft.com/en-us/goglobal/bb964664" target="_blank">LCID</a> en particular, ¿cómo podríamos saber dado un lenguaje determinado si se escribe de<strong> izquierda a derecha</strong> o de <strong>derecha a izquierda</strong>?<span id="more-1362"></span></p>
<p>Una primera cosa que se nos podría ocurrir  es &#8220;<strong>hard-codear</strong>&#8221; la lista de los lenguajes que se escriben de derecha a izquierda, y si el lenguaje que nos interesa no está en la lista asumir que se escribe de izquierda a derecha. Esta técnica es muy frágil, ya que Windows va añadiendo soporte a nuevos lenguajes de forma regular, y si uno de esos es de derecha a izquierda, nuestra tabla se quedará desactualizada. Y además, hay lenguajes que no se escriben de ninguna de esas maneras. Por ejemplo, el chino y el japonés se escriben de arriba abajo.</p>
<p>Para saber programáticamente en qué direccion se escribe un lenguaje, llamamos a <em><a title="Especificación de la función GetLocaleInfoEx" href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd318103(v=vs.85).aspx" target="_blank">GetLocaleInfoEx </a></em>con <em><a title="Definición de LOCALE_IREADINGLAYOUT" href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd373806(v=vs.85).aspx" target="_blank">LOCALE_IREADINGLAYOUT</a>.</em></p>
<p>Y ahora sólo toca esperar a que a nadie se le ocurra crear un lenguaje a base de palíndromos <img src='http://speakingin.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><strong>Juan María Laó Ramos.</strong></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2012/01/03/determinar-programaticamente-si-un-lenguaje-es-ltr-o-rtl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actualización disponible para ASP.NET desde el Jueves 29 de Diciembre</title>
		<link>http://speakingin.net/2011/12/30/actualizacion-disponible-para-asp-net-desde-el-jueves-29-de-diciembre/</link>
		<comments>http://speakingin.net/2011/12/30/actualizacion-disponible-para-asp-net-desde-el-jueves-29-de-diciembre/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 09:59:38 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Guthrie]]></category>
		<category><![CDATA[Scott]]></category>
		<category><![CDATA[Scott Guthrie]]></category>
		<category><![CDATA[Scottgu]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1354</guid>
		<description><![CDATA[Hace unos días MicrosofT publicó un boletín de seguridad anunciando que se iba a publicar una actualización de seguridad para una vulnerabilidad de ASP.NET. La actualización MS11-100 está disponible a través de Windows Update, del Windows Server Update Service y como descarga en el centro de descargas de Microsoft. La actualización resuelve un problema que <a href='http://speakingin.net/2011/12/30/actualizacion-disponible-para-asp-net-desde-el-jueves-29-de-diciembre/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Hace unos días <strong>MicrosofT</strong> publicó un <a title="Boletin de seguridad" href="http://technet.microsoft.com/en-us/security/bulletin/ms11-dec" target="_blank">boletín de seguridad </a>anunciando que se iba a publicar una actualización de seguridad para una <a title="Vulnerabilidad de ASP.NET" href="http://technet.microsoft.com/en-us/security/advisory/2659883" target="_blank">vulnerabilidad de ASP.NET</a>.</p>
<p style="padding-left: 30px;"><span style="color: #ff0000;">La actualización MS11-100 está disponible a través de Windows Update, del Windows Server Update Service y como descarga en el centro de descargas de Microsoft.</span></p>
<p><span style="color: #000000;">La actualización resuelve un problema que permite realizar ataques de denegación de servicio (DoS) presente en todas las versiones de <strong>ASP.NET</strong>. No se han detectado ataques en ninguno de nuestros clientes usando este exploit, pero recomendamos que se aplique la actualización lo antes posible.<span id="more-1354"></span><span style="text-decoration: underline;"><strong>Más sobre el problema de seguridad.</strong></span></span></p>
<p><span style="color: #000000;">El 28 de Diciembre de 2011, en una conferencia sobre seguridad se describió un nuevo método para modificar las estructuras de datos de las tablas hash en frameworks web. Los ataques sobre este tipo de vulnerabilidad son conocidos como &#8220;hash collision attacks&#8221; (ataques de colisión hash).</span></p>
<p><span style="color: #000000;">Estos ataques intentan calcular una tabla hash en servidores con un gran número de elementos cuyas claves devuelven el mismo hash. Estas colisiones de claves reducen significativamente el rendimiento de las operaciones de la tabla hash, y con los suficientes elementos el servidor puede tardar minutos (incluso horas) en resolverlos. Esto bloquea el servidor web y no atiende a las peticiones de los usuarios, resultando en una denegación de servicio (haciendo que el sitio web se vuelva lento y no responda).</span></p>
<p><span style="color: #000000;">Estos ataques no son específicos de un lenguaje particular ni de un sistema operativo. Los ponentes en la conferencia mostraron cómo hacerlo usando peticiones HTTP sobre diferentes frameworks (incluido ASP.NET). Como estos ataques generar incidencias de denegación de servicios con pocas peticiones HTTP, hay una gran probabilidad de que sucedan estos ataques. Recomendamos a nuestro clientes que apliquen la actualización lo más pronto posible.</span></p>
<p><span style="color: #000000;">La actualización se publicó ayer 29 de Diciembre, con esta actualización no se podrán realizar este tipo de ataques. No habrá que modificar ninguna aplicación tras la actualización.</span></p>
<p><span style="text-decoration: underline;"><strong><span style="color: #000000; text-decoration: underline;">Aprende más</span></strong></span></p>
<p><span style="color: #000000;">Podéis aprender más sobre esta vulnerabilidad en el <a title="Microsoft Security Advisory" href="http://technet.microsoft.com/en-us/security/advisory/2659883" target="_blank">Microsoft Security Advisory (2659883)</a>. </span></p>
<p><span style="color: #000000;">Si tenéis alguna pregunta sobre la vulnerabilidad o algún problema con la actualización, podéis postear vuestras preguntas en el foro de <a title="Sitio Security Vulnerability" href="http://forums.asp.net/1233.aspx/1?Security+Vulnerability" target="_blank">Security Vulnerability </a>del sitio <a href="http://www.asp.net">www.asp.net</a>.</span></p>
<p><span style="color: #000000;">Para tener la última información, podéis seguir el twitter del equipo MSRC en <a title="Twitter del equipo MSRC" href="http://www.twitter.com/msftsecresponse" target="_blank">@MSFTSecResponse</a>.</span></p>
<p><span style="color: #000000;">Espero que sirva.</span></p>
<p><span style="color: #000000;">Scott.</span></p>
<p><strong><span style="color: #000000;">Traducido por: Juan María Laó Ramos.</span></strong></p>
<p><strong><span style="color: #000000;"><a title="Artículo original" href="http://weblogs.asp.net/scottgu/archive/2011/12/28/asp-net-security-update-shipping-thursday-dec-29th.aspx" target="_blank">Artículo original</a></span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2011/12/30/actualizacion-disponible-para-asp-net-desde-el-jueves-29-de-diciembre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambios en MediaPlayer en XNA Game Studio 4.0 para Windows Phone</title>
		<link>http://speakingin.net/2011/12/19/cambios-en-mediaplayer-en-xna-game-studio-4-0-para-windows-phone/</link>
		<comments>http://speakingin.net/2011/12/19/cambios-en-mediaplayer-en-xna-game-studio-4-0-para-windows-phone/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 00:00:50 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[WP7]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Desarrollo]]></category>

		<guid isPermaLink="false">http://speakingin.net/?p=1350</guid>
		<description><![CDATA[MediaPlayer, la interfaz para reproducir música en Windows Phone, ha sufrido algún pequeño cambio que puede afectar a nuestras aplicaciones. La cosa es que ya no podemos modificar las propiedades Volume ni IsMuted cuando lo que se está reproduciendo es contenido de Zune. Estos cambios han sido necesarios para que una aplicación no interfiera con <a href='http://speakingin.net/2011/12/19/cambios-en-mediaplayer-en-xna-game-studio-4-0-para-windows-phone/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>MediaPlayer, la interfaz para reproducir música en Windows Phone, ha sufrido algún pequeño cambio que puede afectar a nuestras aplicaciones.<span id="more-1350"></span></p>
<p>La cosa es que ya no podemos modificar las propiedades <em>Volume</em> ni <em>IsMuted</em> cuando lo que se está reproduciendo es contenido de Zune. Estos cambios han sido necesarios para que una aplicación no interfiera con la experiencia de reproducción de música (ya que Zune no tiene elementos en la interfaz gráfica para modificar el volumen ni para desactivarlo).</p>
<p>Podemos ver estos cambios usando sólo el emulador. Si ejecutamos el siguiente código, veremos que los valores asignados a <em>Volume y IsMuted</em> son ignorados mientras se está escuchando la música:</p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">MediaPlayer</span><span style="font-family: Consolas; font-size: 9.5pt;">.Play(<span style="color: blue;">new</span> <span style="color: #2b91af;">MediaLibrary</span>().Songs);</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">MediaPlayer</span><span style="font-family: Consolas; font-size: 9.5pt;">.Volume = .5f;</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">MediaPlayer</span><span style="font-family: Consolas; font-size: 9.5pt;">.IsMuted = <span style="color: blue;">true</span>;</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">Debug</span><span style="font-family: Consolas; font-size: 9.5pt;">.WriteLine(<span style="color: #a31515;">&#8220;Volume: {0}, IsMuted: {1}&#8221;</span>, <span style="color: #2b91af;">MediaPlayer</span>.Volume, <span style="color: #2b91af;">MediaPlayer</span>.IsMuted);</span><span style="font-family: Consolas; font-size: 9.5pt;"> </span></p>
<p class="MsoNormal"><span style="font-family: Consolas; font-size: 9.5pt;">Output:</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; font-size: 9pt;">Volume: 1, IsMuted: False</span></p>
<p class="MsoNormal">Este cambio afectará a aquellas aplicaciones que reemplacen al reproductor de Zune, para aplicaciones y juegos que reproducen su propia música hay un efecto colateral: Y es que como el usuario puede estar escuchando música cuando el juego arranca, si modificamos las propiedades de <em>Volume</em> y <em>IsMuted</em> en la música del juego, esos cambios serán ignorados.</p>
<p class="MsoNormal">Por ejemplo, un patrón común a la hora de reproducir sonidos puede ser como el código siguiente en el que cargamo el sonido, seteamos las propiedades y reproducimos el sonido:</p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">Song</span><span style="font-family: Consolas; font-size: 9.5pt;"> song = Content.Load&lt;<span style="color: #2b91af;">Song</span>&gt;(<span style="color: #a31515;">&#8220;BackgroundMusic&#8221;</span>);</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">MediaPlayer</span><span style="font-family: Consolas; font-size: 9.5pt;">.Volume = 0.5f;</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">MediaPlayer</span><span style="font-family: Consolas; font-size: 9.5pt;">.Play(song);</span></p>
<p>Teniendo esto en cuenta, lo que debemos hacer para poder modificar las propiedades de la música en nuestros juegos es reproducir primero, y modificar las propiedades después, asegurándonos así que esos cambios se van a aplicar a nuestros sonidos</p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">Song</span><span style="font-family: Consolas; font-size: 9.5pt;"> song = Content.Load&lt;<span style="color: #2b91af;">Song</span>&gt;(<span style="color: #a31515;">&#8220;BackgroundMusic&#8221;</span>);</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">MediaPlayer</span><span style="font-family: Consolas; font-size: 9.5pt;">.Play(song);</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;">MediaPlayer</span><span style="font-family: Consolas; font-size: 9.5pt;">.Volume = 0.5f;</span></p>
<p>Si seguimos este patrón, nos aseguraremos evitarnos este &#8220;problemilla&#8221;.</p>
<p><strong>Juan María Laó Ramos.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://speakingin.net/2011/12/19/cambios-en-mediaplayer-en-xna-game-studio-4-0-para-windows-phone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

