diff --git a/src/kiss_flixel/CameraTools.hx b/src/kiss_flixel/CameraTools.hx index b7c140f..0f7221e 100644 --- a/src/kiss_flixel/CameraTools.hx +++ b/src/kiss_flixel/CameraTools.hx @@ -7,6 +7,7 @@ import flash.display.BitmapData; import flixel.FlxCamera; import flixel.math.FlxVector; import flixel.math.FlxPoint; +import flixel.math.FlxRect; import flixel.FlxSprite; import flixel.FlxG; import flixel.util.FlxColor; diff --git a/src/kiss_flixel/CameraTools.kiss b/src/kiss_flixel/CameraTools.kiss index aa03588..6673d4e 100644 --- a/src/kiss_flixel/CameraTools.kiss +++ b/src/kiss_flixel/CameraTools.kiss @@ -76,20 +76,36 @@ (<= (- bottom margin) mPos.y) (<= (- bottom margin) mPos.y bottom))))) -(function updateScrollWheelZoom [:FlxCamera camera :Float elapsed :Float speed] - #{ - if (FlxG.mouse.wheel != 0) { - camera.zoom += (FlxG.mouse.wheel * elapsed * speed); - } - }#) +// GOTCHA: if you change FlxG.camera to a moving camera, you MUST provide a default camera for FlxG.mouse.getScreenPosition() +(function updateScrollWheelZoom [:FlxCamera camera :Float elapsed :Float speed &opt :FlxCamera screenCamera] + (case FlxG.mouse.wheel + (0 null) + (v + (let [deltaZoom (* camera.zoom v elapsed speed) + scrollPosition (camera.scroll.copyTo) + mouseWorldPosition (FlxG.mouse.getWorldPosition camera)] + (+= camera.zoom deltaZoom) + (let [newMouseWorldPosition (FlxG.mouse.getWorldPosition camera) + deltaMousePosition (newMouseWorldPosition.subtractPoint mouseWorldPosition)] + (camera.scroll.subtractPoint deltaMousePosition)) + // Undo any scrolling that expands the viewport past its bounds + **(unless (.containsPoint (getScrollBounds camera) camera.scroll) + (-= camera.zoom deltaZoom) + (set camera.scroll scrollPosition)))) + (otherwise null))) -(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 getScrollBounds [:FlxCamera camera] + (.fromTwoPoints (new FlxRect) (new FlxPoint camera.minScrollX camera.minScrollY) (new FlxPoint camera.maxScrollX camera.maxScrollY))) -(function extendScrollBounds [:FlxCamera camera :FlxObject object &opt :Float margin] +// GOTCHA: if you change FlxG.camera to a moving camera, you MUST provide a default camera for FlxG.mouse.getScreenPosition() +(function calculateScrollBounds <>[:FlxSprite T] [:FlxCamera camera :FlxTypedGroup group &opt :FlxCamera screenCamera :Float margin] + (let [r (GroupTools.calculateScreenBounds group screenCamera margin)] + (camera.setScrollBoundsRect r.x r.y ~r.width ~r.height))) + +// GOTCHA: if you change FlxG.camera to a moving camera, you MUST provide a default camera for FlxG.mouse.getScreenPosition() +(function extendScrollBounds [:FlxCamera camera :FlxSprite sprite &opt :FlxCamera screenCamera :Float margin] // if the given object is out of bounds, extend the bounds - (let [r (object.getRotatedBounds)] + (let [r (sprite.getScreenBounds camera)] (setMin camera.minScrollX (- r.left margin)) (setMin camera.minScrollY (- r.top margin)) (setMax camera.maxScrollX (+ r.right margin)) diff --git a/src/kiss_flixel/GroupTools.hx b/src/kiss_flixel/GroupTools.hx index 91cfd69..a1f5ff4 100644 --- a/src/kiss_flixel/GroupTools.hx +++ b/src/kiss_flixel/GroupTools.hx @@ -6,7 +6,9 @@ import flixel.FlxObject; import flixel.FlxState; import flixel.math.FlxRect; import flixel.math.FlxPoint; +import flixel.FlxCamera; import flixel.group.FlxGroup; +import flixel.FlxSprite; @:build(kiss.Kiss.build()) class GroupTools {} diff --git a/src/kiss_flixel/GroupTools.kiss b/src/kiss_flixel/GroupTools.kiss index 22be101..6726081 100644 --- a/src/kiss_flixel/GroupTools.kiss +++ b/src/kiss_flixel/GroupTools.kiss @@ -8,20 +8,22 @@ (group.remove obj) (group.insert 0 obj))) -(function :FlxRect calculateBounds <>[:FlxObject T] [:FlxTypedGroup group &opt :Float margin] +(function :FlxRect calculateScreenBounds <>[:FlxSprite T] [:FlxTypedGroup group &opt :FlxCamera camera :Float margin] (unless margin (set margin 0)) - (let [&mut minX 0 - &mut maxX 0 - &mut minY 0 - &mut maxY 0 - r (new FlxRect)] + (let [s (group.getFirstAlive) + r (new FlxRect) + bounds (s.getScreenBounds r camera) + &mut minX bounds.left + &mut maxX bounds.right + &mut minY bounds.top + &mut maxY bounds.bottom] - (group.forEach ->object - (let [bounds (object.getRotatedBounds r)] - (set minX (min minX bounds.left)) - (set minY (min minY bounds.top)) - (set maxX (max maxX bounds.right)) - (set maxY (max maxY bounds.bottom)))) + (group.forEach ->sprite + (let [bounds (sprite.getScreenBounds r camera)] + (setMin minX bounds.left) + (setMin minY bounds.top) + (setMax maxX bounds.right) + (setMax maxY bounds.bottom))) (r.fromTwoPoints (new FlxPoint (- minX margin) (- minY margin))