optimize adding additional jigsaw sprites

This commit is contained in:
2022-08-18 18:38:08 +00:00
parent a1c2c05a14
commit dcc3dcfa01
4 changed files with 134 additions and 88 deletions

View File

@@ -39,6 +39,7 @@ import haxe.ds.Option;
import jigsawx.JigsawPiece; import jigsawx.JigsawPiece;
import jigsawx.Jigsawx; import jigsawx.Jigsawx;
import jigsawx.math.Vec2; import jigsawx.math.Vec2;
import kiss_flixel.DragToSelectPlugin;
typedef StartPuzzleFunc = (Int, Int) -> Void; typedef StartPuzzleFunc = (Int, Int) -> Void;

View File

@@ -266,25 +266,44 @@
(set pieceCamera.scroll save.data.scroll)) (set pieceCamera.scroll save.data.scroll))
(unless (and (= lastRewardFileIndex rewardFileIndex) (= lastTotalPoints (m.totalPoints))) (unless (and (= lastRewardFileIndex rewardFileIndex) (= lastTotalPoints (m.totalPoints)))
(set rewardSprite // When the current puzzle has changed:
(new FlxSprite 0 0 (unless (= lastRewardFileIndex rewardFileIndex)
(BitmapData.fromFile (set rewardSprite
currentRewardFile.path))) (new FlxSprite 0 0
(when rewardSprites (BitmapData.fromFile
(remove rewardSprites)) currentRewardFile.path)))
(rewardSprite.setGraphicSize FlxG.width 0)
(rewardSprite.updateHitbox)
(when (> rewardSprite.height FlxG.height)
(rewardSprite.setGraphicSize 0 FlxG.height))
(rewardSprite.updateHitbox)
(rewardSprite.screenCenter)
(unless save.data.zoom (set matchingPiecesLeft (new Map))
(set pieceCamera.zoom rewardSprite.scale.x)) (set matchingPiecesRight (new Map))
(set matchingPiecesUp (new Map))
(set matchingPiecesDown (new Map))
(set pieceData (new Map))
(set connectedPieces (new Map))
(set indexMap (new Map))
(set spriteMap (new Map))
(rewardSprite.setGraphicSize FlxG.width 0)
(rewardSprite.updateHitbox)
(when (> rewardSprite.height FlxG.height)
(rewardSprite.setGraphicSize 0 FlxG.height))
(rewardSprite.updateHitbox)
(rewardSprite.screenCenter)
(set rewardSprites (new FlxTypedGroup)) (unless save.data.zoom
// add rewardSprites group before enabling drag-to-select on instances (set pieceCamera.zoom rewardSprite.scale.x))
(add rewardSprites) (when rewardSprites
#{
var plugin = FlxG.plugins.get(DragToSelectPlugin);
plugin.clearEnabledSprites();
}#
(rewardSprites.destroy)
(remove rewardSprites)
(set rewardSprites null)))
(unless rewardSprites
(set rewardSprites (new FlxTypedGroup))
// add rewardSprites group before enabling drag-to-select on instances
(add rewardSprites))
(doFor map [matchingPiecesLeft matchingPiecesRight matchingPiecesUp matchingPiecesDown] (doFor map [matchingPiecesLeft matchingPiecesRight matchingPiecesUp matchingPiecesDown]
(map.clear)) (map.clear))
@@ -325,84 +344,86 @@
angle (ifLet [angle (dictGet (the Map<Int,Float> save.data.storedAngles) i)] angle (ifLet [angle (dictGet (the Map<Int,Float> save.data.storedAngles) i)]
angle angle
(nth startingAngles i)) (nth startingAngles i))
s (new KissExtendedSprite pos.x pos.y) &mut s (dictGet spriteMap i)
source (new FlxSprite) source (new FlxSprite)
mask (new FlxSprite) mask (new FlxSprite)
sourceRect (new Rectangle (/ jig.xy.x ros) (/ jig.xy.y ros) (/ jig.wh.x ros) (/ jig.wh.y ros))] sourceRect (new Rectangle (/ jig.xy.x ros) (/ jig.xy.y ros) (/ jig.wh.x ros) (/ jig.wh.y ros))]
(set s.angle angle) (unless s
(set s.priorityID i) (set s (new KissExtendedSprite pos.x pos.y))
(dictSet (the Map<Int,FlxPoint> save.data.storedPositions) i pos) (set s.angle angle)
(set s.priorityID i)
(dictSet (the Map<Int,FlxPoint> save.data.storedPositions) i pos)
(setNth spriteGrid jig.row jig.col s) (setNth spriteGrid jig.row jig.col s)
(setNth indexGrid jig.row jig.col i) (setNth indexGrid jig.row jig.col i)
(dictSet pieceData i jig) (dictSet pieceData i jig)
(dictSet indexMap s i) (dictSet indexMap s i)
(dictSet spriteMap i s) (dictSet spriteMap i s)
(set s.draggable true) (set s.draggable true)
(s.enableDragToSelect) (s.enableDragToSelect)
(s.enableMouseDrag false true) (s.enableMouseDrag false true)
(set s.mouseStartDragCallback (set s.mouseStartDragCallback
->:Void [s x y] ->:Void [s x y]
(let [s (cast s KissExtendedSprite)] (let [s (cast s KissExtendedSprite)]
(set s.priorityID (+ 1 .priorityID (last (the kiss.List<KissExtendedSprite> rewardSprites.members)))) (set s.priorityID (+ 1 .priorityID (last (the kiss.List<KissExtendedSprite> rewardSprites.members))))
(let [connectedPieces (recursivelyConnectedPieces s)] (let [connectedPieces (recursivelyConnectedPieces s)]
// Bring currently held pieces to the front: // Bring currently held pieces to the front:
(rewardSprites.bringAllToFront connectedPieces)) (rewardSprites.bringAllToFront connectedPieces))
(set draggingSprite s) (set draggingSprite s)
(set draggingLastPos (new FlxPoint s.x s.y)))) (set draggingLastPos (new FlxPoint s.x s.y))))
(set s.mouseStopDragCallback (set s.mouseStopDragCallback
->:Void [s x y] ->:Void [s x y]
(let [s (cast s KissExtendedSprite)] (let [s (cast s KissExtendedSprite)]
(set draggingSprite null) (set draggingSprite null)
(let [connectedPieces (.concat (s.connectedAndSelectedSprites) [s])] (let [connectedPieces (.concat (s.connectedAndSelectedSprites) [s])]
(doFor connected connectedPieces (doFor connected connectedPieces
(checkMatches (dictGet indexMap connected))) (checkMatches (dictGet indexMap connected)))
(doFor connected connectedPieces (doFor connected connectedPieces
(dictSet (the Map<Int,FlxPoint> save.data.storedPositions) (dictGet indexMap connected) (new FlxPoint connected.x connected.y)))) (dictSet (the Map<Int,FlxPoint> save.data.storedPositions) (dictGet indexMap connected) (new FlxPoint connected.x connected.y))))
(pieceCamera.calculateScrollBounds rewardSprites uiCamera SCROLL_BOUND_MARGIN)
(save.flush)))
(pieceCamera.calculateScrollBounds rewardSprites uiCamera SCROLL_BOUND_MARGIN) (var ROT_PADDING 2)
(save.flush))) (localVar fWidth (+ (Std.int sourceRect.width) (* 2 ROT_PADDING)))
(localVar fHeight (+ (Std.int sourceRect.height) (* 2 ROT_PADDING)))
(var ROT_PADDING 2) (source.makeGraphic fWidth fHeight FlxColor.TRANSPARENT true)
(localVar fWidth (+ (Std.int sourceRect.width) (* 2 ROT_PADDING))) (source.pixels.copyPixels rewardSprite.pixels sourceRect (new Point ROT_PADDING ROT_PADDING))
(localVar fHeight (+ (Std.int sourceRect.height) (* 2 ROT_PADDING)))
(source.makeGraphic fWidth fHeight FlxColor.TRANSPARENT true) (mask.makeGraphic fWidth fHeight FlxColor.TRANSPARENT true)
(source.pixels.copyPixels rewardSprite.pixels sourceRect (new Point ROT_PADDING ROT_PADDING)) (drawPieceShape mask jig ros FlxColor.BLACK)
(FlxSpriteUtil.alphaMask s source.pixels mask.pixels)
(mask.makeGraphic fWidth fHeight FlxColor.TRANSPARENT true)
(drawPieceShape mask jig ros FlxColor.BLACK) // Uncomment to debug piece ids and row/columns
(FlxSpriteUtil.alphaMask s source.pixels mask.pixels) **(#when debug
(kiss_flixel.SpriteTools.writeOnSprite "$i" 32 s (object x (Percent 0.5) y (Percent 0.5)) FlxColor.RED)
// Uncomment to debug piece ids and row/columns (kiss_flixel.SpriteTools.writeOnSprite "(${jig.col},${jig.row})" 32 s (object x (Percent 0.5) y (Percent 0.7)) FlxColor.RED))
**(#when debug
(kiss_flixel.SpriteTools.writeOnSprite "$i" 32 s (object x (Percent 0.5) y (Percent 0.5)) FlxColor.RED) (s.loadRotatedGraphic s.pixels 4 -1 /*false true*/)
(kiss_flixel.SpriteTools.writeOnSprite "(${jig.col},${jig.row})" 32 s (object x (Percent 0.5) y (Percent 0.7)) FlxColor.RED))
(s.loadRotatedGraphic s.pixels 4 -1 /*false true*/)
(set s.cameras [pieceCamera]) (set s.cameras [pieceCamera])
(rewardSprites.add s))) (rewardSprites.add s))))
(doFor row (range PUZZLE_HEIGHT) (doFor row (range PUZZLE_HEIGHT)
(doFor col (range PUZZLE_WIDTH) (doFor col (range PUZZLE_WIDTH)
(let [id (nth indexGrid row col)] (let [id (nth indexGrid row col)]
(when (= id -1) (continue)) (when (= id -1) (continue))
(when (>= (- col 1) 0) (when (>= (- col 1) 0)
(let [toLeft (nth spriteGrid row (- col 1))] (let [toLeft (nth spriteGrid row (- col 1))]
(dictSet matchingPiecesLeft id toLeft))) (dictSet matchingPiecesLeft id toLeft)))
(when (< (+ col 1) PUZZLE_WIDTH) (when (< (+ col 1) PUZZLE_WIDTH)
(let [toRight (nth spriteGrid row (+ col 1))] (let [toRight (nth spriteGrid row (+ col 1))]
(dictSet matchingPiecesRight id toRight))) (dictSet matchingPiecesRight id toRight)))
(when (>= (- row 1) 0) (when (>= (- row 1) 0)
(let [toUp (nth spriteGrid (- row 1) col)] (let [toUp (nth spriteGrid (- row 1) col)]
(dictSet matchingPiecesUp id toUp))) (dictSet matchingPiecesUp id toUp)))
(when (< (+ row 1) PUZZLE_HEIGHT) (when (< (+ row 1) PUZZLE_HEIGHT)
(let [toDown (nth spriteGrid (+ row 1) col)] (let [toDown (nth spriteGrid (+ row 1) col)]
(dictSet matchingPiecesDown id toDown)))))) (dictSet matchingPiecesDown id toDown))))))
(doFor i (range TOTAL_PIECES) (doFor i (range TOTAL_PIECES)
(checkMatches i)))) (checkMatches i))))
(set lastRewardFileIndex rewardFileIndex) (set lastRewardFileIndex rewardFileIndex)
(prop &mut lastTotalPoints -1) (prop &mut lastTotalPoints -1)
(set lastTotalPoints (m.totalPoints)) (set lastTotalPoints (m.totalPoints))

