/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // ScaryEnemy: covers the screen with a scary face (ellipse, red) var ScaryEnemy = Container.expand(function () { var self = Container.call(this); // Create a large ellipse to cover the screen // We'll use a red ellipse as the "scary face" var face = self.attachAsset('scaryFace', { anchorX: 0.5, anchorY: 0.5, width: 1800, height: 2200, color: 0xff2222, shape: 'ellipse' }); // Add two "eyes" (black ellipses) var leftEye = self.attachAsset('scaryEye', { anchorX: 0.5, anchorY: 0.5, width: 220, height: 320, color: 0x000000, shape: 'ellipse' }); leftEye.x = -350; leftEye.y = -300; leftEye.alpha = 0; var rightEye = self.attachAsset('scaryEye', { anchorX: 0.5, anchorY: 0.5, width: 220, height: 320, color: 0x000000, shape: 'ellipse' }); rightEye.x = 350; rightEye.y = -300; rightEye.alpha = 0; // Add a "mouth" (black ellipse) var mouth = self.attachAsset('scaryMouth', { anchorX: 0.5, anchorY: 0.5, width: 600, height: 180, color: 0x000000, shape: 'ellipse' }); mouth.y = 400; mouth.alpha = 0; // Start invisible and scaled down self.alpha = 0; self.scaleX = 0.7; self.scaleY = 0.7; // Animate in (jump scare) self.jumpScare = function () { // Fade in and scale up quickly tween(self, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 220, easing: tween.easeOut }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // We will use tween for the enemy jump-scare animation // State variables var countdownActive = false; var countdownValue = 3; var countdownTimer = null; var scareTimer = null; var scaryEnemy = null; var button = null; var countdownText = null; var infoText = null; // Center positions var centerX = 2048 / 2; var centerY = 2732 / 2; // --- UI Elements --- // Info text (top center) infoText = new Text2("Click the button to get a big scare!", { size: 100, fill: 0xFFFFFF }); infoText.anchor.set(0.5, 0); LK.gui.top.addChild(infoText); // Countdown text (center, hidden at start) countdownText = new Text2("", { size: 400, fill: 0xFFFFFF }); countdownText.anchor.set(0.5, 0.5); countdownText.visible = false; game.addChild(countdownText); countdownText.x = centerX; countdownText.y = centerY; // Start button (center, big) button = new Container(); var buttonBg = button.attachAsset('startButton', { anchorX: 0.5, anchorY: 0.5, width: 800, height: 300, color: 0x2222ff, shape: 'box' }); var buttonLabel = new Text2("START", { size: 160, fill: 0xFFFFFF }); buttonLabel.anchor.set(0.5, 0.5); button.addChild(buttonLabel); button.x = centerX; button.y = centerY + 500; game.addChild(button); // --- Button Event --- button.down = function (x, y, obj) { if (countdownActive) return; startCountdown(); }; // --- Countdown Logic --- function startCountdown() { countdownActive = true; countdownValue = 3; button.visible = false; infoText.setText("Get ready..."); countdownText.visible = true; updateCountdownText(); // Start countdown timer (1 second interval) countdownTimer = LK.setInterval(function () { countdownValue -= 1; if (countdownValue >= 0) { updateCountdownText(); } if (countdownValue < 0) { LK.clearInterval(countdownTimer); countdownText.visible = false; showScaryEnemy(); } }, 1000); } function updateCountdownText() { countdownText.setText(countdownValue > 0 ? countdownValue : "0"); } // --- Scary Enemy Logic --- function showScaryEnemy() { // Remove previous enemy if any if (scaryEnemy) { scaryEnemy.destroy(); scaryEnemy = null; } // Create and show enemy scaryEnemy = new ScaryEnemy(); scaryEnemy.x = centerX; scaryEnemy.y = centerY; game.addChild(scaryEnemy); scaryEnemy.jumpScare(); // Flash screen red for extra effect LK.effects.flashScreen(0xff0000, 300); // After 3 seconds, end game (lose) scareTimer = LK.setTimeout(function () { LK.showGameOver(); }, 3000); } // --- Game Reset Handler --- // When the game is reset (after game over), all variables are re-initialized by LK. // No need to handle reset logic here. // --- Prevent accidental drag on button --- button.move = function (x, y, obj) {}; button.up = function (x, y, obj) {}; // --- Ensure nothing is in the top left 100x100 px --- // All UI is centered or top center, nothing in top left // --- No update loop needed --- // All logic is event/timer driven
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// ScaryEnemy: covers the screen with a scary face (ellipse, red)
var ScaryEnemy = Container.expand(function () {
var self = Container.call(this);
// Create a large ellipse to cover the screen
// We'll use a red ellipse as the "scary face"
var face = self.attachAsset('scaryFace', {
anchorX: 0.5,
anchorY: 0.5,
width: 1800,
height: 2200,
color: 0xff2222,
shape: 'ellipse'
});
// Add two "eyes" (black ellipses)
var leftEye = self.attachAsset('scaryEye', {
anchorX: 0.5,
anchorY: 0.5,
width: 220,
height: 320,
color: 0x000000,
shape: 'ellipse'
});
leftEye.x = -350;
leftEye.y = -300;
leftEye.alpha = 0;
var rightEye = self.attachAsset('scaryEye', {
anchorX: 0.5,
anchorY: 0.5,
width: 220,
height: 320,
color: 0x000000,
shape: 'ellipse'
});
rightEye.x = 350;
rightEye.y = -300;
rightEye.alpha = 0;
// Add a "mouth" (black ellipse)
var mouth = self.attachAsset('scaryMouth', {
anchorX: 0.5,
anchorY: 0.5,
width: 600,
height: 180,
color: 0x000000,
shape: 'ellipse'
});
mouth.y = 400;
mouth.alpha = 0;
// Start invisible and scaled down
self.alpha = 0;
self.scaleX = 0.7;
self.scaleY = 0.7;
// Animate in (jump scare)
self.jumpScare = function () {
// Fade in and scale up quickly
tween(self, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 220,
easing: tween.easeOut
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// We will use tween for the enemy jump-scare animation
// State variables
var countdownActive = false;
var countdownValue = 3;
var countdownTimer = null;
var scareTimer = null;
var scaryEnemy = null;
var button = null;
var countdownText = null;
var infoText = null;
// Center positions
var centerX = 2048 / 2;
var centerY = 2732 / 2;
// --- UI Elements ---
// Info text (top center)
infoText = new Text2("Click the button to get a big scare!", {
size: 100,
fill: 0xFFFFFF
});
infoText.anchor.set(0.5, 0);
LK.gui.top.addChild(infoText);
// Countdown text (center, hidden at start)
countdownText = new Text2("", {
size: 400,
fill: 0xFFFFFF
});
countdownText.anchor.set(0.5, 0.5);
countdownText.visible = false;
game.addChild(countdownText);
countdownText.x = centerX;
countdownText.y = centerY;
// Start button (center, big)
button = new Container();
var buttonBg = button.attachAsset('startButton', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 300,
color: 0x2222ff,
shape: 'box'
});
var buttonLabel = new Text2("START", {
size: 160,
fill: 0xFFFFFF
});
buttonLabel.anchor.set(0.5, 0.5);
button.addChild(buttonLabel);
button.x = centerX;
button.y = centerY + 500;
game.addChild(button);
// --- Button Event ---
button.down = function (x, y, obj) {
if (countdownActive) return;
startCountdown();
};
// --- Countdown Logic ---
function startCountdown() {
countdownActive = true;
countdownValue = 3;
button.visible = false;
infoText.setText("Get ready...");
countdownText.visible = true;
updateCountdownText();
// Start countdown timer (1 second interval)
countdownTimer = LK.setInterval(function () {
countdownValue -= 1;
if (countdownValue >= 0) {
updateCountdownText();
}
if (countdownValue < 0) {
LK.clearInterval(countdownTimer);
countdownText.visible = false;
showScaryEnemy();
}
}, 1000);
}
function updateCountdownText() {
countdownText.setText(countdownValue > 0 ? countdownValue : "0");
}
// --- Scary Enemy Logic ---
function showScaryEnemy() {
// Remove previous enemy if any
if (scaryEnemy) {
scaryEnemy.destroy();
scaryEnemy = null;
}
// Create and show enemy
scaryEnemy = new ScaryEnemy();
scaryEnemy.x = centerX;
scaryEnemy.y = centerY;
game.addChild(scaryEnemy);
scaryEnemy.jumpScare();
// Flash screen red for extra effect
LK.effects.flashScreen(0xff0000, 300);
// After 3 seconds, end game (lose)
scareTimer = LK.setTimeout(function () {
LK.showGameOver();
}, 3000);
}
// --- Game Reset Handler ---
// When the game is reset (after game over), all variables are re-initialized by LK.
// No need to handle reset logic here.
// --- Prevent accidental drag on button ---
button.move = function (x, y, obj) {};
button.up = function (x, y, obj) {};
// --- Ensure nothing is in the top left 100x100 px ---
// All UI is centered or top center, nothing in top left
// --- No update loop needed ---
// All logic is event/timer driven