From 46b73f547d9f77cce1fa1674edef10b6ca8e4077 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Fri, 11 Oct 2024 10:52:59 -0500 Subject: [PATCH] system for watching sprite changes over time while skipping --- haxe_libraries/kiss-flixel.hxml | 4 +- src/hollywoo_flixel/FlxDirector.kiss | 10 ++-- src/hollywoo_flixel/FlxMovie.hx | 3 ++ src/hollywoo_flixel/HollywooFlixelDSL.kiss | 53 ++++++++++++++++------ 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/haxe_libraries/kiss-flixel.hxml b/haxe_libraries/kiss-flixel.hxml index dda0684..0b0c98b 100644 --- a/haxe_libraries/kiss-flixel.hxml +++ b/haxe_libraries/kiss-flixel.hxml @@ -1,4 +1,4 @@ -# @install: lix --silent download "gh://github.com/kiss-lang/kiss-flixel#930ff20b81ce294d587effcb19cab86951f99aaa" into kiss-flixel/0.0.0/github/930ff20b81ce294d587effcb19cab86951f99aaa +# @install: lix --silent download "gh://github.com/kiss-lang/kiss-flixel#192d33e5fdd33c38d02d5e3d4b1c5177d10108ae" into kiss-flixel/0.0.0/github/192d33e5fdd33c38d02d5e3d4b1c5177d10108ae -lib flixel -lib flixel-addons -lib flixel-ui @@ -6,6 +6,6 @@ -lib kiss-tools -lib lime -lib openfl --cp ${HAXE_LIBCACHE}/kiss-flixel/0.0.0/github/930ff20b81ce294d587effcb19cab86951f99aaa/src/ +-cp ${HAXE_LIBCACHE}/kiss-flixel/0.0.0/github/192d33e5fdd33c38d02d5e3d4b1c5177d10108ae/src/ -D kiss-flixel=0.0.0 --macro kiss_flixel.ShaderFrontend.use() \ No newline at end of file diff --git a/src/hollywoo_flixel/FlxDirector.kiss b/src/hollywoo_flixel/FlxDirector.kiss index 1deb5fc..37f7f52 100644 --- a/src/hollywoo_flixel/FlxDirector.kiss +++ b/src/hollywoo_flixel/FlxDirector.kiss @@ -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] diff --git a/src/hollywoo_flixel/FlxMovie.hx b/src/hollywoo_flixel/FlxMovie.hx index 81ac05e..5cd38f3 100644 --- a/src/hollywoo_flixel/FlxMovie.hx +++ b/src/hollywoo_flixel/FlxMovie.hx @@ -30,6 +30,7 @@ class FlxMovie extends Movie = []; var tempCameras:Map = []; @@ -38,6 +39,8 @@ class FlxMovie extends MovieVoid> = []; + // This is overridden by HollywooFlixelDSL + public dynamic function setCameras(sprite:FlxSprite, cameras:Array):Void {} public var textProps:Array = []; public var propScales:JsonMap; diff --git a/src/hollywoo_flixel/HollywooFlixelDSL.kiss b/src/hollywoo_flixel/HollywooFlixelDSL.kiss index 0992fd3..fd5dea1 100644 --- a/src/hollywoo_flixel/HollywooFlixelDSL.kiss +++ b/src/hollywoo_flixel/HollywooFlixelDSL.kiss @@ -9,6 +9,20 @@ (function :Dynamic callPrivate [:Dynamic obj :String method &rest :Array 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 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)