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.
This commit is contained in:
parent
1f0075b0f2
commit
8c82bba79a
|
@ -11,17 +11,61 @@ mkdir -p ../../assets/doodads
|
||||||
buttons() {
|
buttons() {
|
||||||
cd buttons/
|
cd buttons/
|
||||||
|
|
||||||
doodad convert -t "Sticky Button" sticky1.png sticky2.png sticky-button.doodad
|
doodad convert -t "Sticky Button" sticky1.png sticky2.png button-sticky.doodad
|
||||||
doodad install-script sticky.js sticky-button.doodad
|
doodad install-script sticky.js button-sticky.doodad
|
||||||
cp sticky-button.doodad ../../../assets/doodads/
|
|
||||||
|
|
||||||
doodad convert -t "Button" button1.png button2.png button.doodad
|
doodad convert -t "Button" button1.png button2.png button.doodad
|
||||||
doodad install-script button.js 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 convert -t "Button Type B" typeB1.png typeB2.png button-typeB.doodad
|
||||||
doodad install-script button.js 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 ..
|
cd ..
|
||||||
}
|
}
|
||||||
|
@ -32,10 +76,17 @@ azulians() {
|
||||||
doodad convert -t "Blue Azulian" blu-front.png blu-back.png \
|
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
|
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
|
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 ..
|
cd ..
|
||||||
}
|
}
|
||||||
|
|
||||||
buttons
|
buttons
|
||||||
|
doors
|
||||||
|
trapdoors
|
||||||
azulians
|
azulians
|
||||||
|
|
|
@ -1,35 +1,16 @@
|
||||||
function main() {
|
function main() {
|
||||||
console.log("%s initialized!", Self.Doodad.Title);
|
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.
|
Events.OnCollide(function() {
|
||||||
var frame = 0;
|
if (animating) {
|
||||||
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) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Advance the frame forwards or backwards.
|
animating = true;
|
||||||
frame += animationDirection;
|
Self.PlayAnimation("open", null);
|
||||||
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
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
function main() {
|
function main() {
|
||||||
|
Self.AddAnimation("open", 0, [1]);
|
||||||
|
var unlocked = false;
|
||||||
|
|
||||||
Events.OnCollide(function(e) {
|
Events.OnCollide(function(e) {
|
||||||
Self.ShowLayer(1);
|
if (unlocked) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unlocked = true;
|
||||||
|
Self.PlayAnimation("open", null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,53 +3,23 @@ function main() {
|
||||||
|
|
||||||
var timer = 0;
|
var timer = 0;
|
||||||
|
|
||||||
// Animation frames.
|
var animationSpeed = 100;
|
||||||
var frame = 0;
|
var animating = false;
|
||||||
var frames = Self.LayerCount();
|
Self.AddAnimation("open", animationSpeed, ["down1", "down2", "down3", "down4"]);
|
||||||
var animationDirection = 1; // forward or backward
|
Self.AddAnimation("close", animationSpeed, ["down4", "down3", "down2", "down1"]);
|
||||||
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);
|
|
||||||
|
|
||||||
Events.OnCollide( function() {
|
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);
|
||||||
})
|
})
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user