User prompt
Make the mouth green instead of red when the mouth is open
User prompt
Lower the disclaimer
User prompt
Make the disclaimer bigger
User prompt
Make the disclaimer red
User prompt
Make the disclaimer lowered a bit
User prompt
Make a disclaimer at the top that says: make sure you are in a open and well lighted environment
User prompt
Make the game more cutesy
User prompt
Make the monsters more accessible to the player
Code edit (1 edits merged)
Please save this source code
User prompt
MunchMonsters
Initial prompt
Make a face kit game where it detects if you mouth is open. If it is, it is in eating mode. If it is not, it is in neutral. There are monsters that you have to eat to win.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highscore: 0, level: 1 }); var facekit = LK.import("@upit/facekit.v1"); /**** * Classes ****/ var Monster = Container.expand(function () { var self = Container.call(this); // Create monster visuals var monsterGraphics = self.attachAsset('monster', { anchorX: 0.5, anchorY: 0.5 }); // Monster properties self.speed = 2 + Math.random() * 3; self.targetX = 0; self.targetY = 0; self.isEaten = false; self.directionChangeTimer = 0; self.directionChangeFrequency = 30; // frames self.value = 10; // score value // Set random color tint for variety var colors = [0xffc0cb, 0xffb6c1, 0xffd700, 0xadd8e6, 0x98fb98]; monsterGraphics.tint = colors[Math.floor(Math.random() * colors.length)]; self.update = function () { if (self.isEaten) { return; } self.directionChangeTimer++; // Update targets periodically for more natural movement if (self.directionChangeTimer >= self.directionChangeFrequency) { self.directionChangeTimer = 0; // When mouth is closed, monsters flee from player if (!facekit.mouthOpen) { // Run away from player var playerPos = { x: facekit.mouthCenter.x, y: facekit.mouthCenter.y }; var angle = Math.atan2(self.y - playerPos.y, self.x - playerPos.x); self.targetX = self.x + Math.cos(angle) * 300; self.targetY = self.y + Math.sin(angle) * 300; // Keep within bounds if (self.targetX < 100) { self.targetX = 100; } if (self.targetX > 2048 - 100) { self.targetX = 2048 - 100; } if (self.targetY < 100) { self.targetY = 100; } if (self.targetY > 2732 - 100) { self.targetY = 2732 - 100; } } else { // Random movement when mouth is open self.targetX = 100 + Math.random() * (2048 - 200); self.targetY = 100 + Math.random() * (2732 - 200); } } // Move toward target position var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; self.eat = function () { if (self.isEaten) { return; } self.isEaten = true; // Tween to player's mouth with cute animation tween(self, { x: facekit.mouthCenter.x, y: facekit.mouthCenter.y, scaleX: 0.1, scaleY: 0.1, alpha: 0, rotation: Math.PI * 2 // Add a spin for cuteness }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { self.destroy(); } }); return self.value; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Game variables var monsters = []; var score = 0; var highscore = storage.highscore || 0; var level = storage.level || 1; var monstersToSpawn = 5; var monstersPerLevel = 5; var monsterSpawnTimer = 0; var monsterSpawnDelay = 60; // frames var mouthPosition = { x: 0, y: 0 }; var isEatingMode = false; var lastMouthState = false; var gameActive = true; // Play cute background music LK.playMusic('cuteGameMusic', { fade: { start: 0, end: 0.5, duration: 1000 } }); // Create player visualization (follows mouth) var player = game.addChild(LK.getAsset('player', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7 })); // UI elements var scoreText = new Text2('Score: 0', { size: 50, fill: 0xFFFFFF }); var scoreBackground = LK.getAsset('scoreBackground', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 }); scoreText.anchor.set(0.5, 0.5); LK.gui.topRight.addChild(scoreBackground); LK.gui.topRight.addChild(scoreText); var levelText = new Text2('Level: 1', { size: 50, fill: 0xFFFFFF }); var levelBackground = LK.getAsset('levelBackground', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 }); levelText.anchor.set(0.5, 0.5); LK.gui.topLeft.addChild(levelBackground); LK.gui.topLeft.addChild(levelText); // Position UI elements scoreBackground.x = -250; scoreBackground.y = 50; scoreText.x = -250; scoreText.y = 50; levelBackground.x = 250; levelBackground.y = 50; levelText.x = 250; levelText.y = 50; // Disclaimer text var disclaimerText = new Text2("Make sure you are in an open and well-lighted environment", { size: 60, fill: 0xFF0000 }); disclaimerText.anchor.set(0.5, 0.5); disclaimerText.y = 150; // Lower the disclaimer text position further LK.gui.top.addChild(disclaimerText); // Instructions text var instructionsText = new Text2("Open your mouth to eat monsters!\nClose it to make them run away!", { size: 60, fill: 0xFFFFFF }); instructionsText.anchor.set(0.5, 0.5); LK.gui.center.addChild(instructionsText); // Hide instructions after 5 seconds LK.setTimeout(function () { tween(instructionsText, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { instructionsText.destroy(); } }); }, 5000); // Helper function to spawn a monster function spawnMonster() { var monster = new Monster(); // Random position along the edge of the screen var side = Math.floor(Math.random() * 4); switch (side) { case 0: // top monster.x = Math.random() * 2048; monster.y = 0; break; case 1: // right monster.x = 2048; monster.y = Math.random() * 2732; break; case 2: // bottom monster.x = Math.random() * 2048; monster.y = 2732; break; case 3: // left monster.x = 0; monster.y = Math.random() * 2732; break; } // Speed up monsters based on level monster.speed += (level - 1) * 0.5; // Increase score value based on level monster.value = 10 * level; monsters.push(monster); game.addChild(monster); return monster; } // Helper function to start the next level function startNextLevel() { level++; levelText.setText("Level: " + level); monstersToSpawn = level * monstersPerLevel; // Store level progress storage.level = level; // Play level up sound LK.getSound('levelUp').play(); // Show level up message var levelUpText = new Text2("Level " + level + "!", { size: 120, fill: 0xFFFF00 }); levelUpText.anchor.set(0.5, 0.5); LK.gui.center.addChild(levelUpText); // Animate level up text tween(levelUpText, { scaleX: 1.5, scaleY: 1.5 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(levelUpText, { scaleX: 1, scaleY: 1, alpha: 0 }, { duration: 500, easing: tween.easeIn, onFinish: function onFinish() { levelUpText.destroy(); } }); } }); } // Game update function game.update = function () { // Update mouth position from facekit mouthPosition.x = facekit.mouthCenter.x; mouthPosition.y = facekit.mouthCenter.y; isEatingMode = facekit.mouthOpen; // Update player position to follow mouth player.x = mouthPosition.x; player.y = mouthPosition.y; // Visual feedback for mouth state if (isEatingMode) { // Mouth open - eating mode tween.stop(player, { scaleX: true, scaleY: true }); player.scaleX = 1.5; player.scaleY = 1.5; player.tint = 0x00ff00; } else { // Mouth closed - neutral mode tween.stop(player, { scaleX: true, scaleY: true }); player.scaleX = 1; player.scaleY = 1; player.tint = 0x4287f5; } // Track mouth state changes if (isEatingMode !== lastMouthState) { lastMouthState = isEatingMode; } // Spawn monsters if (monstersToSpawn > 0 && monsters.length < 10) { monsterSpawnTimer++; if (monsterSpawnTimer >= monsterSpawnDelay) { monsterSpawnTimer = 0; spawnMonster(); monstersToSpawn--; } } // Check if level is complete if (monstersToSpawn === 0 && monsters.length === 0) { startNextLevel(); } // Update all monsters for (var i = monsters.length - 1; i >= 0; i--) { var monster = monsters[i]; // Detect if monster is eaten if (isEatingMode && !monster.isEaten) { var dx = monster.x - mouthPosition.x; var dy = monster.y - mouthPosition.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < player.width / 2) { // Monster is eaten score += monster.eat(); scoreText.setText("Score: " + score); // Update highscore if needed if (score > highscore) { highscore = score; storage.highscore = highscore; } // Play cute munch sound LK.getSound('cuteMunch').play(); // Remove from array monsters.splice(i, 1); } } } }; // Game click/touch handlers (for testing on desktop) game.down = function (x, y, obj) { // Not needed for face tracking game, but could be used for additional controls }; game.up = function (x, y, obj) { // Not needed for face tracking game }; game.move = function (x, y, obj) { // Not needed for face tracking game };
===================================================================
--- original.js
+++ change.js
@@ -290,9 +290,9 @@
scaleY: true
});
player.scaleX = 1.5;
player.scaleY = 1.5;
- player.tint = 0xff0000;
+ player.tint = 0x00ff00;
} else {
// Mouth closed - neutral mode
tween.stop(player, {
scaleX: true,