From 617fedcf22e677913929fea2f9b3930c0aa858b3 Mon Sep 17 00:00:00 2001 From: Lars Doucet Date: Fri, 7 Sep 2018 07:31:02 -0500 Subject: [PATCH] Add a FlxAction demo (#268) see HaxeFlixel/flixel#1805 --- Input/FlxAction/FlxAction.hxproj | 60 +++++++ Input/FlxAction/Project.xml | 82 ++++++++++ Input/FlxAction/assets/data/map.tmx | 26 +++ Input/FlxAction/assets/data/tilesheet.png | Bin 0 -> 15333 bytes Input/FlxAction/source/AnalogWidget.hx | 77 +++++++++ Input/FlxAction/source/Main.hx | 13 ++ Input/FlxAction/source/PlayState.hx | 57 +++++++ Input/FlxAction/source/Player.hx | 190 ++++++++++++++++++++++ Input/FlxAction/source/TiledLevel.hx | 137 ++++++++++++++++ 9 files changed, 642 insertions(+) create mode 100644 Input/FlxAction/FlxAction.hxproj create mode 100644 Input/FlxAction/Project.xml create mode 100644 Input/FlxAction/assets/data/map.tmx create mode 100644 Input/FlxAction/assets/data/tilesheet.png create mode 100644 Input/FlxAction/source/AnalogWidget.hx create mode 100644 Input/FlxAction/source/Main.hx create mode 100644 Input/FlxAction/source/PlayState.hx create mode 100644 Input/FlxAction/source/Player.hx create mode 100644 Input/FlxAction/source/TiledLevel.hx diff --git a/Input/FlxAction/FlxAction.hxproj b/Input/FlxAction/FlxAction.hxproj new file mode 100644 index 000000000..0a425d99e --- /dev/null +++ b/Input/FlxAction/FlxAction.hxproj @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "$(CompilerPath)/haxelib" run lime build "$(OutputFile)" $(TargetBuild) -$(BuildConfig) -Dfdb + + + + + + + + \ No newline at end of file diff --git a/Input/FlxAction/Project.xml b/Input/FlxAction/Project.xml new file mode 100644 index 000000000..d99a76196 --- /dev/null +++ b/Input/FlxAction/Project.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Input/FlxAction/assets/data/map.tmx b/Input/FlxAction/assets/data/map.tmx new file mode 100644 index 000000000..f7c36e871 --- /dev/null +++ b/Input/FlxAction/assets/data/map.tmx @@ -0,0 +1,26 @@ + + + + + + + + + + + + AgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAA + + + + + + + + AwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAA + + + + + + diff --git a/Input/FlxAction/assets/data/tilesheet.png b/Input/FlxAction/assets/data/tilesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..f5069caf776f277a95a994d58e6f34f230b94a85 GIT binary patch literal 15333 zcmeI3XIK+U7svNrP!Yvmu*cX-vPmET)+B-i4Qdb}3Rqb-8(2xQFXX0l&qSY$*CAMeWE2!i;8t5s3pGamf$ zygb1FtJO#8!ADWEI?jq9#md_M{z9hD^hJ=s+LShyiPf~m2-+ybb#wwLv>DAnjUe)- zHZx8nlMF9`Or%T-{;Tb~`8-Oe;KxWcB8@qeOrq537BV_LLQAA46G1wDQ>C}uhJgS^ zlEHa4qrqgwYzn?3E(UCSGs@>VBuuh`A7W3)i`7K(LTL-hlL}=5LM#^Z0)m8MX`r7( z+L$L1iKVD02o;M2A~7ZwVG-^ZdMrxS+?5V|Q}B}*#*Cq8YHF%5)lW!U z5>atbP!KATpc07yCt{})8QPje7m(83 zU0`CcCK`=9cfR8_8uLwUWx{#@1TLicdRnz^%jJowQK}xY>K0ZjMrLu8*BJ9Y*MbNRhvc6vzT)0Rmj)PY4pEdL8&G5)njzR3_7l z9S}7d*!{QADw;^K?-o~R-MK0V5 z<1C9NyXS8G)nT9f~sy)|_Fv zJzZ|p|GR+B_>g zaxa9lHTU}bs@UJxQ*J-hFi;C%T)1NmKzaYxmXq13kF~F*{0=;z$AlFnA}vH;#wQ1^>U?nQQQg#Xyc znbCh77!JoJfoZVX94=NwuzdA8hl>>vEZ}g#G+1p87b_xIz~O>vu-Y6hRz$FX!v)h|wK-g@h+qMS z3#P$pbGTR$!2%8!OoP?_BQEcptAC^k-1kcb7yA_IK>M{o9-)rXAV_*01nD;bLB3>z z&nF0yB0`X-@d$!VMUaa0_^t<eQ)Qw{E?9 z_3GEJ-=IN*h7B7wYSgH4(;F`8cjq*M4L8kA|oT)wrv{~6%`#Ft<`GVwQJYDefyZ0nAq6ZxVX3u9XfRE z*s)WmPMtek|_blai7sit5&_TXJ%;!C){N zjV6C>lg z-@g6&^~=b}=-C&akmMvSpeEEtMD^{*t zxoXv_)vH&pS+i#C+O_M}ty{l-{e}%2Hg4RwY15|7n>TOSvSsVmt=qP3+rEAKjvYI8 z?%cU+*RI{WcV}f~?b)+u@7}%p_U+rhfB%642M!)Qc<9if!-o$aIdbIa(WA$X9Xo#f z_=yuIPM$n@>eQ*zr%#_bbLQ;Xv**s8JAeNCg$oxhUc7ke(xuCnFJHNGeZ{)uV24;^XBc_x9{G)d;k9ZhYuexGF?zyZZcu*atzpJl16NJ)^#?Ia@htk$P>I q=ieE@yi#7CfA5)c8)&n$!Pbc_{@0G$t=@pINO)L;YE`rN{{I65gEq(j literal 0 HcmV?d00001 diff --git a/Input/FlxAction/source/AnalogWidget.hx b/Input/FlxAction/source/AnalogWidget.hx new file mode 100644 index 000000000..9adc098ab --- /dev/null +++ b/Input/FlxAction/source/AnalogWidget.hx @@ -0,0 +1,77 @@ +package; + +import flixel.FlxG; +import flixel.group.FlxSpriteGroup; +import flixel.ui.FlxBar; + +class AnalogWidget extends FlxSpriteGroup +{ + public var xPos:Float = 0; + public var xNeg:Float = 0; + public var yPos:Float = 0; + public var yNeg:Float = 0; + public var l:Float = 0; + public var r:Float = 0; + + var xAxisPos:FlxBar; + var yAxisPos:FlxBar; + var xAxisNeg:FlxBar; + var yAxisNeg:FlxBar; + var lBar:FlxBar; + var rBar:FlxBar; + + public function new() + { + super(); + + xAxisPos = new FlxBar(0, 0, FlxBarFillDirection.LEFT_TO_RIGHT, 64, 16, this, "xPos", 0.0, 1.0, true); + xAxisNeg = new FlxBar(0, 0, FlxBarFillDirection.RIGHT_TO_LEFT, 64, 16, this, "xNeg", 0.0, 1.0, true); + yAxisPos = new FlxBar(0, 0, FlxBarFillDirection.TOP_TO_BOTTOM, 16, 64, this, "yPos", 0.0, 1.0, true); + yAxisNeg = new FlxBar(0, 0, FlxBarFillDirection.BOTTOM_TO_TOP, 16, 64, this, "yNeg", 0.0, 1.0, true); + lBar = new FlxBar(0, 0, FlxBarFillDirection.BOTTOM_TO_TOP, 16, 144, this, "l", 0.0, 1.0, true); + rBar = new FlxBar(0, 0, FlxBarFillDirection.BOTTOM_TO_TOP, 16, 144, this, "r", 0.0, 1.0, true); + + xAxisPos.x = (xAxisPos.height) / 2; + xAxisPos.y = -(xAxisPos.height) / 2; + + xAxisNeg.x = -(xAxisNeg.width) - (xAxisPos.height / 2); + xAxisNeg.y = -(xAxisNeg.height) / 2; + + yAxisPos.x = -(yAxisPos.width) / 2; + yAxisPos.y = (yAxisNeg.width / 2); + + yAxisNeg.x = -(yAxisNeg.width) / 2; + yAxisNeg.y = -(yAxisPos.height) - (yAxisPos.width / 2); + + lBar.x = xAxisNeg.x - lBar.width - 8; + rBar.x = xAxisPos.x + xAxisPos.width + 8; + lBar.y = rBar.y = yAxisNeg.y; + + add(xAxisPos); + add(xAxisNeg); + add(yAxisPos); + add(yAxisNeg); + add(lBar); + add(rBar); + + var xoff = FlxG.width - width/2 - 5; + var yoff = FlxG.height - height/2 - 5; + + x = xoff; + y = yoff; + } + + public function setValues(X:Float, Y:Float):Void + { + xPos = 0; + xNeg = 0; + yPos = 0; + yNeg = 0; + + if (X > 0) xPos = X; + else xNeg = -X; + + if (Y > 0) yPos = Y; + else yNeg = -Y; + } +} \ No newline at end of file diff --git a/Input/FlxAction/source/Main.hx b/Input/FlxAction/source/Main.hx new file mode 100644 index 000000000..2328490de --- /dev/null +++ b/Input/FlxAction/source/Main.hx @@ -0,0 +1,13 @@ +package; + +import flixel.FlxGame; +import openfl.display.Sprite; + +class Main extends Sprite +{ + public function new() + { + super(); + addChild(new FlxGame(672, 480, PlayState)); + } +} \ No newline at end of file diff --git a/Input/FlxAction/source/PlayState.hx b/Input/FlxAction/source/PlayState.hx new file mode 100644 index 000000000..3cfeabc2d --- /dev/null +++ b/Input/FlxAction/source/PlayState.hx @@ -0,0 +1,57 @@ +package; + +import flixel.FlxG; +import flixel.FlxState; +import flixel.text.FlxText; + +class PlayState extends FlxState +{ + public var player:Player; + var _level:TiledLevel; + var _howto:FlxText; + + override public function create():Void + { + FlxG.mouse.visible = false; + bgColor = 0xFF18A068; + + // Load the level's tilemaps + _level = new TiledLevel("assets/data/map.tmx"); + + // Add tilemaps + add(_level.backgroundTiles); + + // Add tilemaps + add(_level.foregroundTiles); + + // Load player and objects of the Tiled map + _level.loadObjects(this); + + #if !mobile + // Set and create Txt Howto + _howto = new FlxText(0, 20, FlxG.width); + _howto.scale.set(2, 2); + _howto.alignment = CENTER; + _howto.text = "Digital: ARROWS, WASD, D-PAD, BUTTONS, LEFT STICK\nAnalog: MOUSE motion, RIGHT STICK, TRIGGERS"; + _howto.scrollFactor.set(0, 0); + add(_howto); + #end + } + + override public function update(elapsed:Float):Void + { + super.update(elapsed); + + // Collide with foreground tile layer + _level.collideWithLevel(player); + } + + override public function destroy():Void + { + super.destroy(); + + player = null; + _level = null; + _howto = null; + } +} diff --git a/Input/FlxAction/source/Player.hx b/Input/FlxAction/source/Player.hx new file mode 100644 index 000000000..b68f5eaee --- /dev/null +++ b/Input/FlxAction/source/Player.hx @@ -0,0 +1,190 @@ +package; + +import flixel.FlxG; +import flixel.FlxSprite; +import flixel.input.actions.FlxAction.FlxActionAnalog; +import flixel.input.actions.FlxAction.FlxActionDigital; +import flixel.input.actions.FlxActionManager; +import flixel.ui.FlxVirtualPad; +import flixel.util.FlxColor; + +class Player extends FlxSprite +{ + /** + * How big the tiles of the tilemap are. + */ + static inline var TILE_SIZE:Int = 32; + /** + * How many pixels to move each frame. + */ + static inline var MOVEMENT_SPEED:Int = 2; + + var up:FlxActionDigital; + var down:FlxActionDigital; + var left:FlxActionDigital; + var right:FlxActionDigital; + + var moveAnalog:FlxActionAnalog; + + var trigger1:FlxActionAnalog; + var trigger2:FlxActionAnalog; + + var move:FlxActionAnalog; + + var _virtualPad:FlxVirtualPad; + var _analogWidget:AnalogWidget; + + var moveX:Float = 0; + var moveY:Float = 0; + + public function new(X:Int, Y:Int) + { + // X,Y: Starting coordinates + super(X, Y); + + // Make the player graphic. + makeGraphic(TILE_SIZE, TILE_SIZE, FlxColor.WHITE); + + addInputs(); + } + + function addInputs():Void + { + //Add on screen virtual pad to demonstrate UI buttons tied to actions + _virtualPad = new FlxVirtualPad(FULL, NONE); + _virtualPad.alpha = 0.5; + _virtualPad.x += 50; + _virtualPad.y -= 20; + FlxG.state.add(_virtualPad); + + //Add on screen analog indicator to expose values of analog inputs in real time + _analogWidget = new AnalogWidget(); + _analogWidget.alpha = 0.5; + _analogWidget.x -= 10; + _analogWidget.y -= 2; + FlxG.state.add(_analogWidget); + + //digital actions allow for on/off directional movement + up = new FlxActionDigital(); + down = new FlxActionDigital(); + left = new FlxActionDigital(); + right = new FlxActionDigital(); + + //these actions don't do anything, but their values are exposed in the analog visualizer + trigger1 = new FlxActionAnalog(); + trigger2 = new FlxActionAnalog(); + + //this analog action allows for smooth movement + move = new FlxActionAnalog(); + + var manager = new FlxActionManager(); + FlxG.inputs.add(manager); + manager.addActions([up,down,left,right,trigger1,trigger2,move]); + + //Add keyboard inputs + up.addKey(UP, PRESSED); + up.addKey(W, PRESSED); + down.addKey(DOWN, PRESSED); + down.addKey(S, PRESSED); + left.addKey(LEFT, PRESSED); + left.addKey(A, PRESSED); + right.addKey(RIGHT, PRESSED); + right.addKey(D, PRESSED); + + //Add virtual pad (on-screen button) inputs + up.addInput(_virtualPad.buttonUp, PRESSED); + down.addInput(_virtualPad.buttonDown, PRESSED); + left.addInput(_virtualPad.buttonLeft, PRESSED); + right.addInput(_virtualPad.buttonRight, PRESSED); + + //Add gamepad DPAD inputs + up.addGamepad(DPAD_UP, PRESSED); + down.addGamepad(DPAD_DOWN, PRESSED); + left.addGamepad(DPAD_LEFT, PRESSED); + right.addGamepad(DPAD_RIGHT, PRESSED); + + //Add gamepad analog stick (as simulated DPAD) inputs + up.addGamepad(LEFT_STICK_DIGITAL_UP, PRESSED); + down.addGamepad(LEFT_STICK_DIGITAL_DOWN, PRESSED); + left.addGamepad(LEFT_STICK_DIGITAL_LEFT, PRESSED); + right.addGamepad(LEFT_STICK_DIGITAL_RIGHT, PRESSED); + + //Add gamepad analog trigger inputs + trigger1.addGamepad(LEFT_TRIGGER, MOVED); + trigger2.addGamepad(RIGHT_TRIGGER, MOVED); + + //Add gamepad analog stick (as actual analog value) motion input + move.addGamepad(RIGHT_ANALOG_STICK, MOVED, EITHER); + + //Add relative mouse movement as motion input + move.addMouseMotion(MOVED, EITHER); + + FlxG.mouse.visible = true; + } + + override public function update(elapsed:Float):Void + { + super.update(elapsed); + + velocity.x = 0; + velocity.y = 0; + + y += moveY * MOVEMENT_SPEED; + x += moveX * MOVEMENT_SPEED; + + moveX = 0; + moveY = 0; + + updateDigital(); + updateAnalog(); + } + + function updateDigital():Void + { + _virtualPad.buttonUp.color = FlxColor.WHITE; + _virtualPad.buttonDown.color = FlxColor.WHITE; + _virtualPad.buttonLeft.color = FlxColor.WHITE; + _virtualPad.buttonRight.color = FlxColor.WHITE; + + if (down.triggered) + { + _virtualPad.buttonDown.color = FlxColor.LIME; + moveY = 1; + } + else if (up.triggered) + { + _virtualPad.buttonUp.color = FlxColor.LIME; + moveY = -1; + } + + if (left.triggered) + { + _virtualPad.buttonLeft.color = FlxColor.LIME; + moveX = -1; + } + else if (right.triggered) + { + _virtualPad.buttonRight.color = FlxColor.LIME; + moveX = 1; + } + + if (moveX != 0 && moveY != 0) + { + moveY *= .707; + moveX *= .707; + } + } + + function updateAnalog():Void + { + _analogWidget.setValues(move.x, move.y); + _analogWidget.l = trigger1.x; + _analogWidget.r = trigger2.x; + + if (Math.abs(moveX) < 0.001) + moveX = move.x; + + if (Math.abs(moveY) < 0.001) + moveY = move.y; + } +} diff --git a/Input/FlxAction/source/TiledLevel.hx b/Input/FlxAction/source/TiledLevel.hx new file mode 100644 index 000000000..3b235855c --- /dev/null +++ b/Input/FlxAction/source/TiledLevel.hx @@ -0,0 +1,137 @@ +package; + +import flixel.addons.editors.tiled.TiledLayer; +import flixel.addons.editors.tiled.TiledMap; +import flixel.addons.editors.tiled.TiledObject; +import flixel.addons.editors.tiled.TiledObjectLayer; +import flixel.addons.editors.tiled.TiledTileLayer; +import flixel.addons.editors.tiled.TiledTileSet; +import flixel.FlxG; +import flixel.FlxObject; +import flixel.group.FlxGroup; +import flixel.tile.FlxTilemap; +import haxe.io.Path; + +/** + * ... + * @author Samuel Batista + */ +class TiledLevel extends TiledMap +{ + // For each "Tile Layer" in the map, you must define a "tileset" property which contains the name of a tile sheet image + // used to draw tiles in that layer (without file extension). The image file must be located in the directory specified bellow. + inline static var c_PATH_LEVEL_TILESHEETS = "assets/data/"; + + public var foregroundTiles:FlxGroup; + public var backgroundTiles:FlxGroup; + public var player:Player; + + var collidableTileLayers:Array; + + public function new(tiledLevel:Dynamic) + { + super(tiledLevel); + + foregroundTiles = new FlxGroup(); + backgroundTiles = new FlxGroup(); + + FlxG.camera.setScrollBoundsRect(0, 0, fullWidth, fullHeight, true); + + // Load Tile Maps + for (layer in layers) + { + if (layer.type != TiledLayerType.TILE) continue; + var tileLayer:TiledTileLayer = cast layer; + + var tileSheetName:String = tileLayer.properties.get("tileset"); + + if (tileSheetName == null) + throw "'tileset' property not defined for the '" + tileLayer.name + "' layer. Please add the property to the layer."; + + var tileSet:TiledTileSet = null; + for (ts in tilesets) + { + if (ts.name == tileSheetName) + { + tileSet = ts; + break; + } + } + + if (tileSet == null) + throw "Tileset '" + tileSheetName + " not found. Did you misspell the 'tilesheet' property in " + tileLayer.name + "' layer?"; + + var imagePath = new Path(tileSet.imageSource); + var processedPath = c_PATH_LEVEL_TILESHEETS + imagePath.file + "." + imagePath.ext; + + var tilemap:FlxTilemap = new FlxTilemap(); + tilemap.loadMapFromArray(tileLayer.tileArray, width, height, processedPath, + tileSet.tileWidth, tileSet.tileHeight, OFF, tileSet.firstGID, 1, 1); + + if (tileLayer.properties.contains("nocollide")) + { + backgroundTiles.add(tilemap); + } + else + { + if (collidableTileLayers == null) + collidableTileLayers = new Array(); + + foregroundTiles.add(tilemap); + collidableTileLayers.push(tilemap); + } + } + } + + public function loadObjects(state:PlayState) + { + for (layer in layers) + { + if (layer.type != TiledLayerType.OBJECT) continue; + var group:TiledObjectLayer = cast layer; + + for (o in group.objects) + { + loadObject(o, group, state); + } + } + } + + function loadObject(o:TiledObject, g:TiledObjectLayer, state:PlayState) + { + var x:Int = o.x; + var y:Int = o.y; + + // objects in tiled are aligned bottom-left (top-left in flixel) + if (o.gid != -1) + { + y -= g.map.getGidOwner(o.gid).tileHeight; + } + + switch (o.type.toLowerCase()) + { + case "player_start": + // define and set the player + var player = new Player(x, y); + state.player = player; + state.add(player); + } + } + + public function collideWithLevel(obj:FlxObject, ?notifyCallback:FlxObject->FlxObject->Void, ?processCallback:FlxObject->FlxObject->Bool):Bool + { + if (collidableTileLayers != null) + { + for (map in collidableTileLayers) + { + // IMPORTANT: Always collide the map with objects, not the other way around. + // This prevents odd collision errors (collision separation code off by 1 px). + if (FlxG.overlap(map, obj, notifyCallback, processCallback != null ? processCallback : FlxObject.separate)) + { + return true; + } + } + } + return false; + } +}