add temporary background camera feature

This commit is contained in:
2024-09-25 18:40:14 -05:00
parent fb75ed2b52
commit 6727d3b77d
2 changed files with 28 additions and 6 deletions

View File

@@ -30,7 +30,10 @@ class FlxMovie extends Movie<FlxSprite, ActorFlxSprite, FlxSound, FlxSound, FlxS
}
public var uiCamera:FlxCamera;
public var screenCamera:FlxCamera;
// TODO order isn't preserved. God help me
var tempCameras:Map<FlxCamera,Bool> = [];
var tempBgCameras:Map<FlxCamera,Bool> = [];
public var nextFrameActions:Array<Void->Void> = [];

View File

@@ -101,6 +101,14 @@
(FlxG.cameras.add uiCamera false)
})
(defMacro underAllCameras [&body b]
`(let [cameras (.copy FlxG.cameras.list)]
(doFor camera cameras
(FlxG.cameras.remove camera false))
,@b
(doFor camera cameras
(FlxG.cameras.add camera (or ?(dictGet tempCameras camera) ?(dictGet tempBgCameras camera))))))
(preload
// This is silly. onSkipEnd should just be a virtual function or a proper event handler
// object, not a Void->Void field
@@ -108,21 +116,29 @@
(set onSkipEnd ->{
(superSkipEnd)
// If a background shader camera is hidden, reveal it
(underAllCameras
(doFor =>camera arg tempBgCameras
(FlxG.cameras.add camera arg)))
(underUICamera
(doFor =>camera arg tempCameras
(FlxG.cameras.add camera arg)))
})))
// When skipping through, don't add the camera until skipping ends
(hollywooMethod addTempCamera [:Bool skipping :FlxCamera camera &opt :Bool defaultDrawTarget :Continuation cc]
(underUICamera
(dictSet tempCameras camera ?defaultDrawTarget)
(unless skipping
(FlxG.cameras.add camera ?defaultDrawTarget)))
(hollywooMethod addTempCamera [:Bool skipping :FlxCamera camera &opt :Bool defaultDrawTarget :Bool bg :Continuation cc]
(dictSet (if bg tempBgCameras tempCameras) camera ?defaultDrawTarget)
(unless ~skipping
(if bg
(underAllCameras (FlxG.cameras.add camera ?defaultDrawTarget)))
(underUICamera (FlxG.cameras.add camera ?defaultDrawTarget)))
(when cc (cc)))
(hollywooMethod removeTempCamera [:FlxCamera camera &opt :Bool destroy :Continuation cc]
(tempCameras.remove camera)
(if (tempCameras.exists camera)
(tempCameras.remove camera)
(tempBgCameras.remove camera))
(when (FlxG.cameras.list.contains camera) (FlxG.cameras.remove camera ?destroy))
(when cc (cc)))
@@ -456,6 +472,9 @@
(cleanup
(doFor =>camera _ tempCameras
(when (FlxG.cameras.list.contains camera)
(FlxG.cameras.remove camera true)))
(doFor =>camera _ tempBgCameras
(when (FlxG.cameras.list.contains camera)
(FlxG.cameras.remove camera true))))