optimize adding additional jigsaw sprites
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
@@ -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))
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user