From b7b4d540da0d040f3d03f52346d39d6b824a437f Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 17 Aug 2022 20:22:46 +0000 Subject: [PATCH] half-functional DragToSelectPlugin for KissExtendedSprites --- src/kiss_flixel/DragToSelectPlugin.hx | 77 +++++++++++++++++++++++++++ src/kiss_flixel/KissExtendedSprite.hx | 21 +++++++- 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/kiss_flixel/DragToSelectPlugin.hx diff --git a/src/kiss_flixel/DragToSelectPlugin.hx b/src/kiss_flixel/DragToSelectPlugin.hx new file mode 100644 index 0000000..1f61488 --- /dev/null +++ b/src/kiss_flixel/DragToSelectPlugin.hx @@ -0,0 +1,77 @@ +package kiss_flixel; + +import flixel.FlxG; +import flixel.addons.plugin.FlxMouseControl; +import flixel.FlxState; +import flixel.FlxCamera; +import flixel.FlxBasic; +import flixel.math.FlxPoint; +import flixel.math.FlxRect; + +typedef DragState = { + camera:FlxCamera, + debugLayer:DebugLayer, + enabledSprites:Array, + selectedSprites:Array, + firstCorner:Null, + secondCorner:Null +}; + +/** + * Added automatically when you call enableDragToSelect() on a KissExtendedSprite. + */ +class DragToSelectPlugin extends FlxBasic { + var dragStates:Map = []; + + public function new() { + super(); + } + + public function enableSprite(s:KissExtendedSprite, ?state:FlxState, ?camera:FlxCamera) { + if (!dragStates.exists(state)) { + if (state == null) state = FlxG.state; + if (camera == null) camera = FlxG.camera; + dragStates[state] = { + camera: camera, + debugLayer: new DebugLayer(), + enabledSprites: [s], + selectedSprites: [], + firstCorner: null, + secondCorner: null + }; + dragStates[state].debugLayer.cameras = [camera]; + state.add(dragStates[state].debugLayer); + } else { + dragStates[state].enabledSprites.push(s); + } + } + + public override function update(elapsed:Float) { + if (dragStates.exists(FlxG.state)) { + var dragState = dragStates[FlxG.state]; + dragState.debugLayer.clear(); + + // Might have to skip a frame after justPressed, so KissExtendedSprites + // can get first access to the mouse input + if (FlxMouseControl.dragTarget == null) { + if (FlxG.mouse.justPressed) { + dragState.firstCorner = FlxG.mouse.getWorldPosition(dragState.camera); + } else if (FlxG.mouse.justReleased) { + dragState.firstCorner = null; + } + dragState.secondCorner = FlxG.mouse.getWorldPosition(dragState.camera); + if (dragState.firstCorner != null) { + var rounded1 = dragState.firstCorner.copyTo(); + var rounded2 = dragState.secondCorner.copyTo(); + for (r in [rounded1, rounded2]) { + r.x = Std.int(r.x); + r.y = Std.int(r.y); + } + var rect = new FlxRect().fromTwoPoints(rounded1, rounded2); + if (!rect.isEmpty) + dragState.debugLayer.drawFlxRect(rect); + } + } + } + } +} \ No newline at end of file diff --git a/src/kiss_flixel/KissExtendedSprite.hx b/src/kiss_flixel/KissExtendedSprite.hx index 20fa323..d7d0848 100644 --- a/src/kiss_flixel/KissExtendedSprite.hx +++ b/src/kiss_flixel/KissExtendedSprite.hx @@ -3,12 +3,14 @@ package kiss_flixel; import flixel.FlxG; import flixel.FlxCamera; import flixel.FlxSprite; +import flixel.FlxState; import flixel.math.FlxPoint; import flixel.system.FlxAssets; import flixel.util.FlxColor; import flixel.addons.plugin.FlxMouseControl; import flixel.util.FlxCollision; import flash.display.BitmapData; +import kiss_flixel.DragToSelectPlugin; class KissExtendedSprite extends flixel.addons.display.FlxExtendedSprite { public function new(X:Float = 0, Y:Float = 0, ?SimpleGraphic:FlxGraphicAsset) @@ -77,6 +79,15 @@ class KissExtendedSprite extends flixel.addons.display.FlxExtendedSprite { resetStartPos(); } + public function enableDragToSelect(?state:FlxState) { + var plugin = FlxG.plugins.get(DragToSelectPlugin); + if (plugin == null) { + plugin = new DragToSelectPlugin(); + FlxG.plugins.add(plugin); + } + plugin.enableSprite(this, state, thisCamera()); + } + override function update(elapsed:Float) { #if debug // color = (mouseOver && pixelPerfect(_dragPixelPerfectAlpha)) ? FlxColor.LIME : FlxColor.WHITE; @@ -98,9 +109,17 @@ class KissExtendedSprite extends flixel.addons.display.FlxExtendedSprite { } } + function thisCamera() { + if (cameras != null && cameras.length > 0) + return cameras[0]; + return FlxG.camera; + } + + + #if FLX_MOUSE override function get_mouseOver() { - var mouseOver = getScreenBounds(cameras[0]).containsPoint(FlxG.mouse.getScreenPosition(cameras[0])); + var mouseOver = getScreenBounds(thisCamera()).containsPoint(FlxG.mouse.getScreenPosition(thisCamera())); return mouseOver; }