// Calculate where to draw the given stamp sprite on the given canvas sprite, as percentages or pixels from edge (function :Array positionOn [:FlxSprite stamp :FlxSprite canvas :RelativePosition pos] (unless pos.anchorX (set pos.anchorX (Percent 0.5))) (unless pos.anchorY (set pos.anchorY (Percent 0.5))) (let [&mut x (coordIn pos.x (/ canvas.width canvas.scale.x) pos.offsetX) &mut y (coordIn pos.y (/ canvas.height canvas.scale.y) pos.offsetY)] (-= x (coordIn pos.anchorX stamp.width)) (-= y (coordIn pos.anchorY stamp.height)) [x y])) (function :Int coordIn [:RelativeCoordinate coord :Float range &opt :Int offset] (+ (or offset 0) (Math.round (case coord ((when (and (>= p -1) (< p 0)) (Percent p)) (+ range (* p range))) ((when (and (>= p -range) (< p 0)) (Pixels p)) (+ range p)) ((when (<= p 1) (Percent p)) (* range p)) ((when (<= p range) (Pixels p)) p) (otherwise (throw "$coord is out of range $range")))))) (function :Void scaleStampOn [:FlxSprite stamp :FlxSprite canvas :RelativePosition pos] (let [&mut x 0 &mut y 0] (when pos.sizeX (set x (coordIn pos.sizeX canvas.frameWidth))) (when pos.sizeY (set y (coordIn pos.sizeY canvas.frameHeight))) (stamp.setGraphicSize x y) (stamp.updateHitbox))) (function :Void drawOnSprite [:FlxSprite stamp :FlxSprite canvas :RelativePosition pos] (scaleStampOn stamp canvas pos) (let [[x y] (positionOn stamp canvas pos)] (let [oX stamp.origin.x oY stamp.origin.y] (stamp.origin.set 0 0) (canvas.stamp stamp x y) (stamp.origin.set oX oY)))) // TODO allow specifying size relative to canvas (function :Void writeOnSprite [:String text :Int size :FlxSprite canvas :RelativePosition pos &opt :FlxColor color] (let [lines (text.split "\n") &mut offsetY (/ (* size lines.length) -2)] (doFor text lines (set pos.offsetY offsetY) (+= offsetY size) (let [text (new FlxText 0 0 0 text size)] (when color (set text.color color)) (drawOnSprite text canvas pos)))))