Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
Breath Runner
Initial prompt
**Breath Runner** - Control your character's movement by breathing into your microphone - gentle breathing for walking, harder breathing for running, and holding your breath to sneak.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); var facekit = LK.import("@upit/facekit.v1"); /**** * Classes ****/ var Collectible = Container.expand(function () { var self = Container.call(this); var collectibleGraphics = self.attachAsset('collectible', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.collect = function () { if (!self.collected) { self.collected = true; LK.getSound('collect').play(); tween(self, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 300, onFinish: function onFinish() { self.visible = false; } }); return true; } return false; }; self.update = function () { if (!self.collected) { self.rotation += 0.02; } }; return self; }); var Goal = Container.expand(function () { var self = Container.call(this); var goalGraphics = self.attachAsset('goal', { anchorX: 0.5, anchorY: 0.5 }); self.reached = false; self.reach = function () { if (!self.reached) { self.reached = true; LK.getSound('win').play(); tween(self, { alpha: 0.5, scaleX: 1.5, scaleY: 1.5 }, { duration: 500, onFinish: function onFinish() { LK.showYouWin(); } }); return true; } return false; }; self.update = function () { // Animate the goal if needed self.rotation += 0.01; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.detectsStealth = false; self.update = function () { // If this is a patrolling obstacle, add movement logic here }; return self; }); var Platform = Container.expand(function () { var self = Container.call(this); var platformGraphics = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5 }); self.width = platformGraphics.width; self.height = platformGraphics.height; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); var stealthMode = self.attachAsset('stealthIndicator', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.vx = 0; self.vy = 0; self.speed = 5; self.jumpStrength = -15; self.gravity = 0.6; self.grounded = false; self.inStealth = false; self.breathLevel = 0; self.dead = false; self.toggleStealth = function (value) { if (self.inStealth !== value) { self.inStealth = value; if (value) { tween(stealthMode, { alpha: 0.5 }, { duration: 300 }); tween(playerGraphics, { alpha: 0.6 }, { duration: 300 }); } else { tween(stealthMode, { alpha: 0 }, { duration: 300 }); tween(playerGraphics, { alpha: 1 }, { duration: 300 }); } } }; self.jump = function () { if (self.grounded && !self.dead) { self.vy = self.jumpStrength; self.grounded = false; LK.getSound('jump').play(); } }; self.die = function () { if (!self.dead) { self.dead = true; LK.getSound('death').play(); LK.effects.flashObject(self, 0xff0000, 1000); LK.setTimeout(function () { LK.showGameOver(); }, 1000); } }; self.update = function () { if (self.dead) { return; } // Apply gravity self.vy += self.gravity; // Apply movement self.x += self.vx; self.y += self.vy; // Check boundaries if (self.y > 2732 - 100) { self.die(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Sky blue background }); /**** * Game Code ****/ // Game variables var player; var platforms = []; var obstacles = []; var collectibles = []; var goal; var camera = { x: 0, y: 0 }; var currentLevel = storage.currentLevel || 1; var score = 0; var breathIndicator; var breathText; var holdingBreath = false; var breathHoldStartTime = 0; var breathAnalysisBuffer = []; var breathBufferSize = 10; // Game world container var world = new Container(); game.addChild(world); // Setup UI function setupUI() { // Score display var scoreText = new Text2('Score: 0', { size: 50, fill: 0xFFFFFF }); scoreText.anchor.set(1, 0); LK.gui.topRight.addChild(scoreText); // Breath indicator background breathIndicator = LK.getAsset('platform', { width: 300, height: 30, anchorX: 0, anchorY: 0.5, tint: 0x444444 }); // Breath level fill var breathLevel = LK.getAsset('platform', { width: 0, height: 20, anchorX: 0, anchorY: 0.5, tint: 0x3498db }); breathIndicator.addChild(breathLevel); // Label for breath indicator breathText = new Text2('Breath', { size: 40, fill: 0xFFFFFF }); breathText.anchor.set(0, 0.5); breathText.x = 10; // Add UI elements to the GUI overlay LK.gui.right.addChild(breathIndicator); breathIndicator.addChild(breathText); // Update functions game.updateScore = function (newScore) { score = newScore; scoreText.setText('Score: ' + score); }; game.updateBreathIndicator = function (level) { breathLevel.width = Math.min(1, level) * 290; if (holdingBreath) { breathText.setText('STEALTH'); } else if (level > 0.6) { breathText.setText('RUNNING'); } else if (level > 0.1) { breathText.setText('WALKING'); } else { breathText.setText('Breath'); } }; } // Create level function createLevel(levelNumber) { // Clear existing level objects clearLevel(); // Create player player = new Player(); player.x = 200; player.y = 2000; world.addChild(player); // Level design based on levelNumber switch (levelNumber) { case 1: createLevelOne(); break; case 2: createLevelTwo(); break; default: createLevelOne(); // Default to level 1 } // Store current level storage.currentLevel = levelNumber; } function clearLevel() { platforms = []; obstacles = []; collectibles = []; // Remove all children from the world container while (world.children.length > 0) { world.removeChildAt(0); } } function createLevelOne() { // Starting platform createPlatform(200, 2200, 400, 50); // Basic platforms createPlatform(700, 2100, 300, 50); createPlatform(1200, 2000, 300, 50); createPlatform(1700, 2100, 300, 50); // Add some obstacles var obstacle1 = new Obstacle(); obstacle1.x = 1200; obstacle1.y = 1900; obstacles.push(obstacle1); world.addChild(obstacle1); // Add collectibles for (var i = 0; i < 3; i++) { var collectible = new Collectible(); collectible.x = 700 + i * 500; collectible.y = 1950; collectibles.push(collectible); world.addChild(collectible); } // Create goal goal = new Goal(); goal.x = 1900; goal.y = 2000; world.addChild(goal); } function createLevelTwo() { // More complex platform arrangement createPlatform(200, 2200, 400, 50); createPlatform(700, 2100, 200, 50); createPlatform(1100, 2000, 200, 50); createPlatform(1500, 2100, 200, 50); createPlatform(1900, 2000, 200, 50); // Add more obstacles var obstacle1 = new Obstacle(); obstacle1.x = 1100; obstacle1.y = 1900; obstacle1.detectsStealth = true; obstacles.push(obstacle1); world.addChild(obstacle1); var obstacle2 = new Obstacle(); obstacle2.x = 1500; obstacle2.y = 2000; obstacles.push(obstacle2); world.addChild(obstacle2); // Add collectibles for (var i = 0; i < 5; i++) { var collectible = new Collectible(); collectible.x = 500 + i * 400; collectible.y = 1900; collectibles.push(collectible); world.addChild(collectible); } // Create goal goal = new Goal(); goal.x = 1900; goal.y = 1900; world.addChild(goal); } function createPlatform(x, y, width, height) { var platform = new Platform(); platform.x = x; platform.y = y; // If we want to resize platforms if (width && width !== 300) { platform.scale.x = width / 300; } if (height && height !== 50) { platform.scale.y = height / 50; } platforms.push(platform); world.addChild(platform); return platform; } // Breath analysis function analyzeBreath() { var currentVolume = facekit.volume; // Add current breath to buffer breathAnalysisBuffer.push(currentVolume); if (breathAnalysisBuffer.length > breathBufferSize) { breathAnalysisBuffer.shift(); } // Calculate average breath level var sum = 0; for (var i = 0; i < breathAnalysisBuffer.length; i++) { sum += breathAnalysisBuffer[i]; } var avgBreath = sum / breathAnalysisBuffer.length; // Detect if holding breath (very low volume for a sustained period) var currentTime = Date.now(); if (currentVolume < 0.1) { if (!holdingBreath) { breathHoldStartTime = currentTime; holdingBreath = true; } else if (currentTime - breathHoldStartTime > 1000) { // Been holding breath for over a second, activate stealth player.toggleStealth(true); } } else { holdingBreath = false; player.toggleStealth(false); } // Update player speed based on breath intensity if (!holdingBreath) { if (avgBreath > 0.6) { // Running player.speed = 10; } else if (avgBreath > 0.1) { // Walking player.speed = 5; } else { // Standing still (very light breathing) player.speed = 0; } } else { // Stealth mode - slower movement player.speed = 1; } return avgBreath; } // Check collisions between player and platforms function checkPlatformCollisions() { player.grounded = false; for (var i = 0; i < platforms.length; i++) { var platform = platforms[i]; if (player.intersects(platform)) { // Calculate the sides of both objects var playerBottom = player.y + 75; var playerTop = player.y - 75; var platformTop = platform.y - platform.height * platform.scale.y / 2; // Check if landing on top of platform if (player.vy > 0 && playerBottom >= platformTop && playerTop < platformTop) { player.y = platformTop - 75; player.vy = 0; player.grounded = true; } // Could add side collision handling here if needed } } } // Check collisions with obstacles function checkObstacleCollisions() { for (var i = 0; i < obstacles.length; i++) { var obstacle = obstacles[i]; if (player.intersects(obstacle)) { // Check if player is in stealth mode and if the obstacle can detect stealth if (player.inStealth && !obstacle.detectsStealth) { // Successfully sneaking past continue; } player.die(); return; } } } // Check collectibles function checkCollectibles() { for (var i = 0; i < collectibles.length; i++) { var collectible = collectibles[i]; if (!collectible.collected && player.intersects(collectible)) { if (collectible.collect()) { game.updateScore(score + 10); } } } } // Check if player reached the goal function checkGoal() { if (goal && player.intersects(goal)) { goal.reach(); } } // Initialize game function initGame() { setupUI(); createLevel(currentLevel); LK.playMusic('bgMusic', { fade: { start: 0, end: 0.3, duration: 1000 } }); } // Main update function game.update = function () { if (!player || player.dead) { return; } // Analyze breathing var breathLevel = analyzeBreath(); game.updateBreathIndicator(breathLevel); // Apply movement based on breath if (player.speed > 0) { player.vx = player.speed; } else { player.vx = 0; } // Update player physics player.update(); // Check collisions checkPlatformCollisions(); checkObstacleCollisions(); checkCollectibles(); checkGoal(); // Update all game objects for (var i = 0; i < obstacles.length; i++) { obstacles[i].update(); } for (var i = 0; i < collectibles.length; i++) { collectibles[i].update(); } if (goal) { goal.update(); } // Update camera to follow player (simple version) if (player.x > 1024) { world.x = Math.min(0, 1024 - player.x); } }; // Initialize the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -409,9 +409,9 @@
player.speed = 0;
}
} else {
// Stealth mode - slower movement
- player.speed = 3;
+ player.speed = 1;
}
return avgBreath;
}
// Check collisions between player and platforms