CameraTools/GroupTools bugfixing and sprite scale support
This commit is contained in:
@@ -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;
|
||||
|
@@ -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<T> 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<T> 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))
|
||||
|
@@ -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 {}
|
||||
|
@@ -8,20 +8,22 @@
|
||||
(group.remove obj)
|
||||
(group.insert 0 obj)))
|
||||
|
||||
(function :FlxRect calculateBounds <>[:FlxObject T] [:FlxTypedGroup<T> group &opt :Float margin]
|
||||
(function :FlxRect calculateScreenBounds <>[:FlxSprite T] [:FlxTypedGroup<T> 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))
|
||||
|
Reference in New Issue
Block a user