2012-03-25 18 views
5

Estoy agregando iluminación a mi juego XNA 2D basado en fichas.2D Tile Lighting

Encontré this artículo útil, pero la forma en que está hecho no es compatible con la colisión. Lo que me gustaría es un método para hacer lo siguiente

  • tener siempre el punto iluminado
  • Colisión (Si el rayo de luz golpea un bloque, a continuación, atenuar el siguiente bloque por cualquier cantidad hasta su oscuro para simular sombras)

He estado buscando por un buen tiempo pero no tuve suerte (Encontré el tutorial de Catalin, pero me pareció un poco avanzado y no se aplicaba bien a los azulejos porque rediseñé todo el juego cada punto)

Respuesta

1

Compartiré mi método para aplicar un efecto de iluminación suave a una cuadrícula de mosaico 2D. ClassicThunder's answer proporciona un buen enlace para las sombras.

En primer lugar, tendremos que calcular los valores de iluminación de cada mosaico que se difuminarán más tarde. Déjame ilustrar cómo funciona esto antes de entrar en el código.

Lighting

Básicamente lo que hacemos es recorrer todos los azulejos, a partir de la parte superior, si un azulejo está en blanco, establezca la variable CurrentLight al brillo máximo, si nos encontramos con un azulejo sólido, establecerla como CurrentLight variable y reste una cantidad de "absorción" del CurrentLight. De esta manera, en nuestra siguiente ficha sólida, cuando establecemos la ficha en el valor CurrentLight, será un poco menor. Este proceso se repite hasta que la matriz se itera.

Ahora habrá un agradable efecto de iluminación de arriba hacia abajo, pero no es tan bueno. Debemos repetir este proceso 3 veces más, de abajo hacia arriba, de izquierda a derecha y de derecha a izquierda. Y puede repetirse más veces para una mejor calidad.

corriendo Básicamente este código en cada azulejo en el bucle

if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light 
    CurrentLightR = tile.Light; 
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light 
    tile.Light = CurLightR; 
if (tile.Light == CurLightR) //If it is the same, subtract absorb values 
    CurrentLight -= tile.Absorb; 

y hay que ir, iluminación agradable azulejo. Sin embargo, si desea un aspecto menos "pixelizado", puede consultar mi question on gamedev para eso.

0

Para la iluminación por píxel, es posible que tenga mirar a otro lado, porque no sé de eso. Para la iluminación por baldosa,

en SpriteBatch.draw, algunos de los métodos sobrecargados toman un color. Cuando utiliza Color.White, el sprite que dibuja SpriteBatch tiene un color normal.

Uso del color multiplicación mediante la creación de un nuevo color (* Color.yourcolor.r flotador, Color.yourcolor.y * flotador, Color.yourcolor.z * flotador, 255)

Básicamente, para obtener el flotador , intente encontrar una fórmula que calcule el brillo del bloque debido a luces cercanas (almacenadas en una matriz o lista, probablemente). Dado que no se necesitan normales para los juegos en 2D, esta fórmula debería ser relativamente fácil.

+0

-1 En 4.0 bajo el comportamiento predeterminado (Color * float) no altera el brillo/oscuridad, altera la transparencia. http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4-0.aspx – ClassicThunder

+0

@ClassicThunder ¿hay alguna forma de evitarlo? suena como la mejor manera – Neomex

4

Eche un vistazo a Catalin's excellent lighting tutorial. Creo que cumple todos sus requisitos.

+0

"(Encontré el tutorial de Catalin, pero parecía un poco avanzado para mí)" Hmm ... supongo que lo miraré de otra manera – Cyral

+0

Vaya disculpa por eso. Pero me temo que la iluminación es un tema bastante avanzado, por lo que será difícil encontrar un tutorial que te enseñe cómo hacerlo y que sea fácil de seguir. – ClassicThunder

+0

Cierto, he estado trabajando en el tutorial y obtuve los puntos de luz para trabajar, solo un poco confundido sobre a dónde llamar a mis DrawTiles() para hacer que las sombras funcionen. Básicamente obtuve una matriz de mosaico [,], pero no puedo entenderla como catalin lo hace con una sola imagen – Cyral