system for watching sprite changes over time while skipping

This commit is contained in:
2024-10-11 10:52:59 -05:00
parent 66fce7d81d
commit 46b73f547d
4 changed files with 49 additions and 21 deletions

View File

@@ -298,15 +298,17 @@
(skySprite.makeGraphic (Std.int setSprite.width) (Std.int setSprite.height) skyColor true)))
(set skySprite.x setSprite.x)
(set skySprite.y 0)
(set skySprite.cameras [camera])
(flxMovie.setCameras skySprite [camera])
(.add (first spriteLayers.members) skySprite)
(FlxG.cameras.remove flxMovie.uiCamera false)
(FlxG.cameras.remove flxMovie.screenCamera false)
(FlxG.cameras.remove flxMovie.spriteChangeDebugCamera false)
(FlxG.cameras.add camera false)
(FlxG.cameras.add flxMovie.screenCamera false)
(FlxG.cameras.add flxMovie.uiCamera false)
(set setSprite.cameras [camera])
(FlxG.cameras.add flxMovie.spriteChangeDebugCamera false)
(flxMovie.setCameras setSprite [camera])
(.add (first spriteLayers.members) setSprite)
(cc))
@@ -529,7 +531,7 @@
(character.actor.setGraphicSize flxMovie.ACTOR_WIDTH)
(character.actor.updateHitbox))
(set character.actor.cameras [camera])
(flxMovie.setCameras character.actor [camera])
(set character.actor.flipX ?!(= character.stageFacing character.actor.defaultFacing))
// For characters whose images are forward-facing portraits, it's wrong to flip them based on facing:
(when character.actor.portraitFacingForward
@@ -956,7 +958,7 @@
(prop &mut :Bool oldScaleBehavior false)
(method :Void showProp [:FlxSprite prop :StagePosition position :Appearance appearance :FlxCamera camera :Continuation cc]
(set prop.cameras [camera])
(flxMovie.setCameras prop [camera])
(let [width (min (max prop.width PROP_MIN_WIDTH) PROP_MAX_WIDTH)]
(unless (and !oldScaleBehavior (flxMovie.textProps.contains prop))
(whenLet [FirstAppearance appearance]

View File

@@ -30,6 +30,7 @@ class FlxMovie extends Movie<FlxSprite, ActorFlxSprite, FlxSound, FlxSound, FlxS
}
public var uiCamera:FlxCamera;
public var screenCamera:FlxCamera;
public var spriteChangeDebugCamera:FlxCamera;
var tempCamerasOrder:Array<FlxCamera> = [];
var tempCameras:Map<FlxCamera,Bool> = [];
@@ -38,6 +39,8 @@ class FlxMovie extends Movie<FlxSprite, ActorFlxSprite, FlxSound, FlxSound, FlxS
public var nextFrameActions:Array<Void->Void> = [];
// This is overridden by HollywooFlixelDSL
public dynamic function setCameras(sprite:FlxSprite, cameras:Array<flixel.FlxCamera>):Void {}
public var textProps:Array<FlxSprite> = [];
public var propScales:JsonMap<JsonFloat>;

View File

@@ -9,6 +9,20 @@
(function :Dynamic callPrivate [:Dynamic obj :String method &rest :Array<Dynamic> args]
(Reflect.callMethod obj (Reflect.field obj method) args))
(defMacro doOnUpdateWhile [condition &body b]
(let [funcName (symbol)]
`(withFunctions
[
(,funcName []
(when ,condition
(nextFrameActions.push
->:Void {
,@b
(,funcName)
})))
]
(,funcName))))
(method newFlxTextProp [:String key :String text :Int size :FlxColor color &opt :String font]
(let [prop (SpriteTools.textPlate text size 0 color FlxColor.TRANSPARENT null font)]
(_addProp key prop)
@@ -518,7 +532,28 @@
(set uiCamera (new flixel.FlxCamera))
(set uiCamera.bgColor FlxColor.TRANSPARENT)
(flixel.FlxG.cameras.add uiCamera false)
(set kiss_flixel.SimpleWindow.defaultCamera uiCamera)))
(set kiss_flixel.SimpleWindow.defaultCamera uiCamera))
(unless spriteChangeDebugCamera
(set spriteChangeDebugCamera (new flixel.FlxCamera))
(set spriteChangeDebugCamera.bgColor FlxColor.TRANSPARENT)
(FlxG.cameras.add spriteChangeDebugCamera)
(dictSet kiss_flixel.SpriteTools.ignoreCameras spriteChangeDebugCamera true)))
// If a sprite could possibly be targeted for change debugging, then its cameras always need to be set using (flxMovie.setCameras...)
(preload (set this.setCameras ->:Void [:FlxSprite sprite :Array<flixel.FlxCamera> cameras] {
(set sprite.cameras cameras)
(when debuggingSprite
(debugSpriteChanges debuggingSprite))
}))
(prop &mut :FlxSprite debuggingSprite null)
(method :Void debugSpriteChanges [:FlxSprite sprite]
(set debuggingSprite sprite)
(FlxG.state.add sprite)
(unless sprite.cameras
(set sprite.cameras []))
(sprite.cameras.push spriteChangeDebugCamera)
(spriteChangeDebugCamera.follow sprite))
(preload
// I think it's safe to leave a cleaned-up movie as this reference,
@@ -769,20 +804,6 @@
(thing.destroy))))
(m.clear))
(defMacro doOnUpdateWhile [condition &body b]
(let [funcName (symbol)]
`(withFunctions
[
(,funcName []
(when ,condition
(nextFrameActions.push
->:Void {
,@b
(,funcName)
})))
]
(,funcName))))
(defMacro addSkips [flxMovieClass]
`{
(method &override :Void prepareForSkip []
@@ -822,6 +843,8 @@
(set kiss_flixel.SimpleWindow.defaultCamera FlxG.camera)
(when (flixel.FlxG.cameras.list.contains screenCamera)
(flixel.FlxG.cameras.remove screenCamera true))
(when (flixel.FlxG.cameras.list.contains spriteChangeDebugCamera)
(flixel.FlxG.cameras.remove spriteChangeDebugCamera true))
// I hope this disposes of references to actors, props, sets, etc.:
(scenes.clear)