User prompt
let it be a single background asset
User prompt
add background
User prompt
When you throw a dart at the screen, let it randomly hit anywhere. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Uncaught TypeError: LK.effects.shakeScreen is not a function' in or related to this line: 'LK.effects.shakeScreen(100, 10);' Line Number: 121
User prompt
adjust the animations according to the new face, adjust the mouth, nose, and eyes. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
As we slap, the face should randomly escape to different places on the screen. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Uncaught TypeError: LK.effects.shakeScreen is not a function' in or related to this line: 'LK.effects.shakeScreen(100, 10);' Line Number: 123
Code edit (1 edits merged)
Please save this source code
User prompt
Face Slap Challenge
User prompt
Let's just have a human face without using a camera and slap it.
Initial prompt
Let there be a human face and a game where we slap it, with each slap increasing the score by one.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Dart = Container.expand(function () { var self = Container.call(this); // Dart body var dartBody = self.attachAsset('dart', { anchorX: 0.5, anchorY: 0.5 }); // Dart tip (metal point) var dartTip = self.attachAsset('dartTip', { anchorX: -0.5, anchorY: 0.5, x: 30 }); self.speed = 8; self.targetX = 0; self.targetY = 0; self.isFlying = false; self.throwTo = function (targetX, targetY) { self.targetX = targetX; self.targetY = targetY; self.isFlying = true; // Calculate angle to target var dx = targetX - self.x; var dy = targetY - self.y; self.rotation = Math.atan2(dy, dx); }; self.update = function () { if (!self.isFlying) return; var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.speed) { // Reached target self.x = self.targetX; self.y = self.targetY; self.isFlying = false; // Trigger hit effect if (self.onHit) { self.onHit(); } } else { // Move towards target var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; } }; return self; }); 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 ****/ 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 darts = []; var isDartThrowing = 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('Throw darts at the face!', { 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 || isDartThrowing) return; isDartThrowing = true; // Create new dart var dart = new Dart(); // Start dart from bottom of screen dart.x = 1024; dart.y = 2600; // Add random offset to hit location for realistic dart throwing var randomOffsetX = (Math.random() - 0.5) * 300; // Random spread of 300px var randomOffsetY = (Math.random() - 0.5) * 300; var targetX = x + randomOffsetX; var targetY = y + randomOffsetY; // Keep target within screen bounds targetX = Math.max(100, Math.min(1948, targetX)); targetY = Math.max(200, Math.min(2500, targetY)); dart.throwTo(targetX, targetY); // Set up hit detection dart.onHit = function () { // Check if dart hit the face var facePos = face.toGlobal({ x: 0, y: 0 }); var gamePos = game.toLocal(facePos); var distance = Math.sqrt(Math.pow(dart.x - gamePos.x, 2) + Math.pow(dart.y - gamePos.y, 2)); if (distance <= 150) { // Hit the face! slaps++; LK.setScore(slaps); scoreTxt.setText('Slaps: ' + slaps); face.getSlapped(); } // Remove dart after 2 seconds LK.setTimeout(function () { dart.destroy(); var dartIndex = darts.indexOf(dart); if (dartIndex > -1) { darts.splice(dartIndex, 1); } isDartThrowing = false; }, 2000); }; darts.push(dart); game.addChild(dart); }; 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; } // Update all darts for (var i = 0; i < darts.length; i++) { darts[i].update(); } // 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 }); } };
===================================================================
--- original.js
+++ change.js
@@ -5,8 +5,58 @@
/****
* Classes
****/
+var Dart = Container.expand(function () {
+ var self = Container.call(this);
+ // Dart body
+ var dartBody = self.attachAsset('dart', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Dart tip (metal point)
+ var dartTip = self.attachAsset('dartTip', {
+ anchorX: -0.5,
+ anchorY: 0.5,
+ x: 30
+ });
+ self.speed = 8;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.isFlying = false;
+ self.throwTo = function (targetX, targetY) {
+ self.targetX = targetX;
+ self.targetY = targetY;
+ self.isFlying = true;
+ // Calculate angle to target
+ var dx = targetX - self.x;
+ var dy = targetY - self.y;
+ self.rotation = Math.atan2(dy, dx);
+ };
+ self.update = function () {
+ if (!self.isFlying) return;
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < self.speed) {
+ // Reached target
+ self.x = self.targetX;
+ self.y = self.targetY;
+ self.isFlying = false;
+ // Trigger hit effect
+ if (self.onHit) {
+ self.onHit();
+ }
+ } else {
+ // Move towards target
+ var moveX = dx / distance * self.speed;
+ var moveY = dy / distance * self.speed;
+ self.x += moveX;
+ self.y += moveY;
+ }
+ };
+ return self;
+});
var Face = Container.expand(function () {
var self = Container.call(this);
// Face base
var faceGraphics = self.attachAsset('face', {
@@ -155,8 +205,10 @@
var slaps = 0;
var gameTime = 0;
var timeLimit = 30000; // 30 seconds
var gameEnded = false;
+var darts = [];
+var isDartThrowing = false;
var timerTxt = new Text2('Time: 30', {
size: 50,
fill: 0x000000
});
@@ -164,30 +216,60 @@
timerTxt.x = -20;
timerTxt.y = 20;
LK.gui.topRight.addChild(timerTxt);
// Instructions
-var instructionTxt = new Text2('Tap the face to slap it!', {
+var instructionTxt = new Text2('Throw darts at the face!', {
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);
- }
+ if (gameEnded || isDartThrowing) return;
+ isDartThrowing = true;
+ // Create new dart
+ var dart = new Dart();
+ // Start dart from bottom of screen
+ dart.x = 1024;
+ dart.y = 2600;
+ // Add random offset to hit location for realistic dart throwing
+ var randomOffsetX = (Math.random() - 0.5) * 300; // Random spread of 300px
+ var randomOffsetY = (Math.random() - 0.5) * 300;
+ var targetX = x + randomOffsetX;
+ var targetY = y + randomOffsetY;
+ // Keep target within screen bounds
+ targetX = Math.max(100, Math.min(1948, targetX));
+ targetY = Math.max(200, Math.min(2500, targetY));
+ dart.throwTo(targetX, targetY);
+ // Set up hit detection
+ dart.onHit = function () {
+ // Check if dart hit the face
+ var facePos = face.toGlobal({
+ x: 0,
+ y: 0
+ });
+ var gamePos = game.toLocal(facePos);
+ var distance = Math.sqrt(Math.pow(dart.x - gamePos.x, 2) + Math.pow(dart.y - gamePos.y, 2));
+ if (distance <= 150) {
+ // Hit the face!
+ slaps++;
+ LK.setScore(slaps);
+ scoreTxt.setText('Slaps: ' + slaps);
+ face.getSlapped();
+ }
+ // Remove dart after 2 seconds
+ LK.setTimeout(function () {
+ dart.destroy();
+ var dartIndex = darts.indexOf(dart);
+ if (dartIndex > -1) {
+ darts.splice(dartIndex, 1);
+ }
+ isDartThrowing = false;
+ }, 2000);
+ };
+ darts.push(dart);
+ game.addChild(dart);
};
game.update = function () {
if (gameEnded) return;
gameTime += 16.67; // Approximate ms per frame at 60fps
@@ -209,8 +291,12 @@
LK.showGameOver();
}
return;
}
+ // Update all darts
+ for (var i = 0; i < darts.length; i++) {
+ darts[i].update();
+ }
// 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;