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.Jigsawx;
import jigsawx.math.Vec2;
import kiss_flixel.DragToSelectPlugin;
typedef StartPuzzleFunc = (Int, Int) -> Void;

View File

@@ -266,12 +266,22 @@
(set pieceCamera.scroll save.data.scroll))
(unless (and (= lastRewardFileIndex rewardFileIndex) (= lastTotalPoints (m.totalPoints)))
// When the current puzzle has changed:
(unless (= lastRewardFileIndex rewardFileIndex)
(set rewardSprite
(new FlxSprite 0 0
(BitmapData.fromFile
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.updateHitbox)
(when (> rewardSprite.height FlxG.height)
@@ -281,10 +291,19 @@
(unless save.data.zoom
(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))
// add rewardSprites group before enabling drag-to-select on instances
(add rewardSprites)
(add rewardSprites))
(doFor map [matchingPiecesLeft matchingPiecesRight matchingPiecesUp matchingPiecesDown]
(map.clear))
@@ -325,10 +344,12 @@
angle (ifLet [angle (dictGet (the Map<Int,Float> save.data.storedAngles) i)]
angle
(nth startingAngles i))
s (new KissExtendedSprite pos.x pos.y)
&mut s (dictGet spriteMap i)
source (new FlxSprite)
mask (new FlxSprite)
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.priorityID i)
(dictSet (the Map<Int,FlxPoint> save.data.storedPositions) i pos)
@@ -384,7 +405,7 @@
(set s.cameras [pieceCamera])
(rewardSprites.add s)))
(rewardSprites.add s))))
(doFor row (range PUZZLE_HEIGHT)
(doFor col (range PUZZLE_WIDTH)
(let [id (nth indexGrid row col)]

View File

@@ -29,6 +29,19 @@ class DragToSelectPlugin extends FlxBasic {
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) {
if (state == null) state = FlxG.state;
if (camera == null) camera = FlxG.camera;

View File

@@ -115,8 +115,19 @@ class KissExtendedSprite extends flixel.addons.display.FlxExtendedSprite {
plugin.enableSprite(this, state, thisCamera());
_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
// color = (mouseOver && pixelPerfect(_dragPixelPerfectAlpha)) ? FlxColor.LIME : FlxColor.WHITE;
#end