/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var facekit = LK.import("@upit/facekit.v1"); /**** * Classes ****/ var Button = Container.expand(function (assetId, color) { var self = Container.call(this); var buttonGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.isPressed = false; self.down = function (x, y, obj) { self.isPressed = true; self.scaleX = 0.9; self.scaleY = 0.9; LK.getSound('buttonClick').play(); }; self.up = function (x, y, obj) { self.isPressed = false; self.scaleX = 1.0; self.scaleY = 1.0; }; return self; }); var Puppet = Container.expand(function (color) { var self = Container.call(this); var puppetGraphics = self.attachAsset(color, { anchorX: 0.5, anchorY: 1.0 }); self.isWild = false; self.originalX = 0; self.originalY = 0; self.wildTimer = 0; self.setPosition = function (x, y) { self.originalX = x; self.originalY = y; self.x = x; self.y = y; }; self.goWild = function () { self.isWild = true; }; self.calmDown = function () { self.isWild = false; tween(self, { x: self.originalX, y: self.originalY, rotation: 0 }, { duration: 500, easing: tween.easeOut }); }; self.applaud = function () { // Clapping animation tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut }); tween(self, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200, easing: tween.easeOut }); }; self.update = function () { if (self.isWild) { self.wildTimer += 1; // Wild movements var intensity = 30; self.x = self.originalX + (Math.random() - 0.5) * intensity; self.y = self.originalY + (Math.random() - 0.5) * intensity; self.rotation = (Math.random() - 0.5) * 0.5; // Occasional jump if (self.wildTimer % 30 === 0) { tween(self, { y: self.originalY - 50 }, { duration: 300, easing: tween.easeOut }); tween(self, { y: self.originalY }, { duration: 300, easing: tween.easeIn }); } } }; return self; }); var Stage = Container.expand(function () { var self = Container.call(this); // Stage background var stageBackground = self.attachAsset('stage', { anchorX: 0.5, anchorY: 0.5 }); // Backdrop var backdrop = self.attachAsset('backdrop', { anchorX: 0.5, anchorY: 0.5 }); backdrop.y = -100; // Left curtain var leftCurtain = self.attachAsset('curtain', { anchorX: 1.0, anchorY: 0.5 }); leftCurtain.x = -700; leftCurtain.y = -100; // Right curtain var rightCurtain = self.attachAsset('curtain', { anchorX: 0.0, anchorY: 0.5 }); rightCurtain.x = 700; rightCurtain.y = -100; return self; }); var TVDisplay = Container.expand(function () { var self = Container.call(this); var tvFrame = self.attachAsset('tvFrame', { anchorX: 0.5, anchorY: 0.5 }); var tvScreen = self.attachAsset('tvScreen', { anchorX: 0.5, anchorY: 0.5 }); self.visible = false; self.show = function () { self.visible = true; tween(self, { scaleX: 1.0, scaleY: 1.0 }, { duration: 500, easing: tween.bounceOut }); }; self.hide = function () { tween(self, { scaleX: 0.0, scaleY: 0.0 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { self.visible = false; } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2F1B14 }); /**** * Game Code ****/ // Game state var gameState = 'puppet_show'; // 'puppet_show' or 'camera_mode' var redButtonPressed = false; var applauseTimer = 0; var bravoText = null; // Create stage var stage = game.addChild(new Stage()); stage.x = 2048 / 2; stage.y = 1400; // Create puppets var puppets = []; var puppet1 = new Puppet('puppet1'); var puppet2 = new Puppet('puppet2'); var puppet3 = new Puppet('puppet3'); puppet1.setPosition(-300, 0); puppet2.setPosition(0, 0); puppet3.setPosition(300, 0); stage.addChild(puppet1); stage.addChild(puppet2); stage.addChild(puppet3); puppets.push(puppet1, puppet2, puppet3); // Create buttons var redButton = game.addChild(new Button('redButton')); redButton.x = 400; redButton.y = 2400; var greenButton = game.addChild(new Button('greenButton')); greenButton.x = 1648; greenButton.y = 2400; // Create TV display var tvDisplay = game.addChild(new TVDisplay()); tvDisplay.x = 2048 / 2; tvDisplay.y = 800; tvDisplay.scaleX = 0.0; tvDisplay.scaleY = 0.0; // Create title text var titleText = new Text2('Puppet Show Director', { size: 80, fill: 0xFFD700 }); titleText.anchor.set(0.5, 0); LK.gui.top.addChild(titleText); titleText.y = 50; // Create instruction text var instructionText = new Text2('Hold RED to make puppets go wild!\nTap GREEN to appear on camera!', { size: 50, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 1); LK.gui.bottom.addChild(instructionText); instructionText.y = -100; // Red button event handling redButton.down = function (x, y, obj) { redButtonPressed = true; redButton.scaleX = 0.9; redButton.scaleY = 0.9; LK.getSound('buttonClick').play(); // Make puppets go wild for (var i = 0; i < puppets.length; i++) { puppets[i].goWild(); } }; redButton.up = function (x, y, obj) { redButtonPressed = false; redButton.scaleX = 1.0; redButton.scaleY = 1.0; // Calm down puppets for (var i = 0; i < puppets.length; i++) { puppets[i].calmDown(); } }; // Green button event handling greenButton.down = function (x, y, obj) { greenButton.scaleX = 0.9; greenButton.scaleY = 0.9; LK.getSound('buttonClick').play(); if (gameState === 'puppet_show') { // Switch to camera mode gameState = 'camera_mode'; tvDisplay.show(); // Make puppets applaud for (var i = 0; i < puppets.length; i++) { puppets[i].applaud(); } // Play applause sound LK.getSound('applause').play(); // Show bravo text if (bravoText) { bravoText.destroy(); } bravoText = new Text2('BRAVO!', { size: 120, fill: 0xFFD700 }); bravoText.anchor.set(0.5, 0.5); bravoText.x = 2048 / 2; bravoText.y = 1800; game.addChild(bravoText); // Animate bravo text tween(bravoText, { scaleX: 1.5, scaleY: 1.5 }, { duration: 300, easing: tween.bounceOut }); applauseTimer = 180; // 3 seconds at 60fps } else { // Switch back to puppet show gameState = 'puppet_show'; tvDisplay.hide(); if (bravoText) { bravoText.destroy(); bravoText = null; } } }; greenButton.up = function (x, y, obj) { greenButton.scaleX = 1.0; greenButton.scaleY = 1.0; }; // Game update loop game.update = function () { // Handle applause timer if (applauseTimer > 0) { applauseTimer--; // Make puppets continue applauding if (applauseTimer % 30 === 0) { for (var i = 0; i < puppets.length; i++) { puppets[i].applaud(); } } } // Update button instructions based on game state if (gameState === 'camera_mode') { instructionText.setText('You\'re on camera! Tap GREEN again to return to puppet show.'); } else { instructionText.setText('Hold RED to make puppets go wild!\nTap GREEN to appear on camera!'); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Button = Container.expand(function (assetId, color) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.isPressed = false;
self.down = function (x, y, obj) {
self.isPressed = true;
self.scaleX = 0.9;
self.scaleY = 0.9;
LK.getSound('buttonClick').play();
};
self.up = function (x, y, obj) {
self.isPressed = false;
self.scaleX = 1.0;
self.scaleY = 1.0;
};
return self;
});
var Puppet = Container.expand(function (color) {
var self = Container.call(this);
var puppetGraphics = self.attachAsset(color, {
anchorX: 0.5,
anchorY: 1.0
});
self.isWild = false;
self.originalX = 0;
self.originalY = 0;
self.wildTimer = 0;
self.setPosition = function (x, y) {
self.originalX = x;
self.originalY = y;
self.x = x;
self.y = y;
};
self.goWild = function () {
self.isWild = true;
};
self.calmDown = function () {
self.isWild = false;
tween(self, {
x: self.originalX,
y: self.originalY,
rotation: 0
}, {
duration: 500,
easing: tween.easeOut
});
};
self.applaud = function () {
// Clapping animation
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut
});
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200,
easing: tween.easeOut
});
};
self.update = function () {
if (self.isWild) {
self.wildTimer += 1;
// Wild movements
var intensity = 30;
self.x = self.originalX + (Math.random() - 0.5) * intensity;
self.y = self.originalY + (Math.random() - 0.5) * intensity;
self.rotation = (Math.random() - 0.5) * 0.5;
// Occasional jump
if (self.wildTimer % 30 === 0) {
tween(self, {
y: self.originalY - 50
}, {
duration: 300,
easing: tween.easeOut
});
tween(self, {
y: self.originalY
}, {
duration: 300,
easing: tween.easeIn
});
}
}
};
return self;
});
var Stage = Container.expand(function () {
var self = Container.call(this);
// Stage background
var stageBackground = self.attachAsset('stage', {
anchorX: 0.5,
anchorY: 0.5
});
// Backdrop
var backdrop = self.attachAsset('backdrop', {
anchorX: 0.5,
anchorY: 0.5
});
backdrop.y = -100;
// Left curtain
var leftCurtain = self.attachAsset('curtain', {
anchorX: 1.0,
anchorY: 0.5
});
leftCurtain.x = -700;
leftCurtain.y = -100;
// Right curtain
var rightCurtain = self.attachAsset('curtain', {
anchorX: 0.0,
anchorY: 0.5
});
rightCurtain.x = 700;
rightCurtain.y = -100;
return self;
});
var TVDisplay = Container.expand(function () {
var self = Container.call(this);
var tvFrame = self.attachAsset('tvFrame', {
anchorX: 0.5,
anchorY: 0.5
});
var tvScreen = self.attachAsset('tvScreen', {
anchorX: 0.5,
anchorY: 0.5
});
self.visible = false;
self.show = function () {
self.visible = true;
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 500,
easing: tween.bounceOut
});
};
self.hide = function () {
tween(self, {
scaleX: 0.0,
scaleY: 0.0
}, {
duration: 300,
easing: tween.easeIn,
onFinish: function onFinish() {
self.visible = false;
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F1B14
});
/****
* Game Code
****/
// Game state
var gameState = 'puppet_show'; // 'puppet_show' or 'camera_mode'
var redButtonPressed = false;
var applauseTimer = 0;
var bravoText = null;
// Create stage
var stage = game.addChild(new Stage());
stage.x = 2048 / 2;
stage.y = 1400;
// Create puppets
var puppets = [];
var puppet1 = new Puppet('puppet1');
var puppet2 = new Puppet('puppet2');
var puppet3 = new Puppet('puppet3');
puppet1.setPosition(-300, 0);
puppet2.setPosition(0, 0);
puppet3.setPosition(300, 0);
stage.addChild(puppet1);
stage.addChild(puppet2);
stage.addChild(puppet3);
puppets.push(puppet1, puppet2, puppet3);
// Create buttons
var redButton = game.addChild(new Button('redButton'));
redButton.x = 400;
redButton.y = 2400;
var greenButton = game.addChild(new Button('greenButton'));
greenButton.x = 1648;
greenButton.y = 2400;
// Create TV display
var tvDisplay = game.addChild(new TVDisplay());
tvDisplay.x = 2048 / 2;
tvDisplay.y = 800;
tvDisplay.scaleX = 0.0;
tvDisplay.scaleY = 0.0;
// Create title text
var titleText = new Text2('Puppet Show Director', {
size: 80,
fill: 0xFFD700
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
titleText.y = 50;
// Create instruction text
var instructionText = new Text2('Hold RED to make puppets go wild!\nTap GREEN to appear on camera!', {
size: 50,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
instructionText.y = -100;
// Red button event handling
redButton.down = function (x, y, obj) {
redButtonPressed = true;
redButton.scaleX = 0.9;
redButton.scaleY = 0.9;
LK.getSound('buttonClick').play();
// Make puppets go wild
for (var i = 0; i < puppets.length; i++) {
puppets[i].goWild();
}
};
redButton.up = function (x, y, obj) {
redButtonPressed = false;
redButton.scaleX = 1.0;
redButton.scaleY = 1.0;
// Calm down puppets
for (var i = 0; i < puppets.length; i++) {
puppets[i].calmDown();
}
};
// Green button event handling
greenButton.down = function (x, y, obj) {
greenButton.scaleX = 0.9;
greenButton.scaleY = 0.9;
LK.getSound('buttonClick').play();
if (gameState === 'puppet_show') {
// Switch to camera mode
gameState = 'camera_mode';
tvDisplay.show();
// Make puppets applaud
for (var i = 0; i < puppets.length; i++) {
puppets[i].applaud();
}
// Play applause sound
LK.getSound('applause').play();
// Show bravo text
if (bravoText) {
bravoText.destroy();
}
bravoText = new Text2('BRAVO!', {
size: 120,
fill: 0xFFD700
});
bravoText.anchor.set(0.5, 0.5);
bravoText.x = 2048 / 2;
bravoText.y = 1800;
game.addChild(bravoText);
// Animate bravo text
tween(bravoText, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
easing: tween.bounceOut
});
applauseTimer = 180; // 3 seconds at 60fps
} else {
// Switch back to puppet show
gameState = 'puppet_show';
tvDisplay.hide();
if (bravoText) {
bravoText.destroy();
bravoText = null;
}
}
};
greenButton.up = function (x, y, obj) {
greenButton.scaleX = 1.0;
greenButton.scaleY = 1.0;
};
// Game update loop
game.update = function () {
// Handle applause timer
if (applauseTimer > 0) {
applauseTimer--;
// Make puppets continue applauding
if (applauseTimer % 30 === 0) {
for (var i = 0; i < puppets.length; i++) {
puppets[i].applaud();
}
}
}
// Update button instructions based on game state
if (gameState === 'camera_mode') {
instructionText.setText('You\'re on camera! Tap GREEN again to return to puppet show.');
} else {
instructionText.setText('Hold RED to make puppets go wild!\nTap GREEN to appear on camera!');
}
};