/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Face = Container.expand(function () { var self = Container.call(this); // Face base var faceGraphics = self.attachAsset('face', { anchorX: 0.5, anchorY: 0.5 }); // Eyes var leftEye = self.attachAsset('eye', { anchorX: 0.5, anchorY: 0.5, x: -50, y: -40 }); var rightEye = self.attachAsset('eye', { anchorX: 0.5, anchorY: 0.5, x: 50, y: -40 }); // Mouth var mouth = self.attachAsset('mouth', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 40 }); // Red overlay for slap effect (initially invisible) var redOverlay = self.attachAsset('redOverlay', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.isBeingSlapped = false; self.lastSlapTime = 0; self.getSlapped = function () { if (self.isBeingSlapped) return; self.isBeingSlapped = true; self.lastSlapTime = Date.now(); // Visual feedback - red overlay redOverlay.alpha = 0.6; tween(redOverlay, { alpha: 0 }, { duration: 300 }); // Face reaction - bounce and scale tween(self, { scaleX: 1.2, scaleY: 0.9 }, { duration: 100, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } }); // Eyes reaction - make them "X" shaped by scaling tween(leftEye, { scaleY: 0.2 }, { duration: 150, onFinish: function onFinish() { tween(leftEye, { scaleY: 1 }, { duration: 200 }); } }); tween(rightEye, { scaleY: 0.2 }, { duration: 150, onFinish: function onFinish() { tween(rightEye, { scaleY: 1 }, { duration: 200 }); } }); // Mouth reaction - open wide tween(mouth, { scaleX: 1.5, scaleY: 2 }, { duration: 150, onFinish: function onFinish() { tween(mouth, { scaleX: 1, scaleY: 1 }, { duration: 300 }); } }); // Screen shake effect (removed - not supported) // Play sounds var sounds = ['slap', 'ouch']; var randomSound = sounds[Math.floor(Math.random() * sounds.length)]; LK.getSound(randomSound).play(); // Random movement after slap var randomX = (Math.random() - 0.5) * 100; var randomY = (Math.random() - 0.5) * 100; tween(self, { x: 1024 + randomX, y: 1366 + randomY }, { duration: 500, easing: tween.elasticOut }); // Reset slap state LK.setTimeout(function () { self.isBeingSlapped = false; }, 300); }; self.down = function (x, y, obj) { self.getSlapped(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Create single background var background = game.addChild(LK.getAsset('background', { x: 0, y: 0 })); var face = game.addChild(new Face()); face.x = 1024; face.y = 1366; var scoreTxt = new Text2('Slaps: 0', { size: 60, fill: 0x000000 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var slaps = 0; var gameTime = 0; var timeLimit = 30000; // 30 seconds var gameEnded = false; var timerTxt = new Text2('Time: 30', { size: 50, fill: 0x000000 }); timerTxt.anchor.set(1, 0); timerTxt.x = -20; timerTxt.y = 20; LK.gui.topRight.addChild(timerTxt); // Instructions var instructionTxt = new Text2('Tap the face to slap it!', { size: 40, fill: 0x333333 }); instructionTxt.anchor.set(0.5, 0); instructionTxt.y = 100; LK.gui.top.addChild(instructionTxt); game.down = function (x, y, obj) { if (gameEnded) return; // Check if clicking on the face var facePos = face.toGlobal({ x: 0, y: 0 }); var gamePos = game.toLocal(facePos); var distance = Math.sqrt(Math.pow(x - gamePos.x, 2) + Math.pow(y - gamePos.y, 2)); if (distance <= 150) { // Face radius slaps++; LK.setScore(slaps); scoreTxt.setText('Slaps: ' + slaps); } }; game.update = function () { if (gameEnded) return; gameTime += 16.67; // Approximate ms per frame at 60fps var remainingTime = Math.max(0, Math.ceil((timeLimit - gameTime) / 1000)); timerTxt.setText('Time: ' + remainingTime); // Check for game end if (gameTime >= timeLimit) { gameEnded = true; // Final score message var finalMessage = 'Great job! You slapped ' + slaps + ' times!'; if (slaps >= 50) { finalMessage = 'Amazing! ' + slaps + ' slaps! You are a slapping master!'; LK.showYouWin(); } else if (slaps >= 30) { finalMessage = 'Good work! ' + slaps + ' slaps! Not bad at all!'; LK.showGameOver(); } else { finalMessage = 'You got ' + slaps + ' slaps. Try harder next time!'; LK.showGameOver(); } return; } // Make face slightly move around randomly every few seconds if (LK.ticks % 180 === 0) { // Every 3 seconds var randomX = 1024 + (Math.random() - 0.5) * 200; var randomY = 1366 + (Math.random() - 0.5) * 200; // Keep face within bounds randomX = Math.max(200, Math.min(1848, randomX)); randomY = Math.max(400, Math.min(2300, randomY)); tween(face, { x: randomX, y: randomY }, { duration: 1000, easing: tween.easeInOut }); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Face = Container.expand(function () {
var self = Container.call(this);
// Face base
var faceGraphics = self.attachAsset('face', {
anchorX: 0.5,
anchorY: 0.5
});
// Eyes
var leftEye = self.attachAsset('eye', {
anchorX: 0.5,
anchorY: 0.5,
x: -50,
y: -40
});
var rightEye = self.attachAsset('eye', {
anchorX: 0.5,
anchorY: 0.5,
x: 50,
y: -40
});
// Mouth
var mouth = self.attachAsset('mouth', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 40
});
// Red overlay for slap effect (initially invisible)
var redOverlay = self.attachAsset('redOverlay', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.isBeingSlapped = false;
self.lastSlapTime = 0;
self.getSlapped = function () {
if (self.isBeingSlapped) return;
self.isBeingSlapped = true;
self.lastSlapTime = Date.now();
// Visual feedback - red overlay
redOverlay.alpha = 0.6;
tween(redOverlay, {
alpha: 0
}, {
duration: 300
});
// Face reaction - bounce and scale
tween(self, {
scaleX: 1.2,
scaleY: 0.9
}, {
duration: 100,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
});
// Eyes reaction - make them "X" shaped by scaling
tween(leftEye, {
scaleY: 0.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(leftEye, {
scaleY: 1
}, {
duration: 200
});
}
});
tween(rightEye, {
scaleY: 0.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(rightEye, {
scaleY: 1
}, {
duration: 200
});
}
});
// Mouth reaction - open wide
tween(mouth, {
scaleX: 1.5,
scaleY: 2
}, {
duration: 150,
onFinish: function onFinish() {
tween(mouth, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
}
});
// Screen shake effect (removed - not supported)
// Play sounds
var sounds = ['slap', 'ouch'];
var randomSound = sounds[Math.floor(Math.random() * sounds.length)];
LK.getSound(randomSound).play();
// Random movement after slap
var randomX = (Math.random() - 0.5) * 100;
var randomY = (Math.random() - 0.5) * 100;
tween(self, {
x: 1024 + randomX,
y: 1366 + randomY
}, {
duration: 500,
easing: tween.elasticOut
});
// Reset slap state
LK.setTimeout(function () {
self.isBeingSlapped = false;
}, 300);
};
self.down = function (x, y, obj) {
self.getSlapped();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Create single background
var background = game.addChild(LK.getAsset('background', {
x: 0,
y: 0
}));
var face = game.addChild(new Face());
face.x = 1024;
face.y = 1366;
var scoreTxt = new Text2('Slaps: 0', {
size: 60,
fill: 0x000000
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var slaps = 0;
var gameTime = 0;
var timeLimit = 30000; // 30 seconds
var gameEnded = false;
var timerTxt = new Text2('Time: 30', {
size: 50,
fill: 0x000000
});
timerTxt.anchor.set(1, 0);
timerTxt.x = -20;
timerTxt.y = 20;
LK.gui.topRight.addChild(timerTxt);
// Instructions
var instructionTxt = new Text2('Tap the face to slap it!', {
size: 40,
fill: 0x333333
});
instructionTxt.anchor.set(0.5, 0);
instructionTxt.y = 100;
LK.gui.top.addChild(instructionTxt);
game.down = function (x, y, obj) {
if (gameEnded) return;
// Check if clicking on the face
var facePos = face.toGlobal({
x: 0,
y: 0
});
var gamePos = game.toLocal(facePos);
var distance = Math.sqrt(Math.pow(x - gamePos.x, 2) + Math.pow(y - gamePos.y, 2));
if (distance <= 150) {
// Face radius
slaps++;
LK.setScore(slaps);
scoreTxt.setText('Slaps: ' + slaps);
}
};
game.update = function () {
if (gameEnded) return;
gameTime += 16.67; // Approximate ms per frame at 60fps
var remainingTime = Math.max(0, Math.ceil((timeLimit - gameTime) / 1000));
timerTxt.setText('Time: ' + remainingTime);
// Check for game end
if (gameTime >= timeLimit) {
gameEnded = true;
// Final score message
var finalMessage = 'Great job! You slapped ' + slaps + ' times!';
if (slaps >= 50) {
finalMessage = 'Amazing! ' + slaps + ' slaps! You are a slapping master!';
LK.showYouWin();
} else if (slaps >= 30) {
finalMessage = 'Good work! ' + slaps + ' slaps! Not bad at all!';
LK.showGameOver();
} else {
finalMessage = 'You got ' + slaps + ' slaps. Try harder next time!';
LK.showGameOver();
}
return;
}
// Make face slightly move around randomly every few seconds
if (LK.ticks % 180 === 0) {
// Every 3 seconds
var randomX = 1024 + (Math.random() - 0.5) * 200;
var randomY = 1366 + (Math.random() - 0.5) * 200;
// Keep face within bounds
randomX = Math.max(200, Math.min(1848, randomX));
randomY = Math.max(400, Math.min(2300, randomY));
tween(face, {
x: randomX,
y: randomY
}, {
duration: 1000,
easing: tween.easeInOut
});
}
};