diff --git a/projects/iso-rpg-engine/Project.xml b/projects/iso-rpg-engine/Project.xml index 11b59c0b..55b5f013 100644 --- a/projects/iso-rpg-engine/Project.xml +++ b/projects/iso-rpg-engine/Project.xml @@ -39,6 +39,7 @@ + diff --git a/projects/iso-rpg-engine/source/BladesMapState.hx b/projects/iso-rpg-engine/source/BladesMapState.hx index b2436c66..0e31b19e 100644 --- a/projects/iso-rpg-engine/source/BladesMapState.hx +++ b/projects/iso-rpg-engine/source/BladesMapState.hx @@ -7,6 +7,7 @@ import flixel.FlxCamera; import flixel.math.FlxRect; import flixel.math.FlxVector; import flixel.graphics.FlxGraphic; +import flixel.group.FlxGroup; import flixel.FlxG; import flixel.input.mouse.FlxMouseEventManager; diff --git a/projects/iso-rpg-engine/source/BladesMapState.kiss b/projects/iso-rpg-engine/source/BladesMapState.kiss index 69870091..4446f856 100644 --- a/projects/iso-rpg-engine/source/BladesMapState.kiss +++ b/projects/iso-rpg-engine/source/BladesMapState.kiss @@ -6,6 +6,8 @@ (prop &mut :ScenData data null) (prop :FlxCamera worldCamera (new FlxCamera)) +(var SCROLL_BOUND_MARGIN 200) + (method &override :Void create [] (super.create) (set data (ScenData.coreData)) @@ -17,19 +19,20 @@ (let [valleydy (Scenario.fromBasFile "Blades of Avernum Scenarios/Valley of Dying Things/valleydy.bas")] (addSprites - // 2D nth >:) - (nth valleydy.outdoorSections 0 2)) + // 2D nth -- pretty cool + (nth valleydy.outdoorSections 0 2))) - (prop &mut :FlxSprite border (new FlxSprite)) - (set border (SpriteSheet.fromWholeBmp "${data.data}/Game Graphics/G801.bmp")) - (worldCamera.addBorder border) - (let [testRed (.makeGraphic (new FlxSprite 0 0) 16 16 FlxColor.RED)] - (set testRed.cameras [worldCamera]) - (add testRed)))) + (prop &mut :FlxSprite border (new FlxSprite)) + (set border (SpriteSheet.fromWholeBmp "${data.data}/Game Graphics/G801.bmp")) + (worldCamera.addBorder border) + + (add tileSprites) + (worldCamera.calculateScrollBounds tileSprites SCROLL_BOUND_MARGIN)) (var SELECTED_COLOR FlxColor.LIME) (var NORMAL_COLOR FlxColor.WHITE) (var CLIFF_HEIGHT 22) +(var :FlxTypedGroup tileSprites (new FlxTypedGroup)) (method :Void addSprites [:TileMap map] (let [&mut rowStartX 0 @@ -55,7 +58,7 @@ ->upTS {} ->overTS (set overTS.color SELECTED_COLOR) ->outTS (set outTS.color NORMAL_COLOR)) - (add tileSprite))) + (tileSprites.add tileSprite))) // TODO add any items @@ -72,7 +75,7 @@ ->upTS {} ->overTS (set overTS.color SELECTED_COLOR) ->outTS (set outTS.color NORMAL_COLOR)) - (add tileSprite)))) + (tileSprites.add tileSprite)))) (+= x (/ FLOOR_WIDTH 2)) (+= y (/ FLOOR_HEIGHT 2)))) (-= rowStartX (/ FLOOR_WIDTH 2)) diff --git a/projects/kiss-flixel/src/kiss_flixel/CameraTools.hx b/projects/kiss-flixel/src/kiss_flixel/CameraTools.hx index 2507ea24..b7c140f9 100644 --- a/projects/kiss-flixel/src/kiss_flixel/CameraTools.hx +++ b/projects/kiss-flixel/src/kiss_flixel/CameraTools.hx @@ -10,6 +10,9 @@ import flixel.math.FlxPoint; import flixel.FlxSprite; import flixel.FlxG; import flixel.util.FlxColor; +import flixel.FlxObject; +import flixel.group.FlxGroup; +import kiss_flixel.GroupTools; using Lambda; diff --git a/projects/kiss-flixel/src/kiss_flixel/CameraTools.kiss b/projects/kiss-flixel/src/kiss_flixel/CameraTools.kiss index da1e00d2..0ff54bc1 100644 --- a/projects/kiss-flixel/src/kiss_flixel/CameraTools.kiss +++ b/projects/kiss-flixel/src/kiss_flixel/CameraTools.kiss @@ -80,4 +80,16 @@ if (FlxG.mouse.wheel != 0) { camera.zoom += (FlxG.mouse.wheel * elapsed * speed); } - }#) \ No newline at end of file + }#) + +(function calculateScrollBounds <>[:FlxObject T] [:FlxCamera camera :FlxTypedGroup group &opt :Float margin] + (let [r (GroupTools.calculateBounds group margin)] + (camera.setScrollBoundsRect r.x r.y r.width r.height))) + +(function extendScrollBounds [:FlxCamera camera :FlxObject object &opt :Float margin] + // if the given object is out of bounds, extend the bounds + (let [r (object.getRotatedBounds)] + (setMin camera.minScrollX (- r.left margin)) + (setMin camera.minScrollY (- r.top margin)) + (setMax camera.maxScrollX (+ r.right margin)) + (setMax camera.maxScrollY (+ r.bottom margin)))) \ No newline at end of file diff --git a/projects/nat-flixel-desktop-playground/source/EntrySprite.hx b/projects/nat-flixel-desktop-playground/source/EntrySprite.hx index 88af7a1f..e68a2d1a 100644 --- a/projects/nat-flixel-desktop-playground/source/EntrySprite.hx +++ b/projects/nat-flixel-desktop-playground/source/EntrySprite.hx @@ -11,6 +11,7 @@ import nat.BoolExpInterp; import nat.components.Images; import nat.components.Positions; import nat.components.Scale; +using kiss_flixel.CameraTools; @:build(kiss.Kiss.build()) class EntrySprite extends FlxExtendedSprite {} diff --git a/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss b/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss index ffef1f02..7f517bd7 100644 --- a/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss +++ b/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss @@ -41,6 +41,7 @@ (prop &mut :FlxPoint fixedOffset) (method savePos [] + (FlxG.camera.extendScrollBounds this PlayState.SCROLL_BOUND_MARGIN) (withWritableComponents archive e [positions Positions] (dictSet positions positionKey (object x (cast this.x Float) y (cast this.y Float) z 0.0)))) diff --git a/projects/nat-flixel-desktop-playground/source/PlayState.kiss b/projects/nat-flixel-desktop-playground/source/PlayState.kiss index 74cf4fff..67d7d08a 100644 --- a/projects/nat-flixel-desktop-playground/source/PlayState.kiss +++ b/projects/nat-flixel-desktop-playground/source/PlayState.kiss @@ -1,9 +1,6 @@ (loadFrom "nat-archive-tool" "src/nat/Lib.kiss") -// TODO store a map of Entry IDs -> EntrySprites. // TODO handleChanges() will need to kill every changed Entry's sprite and make a new one -// TODO make the EntrySprite constructor assign the entry a serialized position component - // maybe by writing a Map positions component so there can be multiple? (method &override :Void create [] (super.create) @@ -98,7 +95,8 @@ (prop &mut :EntrySpriteSystem spriteSystem) (set spriteSystem (new EntrySpriteSystem "!done" "Playground-MAIN" this controller)) (archive.addSystem spriteSystem) - (archive.processSystems this)) + (archive.processSystems this) + (FlxG.camera.calculateScrollBounds entryGroup SCROLL_BOUND_MARGIN)) (method &override :Void update [:Float elapsed] (super.update elapsed) @@ -214,7 +212,7 @@ (set chooseNextEntry _chooseNextEntry) (_chooseNextEntry))) - +(var SCROLL_BOUND_MARGIN 200) (method handleChanges [:Archive archive :ChangeSet changeSet] (doFor e changeSet // process the WikipediaImageSystem and run spriteSystem process on newly created entries that get one @@ -222,6 +220,8 @@ // Do a second loop through the systems, so Playground systems that trigger Core systems have their effects processed (archive.processSystems this) + (FlxG.camera.calculateScrollBounds entryGroup SCROLL_BOUND_MARGIN) + // Entries whose data changed to remove them from the sprite pool will already have been removed // by refreshEntry() (when (spriteSystem.entries.exists e.id)