From 8c82bba79a1f272ee5257026c98aa41b48a169e8 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sun, 5 May 2019 16:32:30 -0700 Subject: [PATCH] Doodad Animations Managed In-Engine * Add animation support for Doodad actors (Play Mode) into the core engine, so that the Doodad script can register named animations and play them without managing all the details themselves. * Doodad API functions on Self: AddAnimation, PlayAnimation, StopAnimation, IsAnimating * CLI: the `doodad convert` command will name each layer after the filename used as the input image. * CLI: fix the `doodad convert` command creating duplicate Palette colors when converting a series of input images into a Doodad. --- dev-assets/doodads/build.sh | 63 +++++++++++++++++++--- dev-assets/doodads/doors/electric-door.js | 35 +++---------- dev-assets/doodads/doors/locked-door.js | 10 +++- dev-assets/doodads/trapdoors/down.js | 64 ++++++----------------- 4 files changed, 91 insertions(+), 81 deletions(-) diff --git a/dev-assets/doodads/build.sh b/dev-assets/doodads/build.sh index a850ad8..33dd6ea 100755 --- a/dev-assets/doodads/build.sh +++ b/dev-assets/doodads/build.sh @@ -11,17 +11,61 @@ mkdir -p ../../assets/doodads buttons() { cd buttons/ - doodad convert -t "Sticky Button" sticky1.png sticky2.png sticky-button.doodad - doodad install-script sticky.js sticky-button.doodad - cp sticky-button.doodad ../../../assets/doodads/ + doodad convert -t "Sticky Button" sticky1.png sticky2.png button-sticky.doodad + doodad install-script sticky.js button-sticky.doodad doodad convert -t "Button" button1.png button2.png button.doodad doodad install-script button.js button.doodad - cp button.doodad ../../../assets/doodads/ doodad convert -t "Button Type B" typeB1.png typeB2.png button-typeB.doodad doodad install-script button.js button-typeB.doodad - cp button-typeB.doodad ../../../assets/doodads/ + + cp button*.doodad ../../../assets/doodads/ + cd .. +} + +doors() { + cd doors/ + + doodad convert -t "Red Door" red1.png red2.png door-red.doodad + doodad install-script locked-door.js door-red.doodad + + doodad convert -t "Blue Door" blue1.png blue2.png door-blue.doodad + doodad install-script locked-door.js door-blue.doodad + + doodad convert -t "Green Door" green1.png green2.png door-green.doodad + doodad install-script locked-door.js door-green.doodad + + doodad convert -t "Yellow Door" yellow1.png yellow2.png door-yellow.doodad + doodad install-script locked-door.js door-yellow.doodad + + doodad convert -t "Red Key" red-key.png key-red.doodad + doodad install-script keys.js key-red.doodad + + doodad convert -t "Blue Key" blue-key.png key-blue.doodad + doodad install-script keys.js key-blue.doodad + + doodad convert -t "Green Key" green-key.png key-green.doodad + doodad install-script keys.js key-green.doodad + + doodad convert -t "Yellow Key" yellow-key.png key-yellow.doodad + doodad install-script keys.js key-yellow.doodad + + doodad convert -t "Electric Door" electric{1,2,3,4}.png door-electric.doodad + doodad install-script electric-door.js door-electric.doodad + + cp door-*.doodad key-*.doodad ../../../assets/doodads/ + + cd .. +} + +trapdoors() { + cd trapdoors/ + + doodad convert -t "Trapdoor" down{1,2,3,4}.png trapdoor-down.doodad + doodad install-script down.js trapdoor-down.doodad + + cp trapdoor-*.doodad ../../../assets/doodads/ cd .. } @@ -32,10 +76,17 @@ azulians() { doodad convert -t "Blue Azulian" blu-front.png blu-back.png \ blu-wr{1,2,3,4}.png blu-wl{1,2,3,4}.png azu-blu.doodad doodad install-script azulian.js azu-blu.doodad - cp azu-blu.doodad ../../../assets/doodads/ + + doodad convert -t "Red Azulian" red-front.png red-back.png \ + red-wr{1,2,3,4}.png red-wl{1,2,3,4}.png azu-red.doodad + doodad install-script azulian-red.js azu-red.doodad + + cp azu-*.doodad ../../../assets/doodads/ cd .. } buttons +doors +trapdoors azulians diff --git a/dev-assets/doodads/doors/electric-door.js b/dev-assets/doodads/doors/electric-door.js index dedae0d..b665d73 100644 --- a/dev-assets/doodads/doors/electric-door.js +++ b/dev-assets/doodads/doors/electric-door.js @@ -1,35 +1,16 @@ function main() { console.log("%s initialized!", Self.Doodad.Title); - var timer = 0; + var err = Self.AddAnimation("open", 100, [0, 1, 2, 3]); + console.error("door error: %s", err) + var animating = false; - // Animation frames. - var frame = 0; - var frames = Self.LayerCount(); - var animationDirection = 1; // forward or backward - var animationSpeed = 100; // interval between frames when animating - var animating = false; // true if animation is actively happening - - console.warn("Electric Door has %d frames", frames); - - // Animation interval function. - setInterval(function() { - if (!animating) { + Events.OnCollide(function() { + if (animating) { return; } - // Advance the frame forwards or backwards. - frame += animationDirection; - if (frame >= frames) { - // Reached the last frame, start the pause and reverse direction. - animating = false; - frame = frames - 1; - } - - Self.ShowLayer(frame); - }, animationSpeed); - - Events.OnCollide( function() { - animating = true; // start the animation - }) + animating = true; + Self.PlayAnimation("open", null); + }); } diff --git a/dev-assets/doodads/doors/locked-door.js b/dev-assets/doodads/doors/locked-door.js index 7d1ee7a..75545f9 100644 --- a/dev-assets/doodads/doors/locked-door.js +++ b/dev-assets/doodads/doors/locked-door.js @@ -1,5 +1,13 @@ function main() { + Self.AddAnimation("open", 0, [1]); + var unlocked = false; + Events.OnCollide(function(e) { - Self.ShowLayer(1); + if (unlocked) { + return; + } + + unlocked = true; + Self.PlayAnimation("open", null); }); } diff --git a/dev-assets/doodads/trapdoors/down.js b/dev-assets/doodads/trapdoors/down.js index a38b70d..209eedc 100644 --- a/dev-assets/doodads/trapdoors/down.js +++ b/dev-assets/doodads/trapdoors/down.js @@ -3,53 +3,23 @@ function main() { var timer = 0; - // Animation frames. - var frame = 0; - var frames = Self.LayerCount(); - var animationDirection = 1; // forward or backward - var animationSpeed = 100; // interval between frames when animating - var animationDelay = 8; // delay ticks at the end before reversing, in - // multiples of animationSpeed - var delayCountdown = 0; - var animating = false; // true if animation is actively happening - - console.warn("Trapdoor has %d frames", frames); - - // Animation interval function. - setInterval(function() { - if (!animating) { - return; - } - - // At the end of the animation (door is open), delay before resuming - // the close animation. - if (delayCountdown > 0) { - delayCountdown--; - return; - } - - // Advance the frame forwards or backwards. - frame += animationDirection; - if (frame >= frames) { - // Reached the last frame, start the pause and reverse direction. - delayCountdown = animationDelay; - animationDirection = -1; - - // also bounds check it - frame = frames - 1; - } - - if (frame < 0) { - // reached the start again - frame = 0; - animationDirection = 1; - animating = false; - } - - Self.ShowLayer(frame); - }, animationSpeed); + var animationSpeed = 100; + var animating = false; + Self.AddAnimation("open", animationSpeed, ["down1", "down2", "down3", "down4"]); + Self.AddAnimation("close", animationSpeed, ["down4", "down3", "down2", "down1"]); Events.OnCollide( function() { - animating = true; // start the animation - }) + if (animating) { + return; + } + + animating = true; + Self.PlayAnimation("open", function() { + setTimeout(function() { + Self.PlayAnimation("close", function() { + animating = false; + }); + }, 3000); + }) + }); }