/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Character = Container.expand(function () { var self = Container.call(this); // Character body var body = self.attachAsset('character', { anchorX: 0.5, anchorY: 1 }); // Curly hair var hair = self.attachAsset('characterHair', { anchorX: 0.5, anchorY: 0.5 }); hair.x = 0; hair.y = -160; // Tears (initially hidden) var leftTear = self.attachAsset('tear', { anchorX: 0.5, anchorY: 0 }); leftTear.x = -30; leftTear.y = -120; leftTear.alpha = 0; var rightTear = self.attachAsset('tear', { anchorX: 0.5, anchorY: 0 }); rightTear.x = 30; rightTear.y = -120; rightTear.alpha = 0; self.isScared = false; self.scareLevel = 0; self.scare = function () { if (self.isScared) return; self.isScared = true; self.scareLevel = Math.random() * 3 + 1; // Random scare level 1-4 // Jump animation tween(self, { y: self.y - 50 }, { duration: 200, easing: tween.easeOut }); tween(self, { y: self.y }, { duration: 300, easing: tween.bounceOut }); // Show tears leftTear.alpha = 1; rightTear.alpha = 1; // Shake animation var originalX = self.x; tween(self, { x: originalX + 10 }, { duration: 100 }); LK.setTimeout(function () { tween(self, { x: originalX - 10 }, { duration: 100 }); }, 100); LK.setTimeout(function () { tween(self, { x: originalX }, { duration: 100 }); }, 200); // Play scream sound LK.getSound('scream').play(); // Return to normal after 3 seconds LK.setTimeout(function () { self.calm(); }, 3000); }; self.calm = function () { self.isScared = false; self.scareLevel = 0; // Hide tears tween(leftTear, { alpha: 0 }, { duration: 1000 }); tween(rightTear, { alpha: 0 }, { duration: 1000 }); }; return self; }); var Television = Container.expand(function () { var self = Container.call(this); // TV frame var frame = self.attachAsset('tvFrame', { anchorX: 0.5, anchorY: 0.5 }); // TV screen var screen = self.attachAsset('tvScreen', { anchorX: 0.5, anchorY: 0.5 }); // Play button (initially visible) var playBtn = self.attachAsset('playButton', { anchorX: 0.5, anchorY: 0.5 }); var playTriangle = self.attachAsset('playTriangle', { anchorX: 0.5, anchorY: 0.5 }); playTriangle.x = 10; // Offset to make it look like a play button // Ginger character (initially hidden) var gingerContainer = new Container(); self.addChild(gingerContainer); gingerContainer.alpha = 0; var gingerFace = gingerContainer.attachAsset('gingerFace', { anchorX: 0.5, anchorY: 0.5 }); var leftEye = gingerContainer.attachAsset('gingerEyes', { anchorX: 0.5, anchorY: 0.5 }); leftEye.x = -80; leftEye.y = -50; var rightEye = gingerContainer.attachAsset('gingerEyes', { anchorX: 0.5, anchorY: 0.5 }); rightEye.x = 80; rightEye.y = -50; var mouth = gingerContainer.attachAsset('gingerMouth', { anchorX: 0.5, anchorY: 0.5 }); mouth.y = 50; self.isPlaying = false; self.down = function (x, y, obj) { if (!self.isPlaying && playBtn.alpha > 0) { self.playScareVideo(); } }; self.playScareVideo = function () { if (self.isPlaying) return; self.isPlaying = true; // Hide play button tween(playBtn, { alpha: 0 }, { duration: 300 }); tween(playTriangle, { alpha: 0 }, { duration: 300 }); // Show Ginger with dramatic entrance gingerContainer.scaleX = 0.1; gingerContainer.scaleY = 0.1; gingerContainer.alpha = 1; tween(gingerContainer, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.bounceOut }); // Play BOO sound LK.setTimeout(function () { LK.getSound('boo').play(); // Trigger scare on all characters for (var i = 0; i < characters.length; i++) { characters[i].scare(); totalScore += Math.floor(characters[i].scareLevel); } // Update score LK.setScore(totalScore); scoreText.setText('Scares: ' + totalScore); }, 300); // Hide Ginger and show play button again after 2 seconds LK.setTimeout(function () { tween(gingerContainer, { alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 500 }); LK.setTimeout(function () { tween(playBtn, { alpha: 1 }, { duration: 500 }); tween(playTriangle, { alpha: 1 }, { duration: 500 }); self.isPlaying = false; }, 1000); }, 2000); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C1810 }); /**** * Game Code ****/ var totalScore = 0; var characters = []; // Create TV var tv = game.addChild(new Television()); tv.x = 2048 / 2; tv.y = 1000; // Create three characters for (var i = 0; i < 3; i++) { var character = game.addChild(new Character()); character.x = 400 + i * 600; character.y = 1800; characters.push(character); } // Score display var scoreText = new Text2('Scares: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Instructions var instructionText = new Text2('Tap the TV to scare the viewers!', { size: 60, fill: 0xFFAA00 }); instructionText.anchor.set(0.5, 0); instructionText.y = 100; LK.gui.top.addChild(instructionText); // Game title var titleText = new Text2('SPOOKY TV SCARE', { size: 100, fill: 0xFF6600 }); titleText.anchor.set(0.5, 0); titleText.y = 200; LK.gui.top.addChild(titleText);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Character = Container.expand(function () {
var self = Container.call(this);
// Character body
var body = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 1
});
// Curly hair
var hair = self.attachAsset('characterHair', {
anchorX: 0.5,
anchorY: 0.5
});
hair.x = 0;
hair.y = -160;
// Tears (initially hidden)
var leftTear = self.attachAsset('tear', {
anchorX: 0.5,
anchorY: 0
});
leftTear.x = -30;
leftTear.y = -120;
leftTear.alpha = 0;
var rightTear = self.attachAsset('tear', {
anchorX: 0.5,
anchorY: 0
});
rightTear.x = 30;
rightTear.y = -120;
rightTear.alpha = 0;
self.isScared = false;
self.scareLevel = 0;
self.scare = function () {
if (self.isScared) return;
self.isScared = true;
self.scareLevel = Math.random() * 3 + 1; // Random scare level 1-4
// Jump animation
tween(self, {
y: self.y - 50
}, {
duration: 200,
easing: tween.easeOut
});
tween(self, {
y: self.y
}, {
duration: 300,
easing: tween.bounceOut
});
// Show tears
leftTear.alpha = 1;
rightTear.alpha = 1;
// Shake animation
var originalX = self.x;
tween(self, {
x: originalX + 10
}, {
duration: 100
});
LK.setTimeout(function () {
tween(self, {
x: originalX - 10
}, {
duration: 100
});
}, 100);
LK.setTimeout(function () {
tween(self, {
x: originalX
}, {
duration: 100
});
}, 200);
// Play scream sound
LK.getSound('scream').play();
// Return to normal after 3 seconds
LK.setTimeout(function () {
self.calm();
}, 3000);
};
self.calm = function () {
self.isScared = false;
self.scareLevel = 0;
// Hide tears
tween(leftTear, {
alpha: 0
}, {
duration: 1000
});
tween(rightTear, {
alpha: 0
}, {
duration: 1000
});
};
return self;
});
var Television = Container.expand(function () {
var self = Container.call(this);
// TV frame
var frame = self.attachAsset('tvFrame', {
anchorX: 0.5,
anchorY: 0.5
});
// TV screen
var screen = self.attachAsset('tvScreen', {
anchorX: 0.5,
anchorY: 0.5
});
// Play button (initially visible)
var playBtn = self.attachAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5
});
var playTriangle = self.attachAsset('playTriangle', {
anchorX: 0.5,
anchorY: 0.5
});
playTriangle.x = 10; // Offset to make it look like a play button
// Ginger character (initially hidden)
var gingerContainer = new Container();
self.addChild(gingerContainer);
gingerContainer.alpha = 0;
var gingerFace = gingerContainer.attachAsset('gingerFace', {
anchorX: 0.5,
anchorY: 0.5
});
var leftEye = gingerContainer.attachAsset('gingerEyes', {
anchorX: 0.5,
anchorY: 0.5
});
leftEye.x = -80;
leftEye.y = -50;
var rightEye = gingerContainer.attachAsset('gingerEyes', {
anchorX: 0.5,
anchorY: 0.5
});
rightEye.x = 80;
rightEye.y = -50;
var mouth = gingerContainer.attachAsset('gingerMouth', {
anchorX: 0.5,
anchorY: 0.5
});
mouth.y = 50;
self.isPlaying = false;
self.down = function (x, y, obj) {
if (!self.isPlaying && playBtn.alpha > 0) {
self.playScareVideo();
}
};
self.playScareVideo = function () {
if (self.isPlaying) return;
self.isPlaying = true;
// Hide play button
tween(playBtn, {
alpha: 0
}, {
duration: 300
});
tween(playTriangle, {
alpha: 0
}, {
duration: 300
});
// Show Ginger with dramatic entrance
gingerContainer.scaleX = 0.1;
gingerContainer.scaleY = 0.1;
gingerContainer.alpha = 1;
tween(gingerContainer, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
easing: tween.bounceOut
});
// Play BOO sound
LK.setTimeout(function () {
LK.getSound('boo').play();
// Trigger scare on all characters
for (var i = 0; i < characters.length; i++) {
characters[i].scare();
totalScore += Math.floor(characters[i].scareLevel);
}
// Update score
LK.setScore(totalScore);
scoreText.setText('Scares: ' + totalScore);
}, 300);
// Hide Ginger and show play button again after 2 seconds
LK.setTimeout(function () {
tween(gingerContainer, {
alpha: 0,
scaleX: 0.1,
scaleY: 0.1
}, {
duration: 500
});
LK.setTimeout(function () {
tween(playBtn, {
alpha: 1
}, {
duration: 500
});
tween(playTriangle, {
alpha: 1
}, {
duration: 500
});
self.isPlaying = false;
}, 1000);
}, 2000);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C1810
});
/****
* Game Code
****/
var totalScore = 0;
var characters = [];
// Create TV
var tv = game.addChild(new Television());
tv.x = 2048 / 2;
tv.y = 1000;
// Create three characters
for (var i = 0; i < 3; i++) {
var character = game.addChild(new Character());
character.x = 400 + i * 600;
character.y = 1800;
characters.push(character);
}
// Score display
var scoreText = new Text2('Scares: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Instructions
var instructionText = new Text2('Tap the TV to scare the viewers!', {
size: 60,
fill: 0xFFAA00
});
instructionText.anchor.set(0.5, 0);
instructionText.y = 100;
LK.gui.top.addChild(instructionText);
// Game title
var titleText = new Text2('SPOOKY TV SCARE', {
size: 100,
fill: 0xFF6600
});
titleText.anchor.set(0.5, 0);
titleText.y = 200;
LK.gui.top.addChild(titleText);