View File

@@ -29,6 +29,19 @@ class DragToSelectPlugin extends FlxBasic {
super(); super();
} }
public function clearEnabledSprites(?state:FlxState) {
if (state == null) state = FlxG.state;
dragStates[state].enabledSprites = [];
dragStates[state].selectedSprites = [];
}
// Don't use this on a whole list of sprites! It will be O(N^2)
public function disableSprite(s: KissExtendedSprite, ?state:FlxState) {
if (state == null) state = FlxG.state;
dragStates[state].enabledSprites.remove(s);
dragStates[state].selectedSprites.remove(s);
}
public function enableSprite(s:KissExtendedSprite, ?state:FlxState, ?camera:FlxCamera) { public function enableSprite(s:KissExtendedSprite, ?state:FlxState, ?camera:FlxCamera) {
if (state == null) state = FlxG.state; if (state == null) state = FlxG.state;
if (camera == null) camera = FlxG.camera; if (camera == null) camera = FlxG.camera;

View File

@@ -115,8 +115,19 @@ class KissExtendedSprite extends flixel.addons.display.FlxExtendedSprite {
plugin.enableSprite(this, state, thisCamera()); plugin.enableSprite(this, state, thisCamera());
_dragToSelectEnabled = true; _dragToSelectEnabled = true;
} }
public function disableDragToSelect(?state:FlxState) {
var plugin = FlxG.plugins.get(DragToSelectPlugin);
plugin.disableSprite(this, state);
_dragToSelectEnabled = false;
}
override function update(elapsed:Float) { public override function destroy() {
if (_dragToSelectEnabled)
disableDragToSelect();
super.destroy();
}
public override function update(elapsed:Float) {
#if debug #if debug
// color = (mouseOver && pixelPerfect(_dragPixelPerfectAlpha)) ? FlxColor.LIME : FlxColor.WHITE; // color = (mouseOver && pixelPerfect(_dragPixelPerfectAlpha)) ? FlxColor.LIME : FlxColor.WHITE;
#end #end