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() {
|
||||
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
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
})
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user