/****
* 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!');
}
};