Files
kiss-vscode/projects/nat-flixel-desktop-playground/source/EntrySpriteSystem.kiss

70 lines
2.8 KiB
Plaintext

(loadFrom "nat-archive-tool" "src/nat/Lib.kiss")
(prop :Map<String,EntrySprite> sprites (new Map))
// TODO this can also handle text sprites, and instead of saving out the text bitmap,
// just make the FlxText every time at runtime -- so PinNextImage won't be needed
// when the media tag is added
(defNew [&prop :PlayState playState
&prop :ArchiveController controller]
(super
playState
->[archive e]
?(or (hasComponent e Name) (hasComponent e Circle))
->[archive e pos &opt ui]
(unless (sprites.exists e.id)
(let [sprite (new EntrySprite this _playgroundKey pos archive e controller)]
(set sprite.cameras [FlxG.camera])
(sprite.enableDragToSelect
->:Void {
(controller.AddSelectEntry e)
(sprite.updateColor)
}
->:Void {
(controller.DeSelectEntry e)
(sprite.updateColor)
})
(playState.entryGroup.add sprite)
(dictSet sprites e.id sprite)))
->[archive e pos e2 pos2 &opt ui]
(let [o .origin (dictGet sprites e.id)
o2 .origin (dictGet sprites e2.id)]
(playState.debugLayer.drawLine (+ pos.x o.x) (+ pos.y o.y) (+ pos2.x o2.x) (+ pos2.y o2.y) FlxColor.LIME))
->[archive e &opt ui]
{
(whenLet [sprite (dictGet sprites e.id)]
(sprite.kill)
(playState.entryGroup.remove sprite true)
(sprites.remove e.id))
// When an Entry is hidden, we can bet the user doesn't want it selected anymore
(controller.DeSelectEntry e)
}))
(method &override :Void clear [:Color color]
(set playState.bgColor (FlxColor.fromRGBFloat color.r color.g color.b color.a))
(playState.debugLayer.clear)
(sprites.clear)
(playState.entryGroup.kill)
(playState.entryGroup.clear)
(playState.entryGroup.revive)
(controller.SelectEntries []))
(method z [:Entry e]
.z (dictGet (readComponent e Positions) _playgroundKey))
// override process to z-sort all sprites after making them
(method &override :Void process [:Archive archive &opt :ArchiveUI ui]
(super.process archive ui)
(FlxG.camera.calculateScrollBounds playState.entryGroup PlayState.SCROLL_BOUND_MARGIN)
(playState.entryGroup.sort ->[o s1 s2] (FlxSort.byValues o (z s1.e) (z s2.e))))
(method getSelectedSprites []
(filter (for e (controller.getSelectedEntries) (dictGet sprites e.id))))
(prop defaultSpacing 50)
(prop &mut defaultY 0)
(method &override :Position defaultPosition [_]
(+= defaultY defaultSpacing)
(object x 0 y defaultY z 0.0))