The engine is ExcaliburJS. About the lighting, since the library does not provide anything related, I achieved a similar (yet very, very raw) effect of "lighting" using a PostProcessing Shader. The approach is straightforward:
Let me describe the shader I used (here) using this stripped version:
// As uniforms, you need (at least) uniform sampler2D u_image; // current image uniform vec2 u_resolution; // screen resolution uniform int u_lightCount; // light count uniform vec2 u_lightPos[16]; // light position uniform float u_lightIntensity[16]; // light intensity in vec2 v_texcoord; // text coords out vec4 fragColor; // final color void main() { // Here I get the current pixel color vec4 tex = texture(u_image, v_texcoord); // Compute pixel position // Since its a post processing effect, its fairly easy vec2 px_pos = vec2(v_texcoord.x * u_resolution.x, (1.0 - v_texcoord.y) * u_resolution.y); // Find intesity of lighting float maxIntensity = 0.0; // here you store the maximum for (int i = 0; i < u_lightCount; i++) { // iterate over lights vec2 lightPos = u_lightPos[i]; // get light pos (in screen coordinates!) float lightIntensity = u_lightIntensity[i]; // get light intensity vec2 diff = lightPos - px_pos; // compute distance vector float dist = length(diff); // get magnitude of the distance vector // Enter only if in light range if (dist < lightIntensity) { float dOverI = (dist / lightIntensity); // divide by maximum distance to get value between 0 and 1 float intensity = (dOverI > 0.75) ? 0.5 : 1.0; // set intesity to half above 75% of distance maxIntensity = max(maxIntensity, intensity); // update maximum } } // Set final pixel color using intesity fragColor.rgb = tex.rgb * maxIntensity; fragColor.a = tex.a; // alpha is untouched }
It's pretty simple and rough but can get the job done in less time than a solid lighting equation.
Let me know! If you need anything more, send me an email and we can share discord handles and chat there!