Hollywoo-flixel do polygon-based lighting
This commit is contained in:
@@ -18,9 +18,25 @@ import flixel.text.FlxText;
|
|||||||
import flixel.system.FlxSound;
|
import flixel.system.FlxSound;
|
||||||
import flixel.FlxCamera;
|
import flixel.FlxCamera;
|
||||||
import flixel.util.FlxTimer;
|
import flixel.util.FlxTimer;
|
||||||
|
import flixel.math.FlxPoint;
|
||||||
import haxe.Constraints;
|
import haxe.Constraints;
|
||||||
import kiss_flixel.SpriteTools;
|
import kiss_flixel.SpriteTools;
|
||||||
import haxe.ds.Option;
|
import haxe.ds.Option;
|
||||||
|
using flixel.util.FlxSpriteUtil;
|
||||||
|
import openfl.display.BitmapData;
|
||||||
|
import openfl.display.BitmapDataChannel;
|
||||||
|
import openfl.geom.Rectangle;
|
||||||
|
import openfl.geom.Point;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build())
|
@:build(kiss.Kiss.build())
|
||||||
class FlxDirector implements Director<FlxSprite, FlxScreenPosition, ActorFlxSprite, FlxSound, String, FlxSprite, FlxSound, FlxCamera, FlxLightSource> {}
|
class FlxDirector implements Director<FlxSprite, FlxScreenPosition, ActorFlxSprite, FlxSound, String, FlxSprite, FlxSound, FlxCamera, FlxLightSource> {
|
||||||
|
public static function blackAlphaMaskFlxSprite(sprite:FlxSprite, mask:FlxSprite, output:FlxSprite):FlxSprite
|
||||||
|
{
|
||||||
|
sprite.drawFrame();
|
||||||
|
var data:BitmapData = sprite.pixels.clone();
|
||||||
|
data.copyChannel(mask.pixels, new Rectangle(0, 0, sprite.width, sprite.height), new Point(), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
|
||||||
|
output.pixels = data;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -31,6 +31,8 @@
|
|||||||
(setSprite.updateHitbox)
|
(setSprite.updateHitbox)
|
||||||
(setSprite.screenCenter))
|
(setSprite.screenCenter))
|
||||||
(otherwise))
|
(otherwise))
|
||||||
|
// TODO draw a sky background depending on time of day, int/ext
|
||||||
|
|
||||||
(FlxG.cameras.remove flxMovie.uiCamera false)
|
(FlxG.cameras.remove flxMovie.uiCamera false)
|
||||||
(FlxG.cameras.remove flxMovie.screenCamera false)
|
(FlxG.cameras.remove flxMovie.screenCamera false)
|
||||||
(FlxG.cameras.add camera)
|
(FlxG.cameras.add camera)
|
||||||
@@ -45,6 +47,41 @@
|
|||||||
(FlxG.state.remove set)
|
(FlxG.state.remove set)
|
||||||
(cc))
|
(cc))
|
||||||
|
|
||||||
|
(method :FlxSprite drawLight [:FlxLightSource source]
|
||||||
|
(lightSprite.drawPolygon source.points source.color (object color FlxColor.TRANSPARENT))
|
||||||
|
(lightMask.drawPolygon source.points FlxColor.BLACK (object color FlxColor.TRANSPARENT)))
|
||||||
|
|
||||||
|
(var EVENING_COLOR (FlxColor.fromRGBFloat 0.5 0 0.5 0.2))
|
||||||
|
(var NIGHT_COLOR (FlxColor.fromRGBFloat 0 0 0 0.5))
|
||||||
|
(prop &mut :FlxSprite lightSprite null)
|
||||||
|
(prop &mut :FlxSprite lightMask null)
|
||||||
|
(prop &mut :FlxSprite darkness null)
|
||||||
|
(prop &mut :FlxColor darkColor FlxColor.BLACK)
|
||||||
|
(method :Void showLighting [:SceneTime sceneTime :Array<FlxLightSource> lightSources :FlxCamera camera]
|
||||||
|
|
||||||
|
(set lightSprite (new FlxSprite))
|
||||||
|
(lightSprite.makeGraphic FlxG.width FlxG.height FlxColor.TRANSPARENT true)
|
||||||
|
(set lightMask (new FlxSprite))
|
||||||
|
(lightMask.makeGraphic FlxG.width FlxG.height FlxColor.WHITE true)
|
||||||
|
(set darkness (new FlxSprite))
|
||||||
|
// TODO handle morning better
|
||||||
|
(set darkColor (case sceneTime
|
||||||
|
(Evening EVENING_COLOR)
|
||||||
|
(Night NIGHT_COLOR)
|
||||||
|
(otherwise FlxColor.TRANSPARENT)))
|
||||||
|
(darkness.makeGraphic FlxG.width FlxG.height darkColor true)
|
||||||
|
(doFor source lightSources (drawLight source))
|
||||||
|
(blackAlphaMaskFlxSprite darkness lightMask darkness)
|
||||||
|
(set lightSprite.cameras [flxMovie.screenCamera])
|
||||||
|
(set darkness.alpha darkColor.alphaFloat)
|
||||||
|
(set darkness.cameras [flxMovie.screenCamera])
|
||||||
|
(FlxG.state.add darkness)
|
||||||
|
(FlxG.state.add lightSprite))
|
||||||
|
|
||||||
|
(method :Void hideLighting []
|
||||||
|
(FlxG.state.remove darkness)
|
||||||
|
(FlxG.state.remove lightSprite))
|
||||||
|
|
||||||
(method :Void cleanup [] 0)
|
(method :Void cleanup [] 0)
|
||||||
|
|
||||||
(method :Option<AutoZConfig> autoZConfig [] (Some (object zPerLayer flxMovie.STAGE_BEHIND_DY frontLayer 0)))
|
(method :Option<AutoZConfig> autoZConfig [] (Some (object zPerLayer flxMovie.STAGE_BEHIND_DY frontLayer 0)))
|
||||||
|
Reference in New Issue
Block a user