/****
* 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