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,12 +266,22 @@
(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)))
// When the current puzzle has changed:
(unless (= lastRewardFileIndex rewardFileIndex)
(set rewardSprite (set rewardSprite
(new FlxSprite 0 0 (new FlxSprite 0 0
(BitmapData.fromFile (BitmapData.fromFile
currentRewardFile.path))) currentRewardFile.path)))
(when rewardSprites
(remove rewardSprites)) (set matchingPiecesLeft (new Map))
(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.setGraphicSize FlxG.width 0)
(rewardSprite.updateHitbox) (rewardSprite.updateHitbox)
(when (> rewardSprite.height FlxG.height) (when (> rewardSprite.height FlxG.height)
@@ -281,10 +291,19 @@
(unless save.data.zoom (unless save.data.zoom
(set pieceCamera.zoom rewardSprite.scale.x)) (set pieceCamera.zoom rewardSprite.scale.x))
(when rewardSprites
#{
var plugin = FlxG.plugins.get(DragToSelectPlugin);
plugin.clearEnabledSprites();
}#
(rewardSprites.destroy)
(remove rewardSprites)
(set rewardSprites null)))
(unless rewardSprites
(set rewardSprites (new FlxTypedGroup)) (set rewardSprites (new FlxTypedGroup))
// add rewardSprites group before enabling drag-to-select on instances // add rewardSprites group before enabling drag-to-select on instances
(add rewardSprites) (add rewardSprites))
(doFor map [matchingPiecesLeft matchingPiecesRight matchingPiecesUp matchingPiecesDown] (doFor map [matchingPiecesLeft matchingPiecesRight matchingPiecesUp matchingPiecesDown]
(map.clear)) (map.clear))
@@ -325,10 +344,12 @@
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))]
(unless s
(set s (new KissExtendedSprite pos.x pos.y))
(set s.angle angle) (set s.angle angle)
(set s.priorityID i) (set s.priorityID i)
(dictSet (the Map<Int,FlxPoint> save.data.storedPositions) i pos) (dictSet (the Map<Int,FlxPoint> save.data.storedPositions) i pos)
@@ -384,7 +405,7 @@
(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)]

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