/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Target class: a tappable, animated target
var Target = Container.expand(function () {
var self = Container.call(this);
// Pick a random color for the target
var colorIds = ['targetRed', 'targetBlue', 'targetGreen', 'targetYellow'];
var colorId = colorIds[Math.floor(Math.random() * colorIds.length)];
// Attach the asset, anchor at center
var targetAsset = self.attachAsset(colorId, {
anchorX: 0.5,
anchorY: 0.5
});
// For animation (pop in)
targetAsset.scaleX = 0.7;
targetAsset.scaleY = 0.7;
tween(targetAsset, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeOut
});
// Mark as not yet tapped
self.tapped = false;
// Called when the target is tapped
self.down = function (x, y, obj) {
if (self.tapped) return;
self.tapped = true;
// Animate: shrink and fade out
tween(targetAsset, {
scaleX: 1.3,
scaleY: 1.3,
alpha: 0
}, {
duration: 120,
easing: tween.easeIn,
onFinish: function onFinish() {
self.destroy();
}
});
// Play pop sound
LK.getSound('pop').play();
// Increase score
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
// Spawn next target immediately
spawnNextTarget();
};
// For missed detection
self.missed = false;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Targets: Large, colorful circles
// Score display
var scoreTxt = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Timer display
var timerTxt = new Text2('30', {
size: 90,
fill: 0xFFF700
});
timerTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(timerTxt);
timerTxt.y = 160;
// Misses display (hearts)
var missesTxt = new Text2('❤❤❤', {
size: 90,
fill: 0xFF3B30
});
missesTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(missesTxt);
missesTxt.y = 260;
// Game state variables
var currentTarget = null;
var misses = 0;
var maxMisses = 3;
var timeLeft = 30.0; // seconds
var targetTimeout = null;
var timerInterval = null;
var targetMinTime = 0.7; // seconds
var targetMaxTime = 1.3; // seconds
var minTargetTime = 0.4; // seconds (minimum as game speeds up)
var speedupEvery = 5; // every 5 points, speed up
var speedupAmount = 0.08; // decrease max/min time by this much
// Helper: spawn a new target at a random position
function spawnNextTarget() {
// If game is over, do not spawn
if (misses >= maxMisses || timeLeft <= 0) return;
// Remove previous target if still present
if (currentTarget && !currentTarget.tapped) {
// Missed!
currentTarget.missed = true;
currentTarget.destroy();
misses += 1;
updateMissesDisplay();
// Flash screen red
LK.effects.flashScreen(0xff3b30, 200);
if (misses >= maxMisses) {
LK.showGameOver();
return;
}
}
// Calculate speedup
var score = LK.getScore();
var speedups = Math.floor(score / speedupEvery);
var minTime = Math.max(targetMinTime - speedups * speedupAmount, minTargetTime);
var maxTime = Math.max(targetMaxTime - speedups * speedupAmount, minTargetTime + 0.2);
// Create new target
var target = new Target();
// Random position, avoid edges (target is 220x220, keep 120px margin)
var margin = 120;
var x = margin + Math.random() * (2048 - 2 * margin);
var y = margin + 200 + Math.random() * (2732 - 2 * margin - 400); // avoid top GUI
target.x = x;
target.y = y;
// Add to game
game.addChild(target);
currentTarget = target;
// Set up timeout for missing the target
if (targetTimeout) LK.clearTimeout(targetTimeout);
var targetTime = minTime + Math.random() * (maxTime - minTime);
targetTimeout = LK.setTimeout(function () {
// If not tapped, count as miss and spawn next
if (!target.tapped && !target.missed) {
target.missed = true;
target.destroy();
misses += 1;
updateMissesDisplay();
LK.effects.flashScreen(0xff3b30, 200);
if (misses >= maxMisses) {
LK.showGameOver();
return;
}
spawnNextTarget();
}
}, targetTime * 1000);
}
// Update misses display (hearts)
function updateMissesDisplay() {
var hearts = '';
for (var i = 0; i < maxMisses - misses; i++) hearts += '❤';
for (var i = 0; i < misses; i++) hearts += '♡';
missesTxt.setText(hearts);
}
// Timer logic
function startTimer() {
if (timerInterval) LK.clearInterval(timerInterval);
timerInterval = LK.setInterval(function () {
timeLeft -= 0.1;
if (timeLeft < 0) timeLeft = 0;
timerTxt.setText(Math.ceil(timeLeft));
if (timeLeft <= 0) {
// End game
if (targetTimeout) LK.clearTimeout(targetTimeout);
LK.showGameOver();
}
}, 100);
}
// Game start/reset logic
function startGame() {
LK.setScore(0);
scoreTxt.setText('0');
misses = 0;
updateMissesDisplay();
timeLeft = 30.0;
timerTxt.setText('30');
if (currentTarget) {
currentTarget.destroy();
currentTarget = null;
}
if (targetTimeout) LK.clearTimeout(targetTimeout);
startTimer();
spawnNextTarget();
}
// --- LOGIN SCREEN OVERLAY ---
var loginOverlay = new Container();
loginOverlay.zIndex = 10000; // ensure on top
// Semi-transparent background
var overlayBg = LK.getAsset('targetBlue', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 20,
scaleY: 20,
x: 2048 / 2,
y: 2732 / 2
});
overlayBg.alpha = 0.7;
loginOverlay.addChild(overlayBg);
// "Login" title
var loginTitle = new Text2('Login', {
size: 180,
fill: 0xFFFFFF
});
loginTitle.anchor.set(0.5, 0.5);
loginTitle.x = 2048 / 2;
loginTitle.y = 700;
loginOverlay.addChild(loginTitle);
// huzkoz a.ş text
var huzkozText = new Text2('made by huzkoz a.ş', {
size: 80,
fill: 0xFFFFFF
});
huzkozText.anchor.set(0.5, 0.5);
huzkozText.x = 2048 / 2;
huzkozText.y = 900;
loginOverlay.addChild(huzkozText);
// "Tap to Start" button
var tapToStart = new Text2('Tap to Start', {
size: 120,
fill: 0xFFF700
});
tapToStart.anchor.set(0.5, 0.5);
tapToStart.x = 2048 / 2;
tapToStart.y = 1200;
loginOverlay.addChild(tapToStart);
// Add overlay to game
game.addChild(loginOverlay);
// Block game start until tap
var loginActive = true;
loginOverlay.down = function (x, y, obj) {
if (!loginActive) return;
loginActive = false;
loginOverlay.destroy();
startGame();
};
// Prevent game from starting automatically
// (do not call startGame() here)
// On game over, reset everything (LK will re-init Game, but for safety)
game.on('gameover', function () {
if (targetTimeout) LK.clearTimeout(targetTimeout);
if (timerInterval) LK.clearInterval(timerInterval);
if (currentTarget) currentTarget.destroy();
});
// On you win (not used in this version, but for future)
game.on('youwin', function () {
if (targetTimeout) LK.clearTimeout(targetTimeout);
if (timerInterval) LK.clearInterval(timerInterval);
if (currentTarget) currentTarget.destroy();
});
// Prevent accidental drag (no drag logic needed)
game.move = function (x, y, obj) {};
// Prevent tap-through on GUI
scoreTxt.down = function () {};
timerTxt.down = function () {};
missesTxt.down = function () {};
// No update loop needed, all logic is event/timer based ===================================================================
--- original.js
+++ change.js
@@ -193,10 +193,61 @@
if (targetTimeout) LK.clearTimeout(targetTimeout);
startTimer();
spawnNextTarget();
}
-// Start the game on load
-startGame();
+// --- LOGIN SCREEN OVERLAY ---
+var loginOverlay = new Container();
+loginOverlay.zIndex = 10000; // ensure on top
+// Semi-transparent background
+var overlayBg = LK.getAsset('targetBlue', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 20,
+ scaleY: 20,
+ x: 2048 / 2,
+ y: 2732 / 2
+});
+overlayBg.alpha = 0.7;
+loginOverlay.addChild(overlayBg);
+// "Login" title
+var loginTitle = new Text2('Login', {
+ size: 180,
+ fill: 0xFFFFFF
+});
+loginTitle.anchor.set(0.5, 0.5);
+loginTitle.x = 2048 / 2;
+loginTitle.y = 700;
+loginOverlay.addChild(loginTitle);
+// huzkoz a.ş text
+var huzkozText = new Text2('made by huzkoz a.ş', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+huzkozText.anchor.set(0.5, 0.5);
+huzkozText.x = 2048 / 2;
+huzkozText.y = 900;
+loginOverlay.addChild(huzkozText);
+// "Tap to Start" button
+var tapToStart = new Text2('Tap to Start', {
+ size: 120,
+ fill: 0xFFF700
+});
+tapToStart.anchor.set(0.5, 0.5);
+tapToStart.x = 2048 / 2;
+tapToStart.y = 1200;
+loginOverlay.addChild(tapToStart);
+// Add overlay to game
+game.addChild(loginOverlay);
+// Block game start until tap
+var loginActive = true;
+loginOverlay.down = function (x, y, obj) {
+ if (!loginActive) return;
+ loginActive = false;
+ loginOverlay.destroy();
+ startGame();
+};
+// Prevent game from starting automatically
+// (do not call startGame() here)
// On game over, reset everything (LK will re-init Game, but for safety)
game.on('gameover', function () {
if (targetTimeout) LK.clearTimeout(targetTimeout);
if (timerInterval) LK.clearInterval(timerInterval);