(var SPRITE_SPACING 20) (var SPRITE_SIZE 100) (var TEXT_SIZE 24) (method &override :Void create [] #|{ super.create(); var background = new FlxSprite(); background.makeGraphic(1280, 720, FlxColor.BLACK); // background.x = 0; // background.y = 0; FlxSpriteUtil.beginDraw(FlxColor.WHITE); var x = SPRITE_SPACING; var y = FlxG.height - SPRITE_SIZE - SPRITE_SPACING; // Split the screen into text area and dance area: var splitX = SPRITE_SPACING * 5 + SPRITE_SIZE * 4; background.drawLine(splitX, 0, splitX, FlxG.height); // Split the left side into upper/lower: background.drawLine(0, FlxG.height - SPRITE_SIZE - SPRITE_SPACING * 2, splitX, FlxG.height - SPRITE_SIZE - SPRITE_SPACING * 2); add(background); makeTriangleSprite(Left, "", y); makeTriangleSprite(Down, "", y); makeTriangleSprite(Up, "", y); makeTriangleSprite(Right, "", y); var actionSprite = makeTriangleSprite(Right, "a", -SPRITE_SIZE, ()->{trace("a");}); }|#) (prop :Map inputCodes (new Map)) (var DIR_ORDER [ Left Down Up Right ]) (prop &mut :FlxText instructionText null) (method &override :Void update [:Float elapsed] #|{ super.update(elapsed); var lastId = getFirstInputId(); }|# // Prompt to map the arrows (let [mappedCodes (count inputCodes) nextToMap (nth DIR_ORDER mappedCodes)] (if (= DIR_ORDER.length mappedCodes) (set instructionText.text "") { (unless instructionText (set instructionText (new FlxText "" TEXT_SIZE)) (add instructionText)) (set instructionText.text "Press $nextToMap") (instructionText.screenCenter) (whenLet [(Some id) (getFirstInputId)] (dictSet inputCodes id nextToMap)) }))) (method :FlxSprite makeTriangleSprite [:ArrowDir dir :String text :Int y &opt :Void->Void action] #|{ var spr = new ActionSprite(action); spr.makeGraphic(SPRITE_SIZE, SPRITE_SIZE, FlxColor.TRANSPARENT, true); FlxSpriteUtil.beginDraw(FlxColor.WHITE); spr.drawTriangle(0, 0, SPRITE_SIZE); spr.angle = switch (dir) { case Left: -90; case Down: 180; case Up: 0; case Right: 90; }; var text = new FlxText(text, TEXT_SIZE); text.angle = -spr.angle; text.color = FlxColor.BLACK; spr.stamp(text, Math.floor(SPRITE_SIZE/2) - Math.floor(text.width / 2), Math.floor(SPRITE_SIZE/2) - Math.floor(text.height / 2)); spr.x = SPRITE_SPACING + DIR_ORDER.indexOf(dir) * (SPRITE_SIZE + SPRITE_SPACING); spr.y = y; if (action != null) { FlxTween.linearMotion(spr, spr.x, spr.y, spr.x, FlxG.height, 200, false, {onComplete: (_) -> {spr.kill();}}); } add(spr); return spr; }|#)