locked
¿Cómo hacer una linterna 2D? RRS feed

  • Pregunta

  • Hola a todos, hace un par de años estuve haciendo un proyecto en XNA, y desde entonces por distintos motivos lo he dejado de lado. Ahora estoy retomandolo de nuevo y me he encontrado con un hueso duro de roer: las luces. Estoy haciendo un pequeño juego chorra visto desde arriba en el que un personaje lleva una linterna y busca por un laberinto una serie de gemas. Lo que necesito es que todo lo que esté fuera de la linterna no aparezca (se vea negro) y solo se vea el personaje y lo que haya dentro del área de la linterna. Adjunto un pantallazo para que se vea mejor

     

    http://img824.imageshack.us/img824/2630/ejemploxna.jpg

    La linterna actualmente es la textura blanca triangular. He leído por ahí cosas sobre el RenderTarget, pero sinceramente no entiendo demasiado. El código que estoy utilizando para dibujarlo es el siguiente (el proyecto es XNA 4.0 por lo que algunos ejemplos que he encontrado no me sirven):

                luzRenderTarget = new RenderTarget2D(GraphicsDevice, Constantes.ANCHO_PANTALLA, Constantes.ALTO_PANTALLA);                       

                GraphicsDevice.SetRenderTarget(luzRenderTarget);
                GraphicsDevice.Clear(Color.Black);
                spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive);
                spriteBatch.Draw(cono, posicionCono, null, Color.White, rotacionCono, origenCono, escalaCono, SpriteEffects.None, 1);
                spriteBatch.End();

                GraphicsDevice.SetRenderTarget(null);

                spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);

                spriteBatch.Draw(suelo, Vector2.Zero, Color.White);
                foreach (Rectangle paredColision in listaParedesColision)
                {
                    spriteBatch.Draw(texturaPared, paredColision, Color.White);
                }

                foreach (Rectangle gemaColision in listaGemasColision)
                {
                    spriteBatch.Draw(gema, gemaColision, Color.White);
                }

                spriteBatch.Draw(personaje, posicionPersonaje, Color.White);
                spriteBatch.DrawString(fuenteLetras, "Gemas restantes: " + listaGemasColision.Count, posicionGemasRestantes, Color.White);
                spriteBatch.DrawString(fuenteLetras, "Puntos totales: " + puntos, posicionPuntos, Color.White);
                spriteBatch.End();

                spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive);
                //GraphicsDevice.BlendState.AlphaSourceBlend = Blend.Zero;
                //GraphicsDevice.BlendState.AlphaDestinationBlend = Blend.SourceColor;
                spriteBatch.Draw(luzRenderTarget, new Rectangle(0, 0, Constantes.ANCHO_PANTALLA, Constantes.ALTO_PANTALLA), Color.White);
                spriteBatch.End();

    Sin embargo este código como habéis podido ver en el archivo adjunto, me lo dibuja todo. ¿Podéis ayudarme?

    También quiero especificar que me gustaría evitar usar HLSL.

    Saludos y muchas gracias!!




    lunes, 13 de junio de 2011 11:04

Respuestas

Todas las respuestas