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

104 lines
4.1 KiB
Plaintext

(loadFrom "nat-archive-tool" "src/nat/Lib.kiss")
(defNew [&prop :EntrySpriteSystem system
&prop :String positionKey
&prop :Position position
&prop :Archive archive
&prop :Entry e
&prop :ArchiveController controller]
[&mut :Bool selected false
&mut :Bool isCircle false
&mut :FlxColor unselectedColor FlxColor.WHITE
&mut :FlxColor selectedColor FlxColor.WHITE]
(super position.x position.y)
(enableMouseClicks false)
(set mousePressedCallback ->:Void [_ _ _] null)
(cond
((hasComponent e Images2)
(let [images (readComponent e Images2)]
(.onComplete (BitmapData.loadFromFile (archive.filePath (nth images.imageFiles images.pinnedImageIndex)))
->bitmapData {
(loadGraphic bitmapData)
})))
((hasComponent e Circle)
(set isCircle true)
(let [c (readComponent e Circle)
diam (Std.int (* 2 c.radius))
squareSize (+ diam CIRCLE_THICKNESS)
color (if (hasComponent e Color)
(let [c (readComponent e Color)]
(FlxColor.fromRGBFloat c.r c.g c.b c.a))
CIRCLE_COLOR)]
(makeGraphic squareSize squareSize FlxColor.TRANSPARENT true)
(set unselectedColor color)
(set selectedColor CIRCLE_SELECTED_COLOR)
(FlxSpriteUtil.drawCircle this -1 -1 c.radius FlxColor.TRANSPARENT (object thickness CIRCLE_THICKNESS color color))))
(true
(set pixels .pixels
(let [color (if (hasComponent e ColorF)
(let [c (readComponent e ColorF)]
(FlxColor.fromRGBFloat c.r c.g c.b c.a))
DEFAULT_COLOR)
t (new FlxText 0 0 0 (readComponent e Name) PlayState.TEXT_SIZE)]
(set unselectedColor color)
(set selectedColor SELECTED_COLOR)
(set t.color color)
t))))
(updateColor)
(let [:Float scale (getScale e)]
(this.scale.set scale scale)
(updateHitbox))
(enableMouseClicks false (hasComponent e Circle)) // pixel-perfect if the sprite is a circle
(enableMouseDrag false (hasComponent e Circle))
(set mouseStartDragCallback
->[self _dx _dy]
(doFor sprite (system.getSelectedSprites)
(unless (= sprite.e.id this.e.id)
(sprite.fixToSprite this))))
(set mouseStopDragCallback
->[self _dx _dy]
{
(savePos)
(doFor sprite (system.getSelectedSprites)
(unless (= sprite.e.id this.e.id)
(sprite.endFixToSprite)))
}))
(prop &mut :EntrySprite fixedToSprite)
(prop &mut :FlxPoint fixedOffset)
(method savePos []
(FlxG.camera.extendScrollBounds this PlayState.SCROLL_BOUND_MARGIN)
(withWritableComponents archive e [positions Positions]
(let [pos (dictGet positions positionKey)]
(dictSet positions positionKey (object x (cast this.x Float) y (cast this.y Float) z pos.z)))))
(method &override :Void update [:Float elapsed]
(super.update elapsed)
(when fixedToSprite
(set x (+ fixedToSprite.x fixedOffset.x))
(set y (+ fixedToSprite.y fixedOffset.y))))
(method fixToSprite [:EntrySprite sprite]
(set fixedToSprite sprite)
(set fixedOffset (new FlxPoint (- x sprite.x) (- y sprite.y))))
(method endFixToSprite []
(savePos)
(set fixedToSprite null))
(method updateColor []
(set color
(if (controller.isSelected e)
selectedColor
unselectedColor)))
(var SELECTED_COLOR FlxColor.BLUE)
(var CIRCLE_COLOR FlxColor.LIME)
(var CIRCLE_SELECTED_COLOR FlxColor.GRAY)
(var DEFAULT_COLOR FlxColor.WHITE)
(var CIRCLE_THICKNESS 5)