Sistema dynamic de "nivel de luz" basado en niveles alfa

Mi equipo y yo hemos estado trabajando en un juego en Java utilizando el motor Slick2D y hay algunas cuestiones en las que tengo preguntas. A partir de ahora, el código que he escrito básicamente toma una function de coseno y obtiene un valor basado en el time de juego actual (que está normalizado por un múltiplo de Pi, como 4 * Pi, para darnos un punto (o día) longitud) de 4 * Pi). El valor que sale de la function se usa directamente como el nivel alfa de la capa de luz que se superpone para que, a medida que se acerca la noche, la pantalla se oscurezca hasta que sea completamente opaca, y finalmente vuelva a ser completamente transparente. También creé una máscara alnetworkingedor del jugador, lo que impide que el nivel alfa se acerque al jugador.

Ahora, esto se ve genial y todo, pero si quiero dibujar diferentes niveles alfa alnetworkingedor de eso , algunos incluso pueden ser inexistentes hasta que comienza a oscurecerse como una transición alfa promedio que va desde el alfa 100% transparente cerca del jugador al alfa 100% opaco fuera de esa máscara durante el tono negro de la noche, me topa con problemas. Captura de pantalla

Básicamente, Slick proporciona algunas herramientas, como valores estáticos en la class Graphics que cambian el modo de dibujo. Algunos ejemplos son: MODE_ADD, MODE_ADD_ALPHA, etc. Me pregunto si hay un resumen especialmente bueno sobre el uso de estos para get resultados donde tengo niveles alfa que varían entre el nivel alfa general actual y el 100% de transparencia para que pueda crear transiciones limpias por lo que no tiene ese corte limpio que se ve en la captura de pantalla.

O debería rascar esto e ir con un sistema basado en cuadrícula / célula ya que el mosaico del juego se basa cuando se trata de dibujar las capas de background, excepto las entidades. Podría tener un poco más de sentido y parecer un poco más natural con los backgrounds, aunque aún parezca un poco antinatural.

EDITAR: También estaría abierto a otros paradigmas.

Use MODE_COLOR_MULTIPLY, pero sin alfa. Va a terminar dibujando una image (RGB, pero no alfa) sobre la pantalla usando multiplicar.

Construye esta image (NO utilizando el modo multiplicar, pero combinando normalmente) dibujando blanco puro durante el día, negro puro durante la noche y un color gris durante el crepúsculo, como lo has hecho. Luego, alnetworkingedor de la location del jugador, dibuja una image de caída suave usando el modo de fusión aditiva. Esta image falloff no tiene un canal alfa, y es negra alnetworkingedor de los bordes y blanca en el medio. Aquí está la parte importante: la image que está dibujando no tiene un canal alfa. Esto se debe a que está codificando el nivel de luz en la image real, no en el canal alfa. Como beneficio adicional, puedes apoyar luces de colors. Al usar la mezcla de aditivos, puede agregar luces para otros personajes o para el entorno (pero tenga cuidado de que ninguno de ellos sea demasiado shiny).

Una vez que esta image esté preparada, dibuja sobre la pantalla usando MULTIPLY. Esto funciona porque la luz es fundamentalmente object_color * incoming_light. Básicamente, lo que ya está en la pantalla es object_color, y está calculando una image que representa el incoming_light en function de la hora del día y dónde está el carácter. ¡Aunque tu juego está basado en pixel art y en 2D, no significa que no pueda tener una iluminación fresca!

(Sugerencia: puede hacer que sea de color naranja rojizo al atardecer, azul-púrpura al atardecer / noche, amarillo al amanecer, blanco pálido durante la luna llena, y azul claro en la mañana para un efecto realmente genial. colors para adaptarse a su estilo de arte. Simplemente cambie el color del rectángulo que dibuje sobre la escena; no hay ninguna razón para que sea blanco, gris o negro).

(Sugerencia n. ° 2: Al dibujar la luz del reproductor, desactívela por completo durante el día, luego haga que se desvanezca rápidamente en algún momento durante la noche y tinte de naranja para simular una linterna (sería lógico que el personaje tenga una durante este hora).)