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 = 3; } 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
@@ -1,6 +1,518 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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 = 3;
+ }
+ 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();
\ No newline at end of file