User prompt
make it to roll when i jump
User prompt
make it no to roll while moveing
User prompt
make it nomal
User prompt
make it a bit far
User prompt
make spawn point soo far
User prompt
make spwan point a bit far
Code edit (1 edits merged)
Please save this source code
User prompt
Geometry Dash 5: Level Select
Initial prompt
gethometry dash 5 : Level select
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { completedLevels: [], currentLevel: 0, attempts: 0, deaths: 0 }); /**** * Classes ****/ var Level = Container.expand(function () { var self = Container.call(this); self.obstacles = []; self.platforms = []; self.length = 0; self.id = 0; self.startX = 300; self.music = 'level1Music'; self.difficulty = 1; self.name = "Level 1"; self.init = function (levelData) { self.obstacles = []; self.platforms = []; self.id = levelData.id; self.length = levelData.length || 10000; self.music = levelData.music || 'level1Music'; self.difficulty = levelData.difficulty || 1; self.name = levelData.name || "Level " + self.id; // Create obstacles based on level data if (levelData.obstacles) { levelData.obstacles.forEach(function (obs) { var obstacle = new Obstacle(); obstacle.init(obs.type, obs.x, obs.y, obs.width, obs.height); self.addChild(obstacle); self.obstacles.push(obstacle); }); } // Create platforms based on level data if (levelData.platforms) { levelData.platforms.forEach(function (plat) { var platform = new Obstacle(); platform.init('platform', plat.x, plat.y, plat.width, plat.height); self.addChild(platform); self.platforms.push(platform); }); } // Always have a ground platform var ground = new Obstacle(); ground.init('ground', self.length / 2, 2700, self.length, 50); self.addChild(ground); self.platforms.push(ground); // Add decorative grid lines for (var i = 0; i < 10; i++) { var gridLine = self.attachAsset('gridLine', { anchorX: 0, anchorY: 0.5, y: 500 + i * 250, x: 0, alpha: 0.3 }); gridLine.width = self.length; } // Create finish line var finishLine = new Obstacle(); finishLine.init('platform', self.length - 100, 2650, 20, 100); finishLine.type = 'finish'; var finishGraphics = finishLine.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5, tint: 0x2ecc71 }); self.addChild(finishLine); self.obstacles.push(finishLine); }; self.checkCollisions = function (player) { // Check platform collisions player.isGrounded = false; for (var i = 0; i < self.platforms.length; i++) { var platform = self.platforms[i]; if (player.intersects(platform)) { // Only collide with top of platform if (player.y - player.height / 2 < platform.y - platform.height / 2) { player.y = platform.y - platform.height / 2 - player.height / 2; player.vy = 0; player.isGrounded = true; } } } // Check obstacle collisions for (var j = 0; j < self.obstacles.length; j++) { var obstacle = self.obstacles[j]; if (player.intersects(obstacle)) { if (obstacle.type === 'finish') { return 'finish'; } else if (obstacle.type === 'spike') { player.die(); return 'death'; } } } return null; }; return self; }); var LevelButton = Container.expand(function () { var self = Container.call(this); var box = self.attachAsset('levelBox', { anchorX: 0.5, anchorY: 0.5 }); var levelText = new Text2("1", { size: 80, fill: 0xFFFFFF }); levelText.anchor.set(0.5); var nameText = new Text2("Level 1", { size: 40, fill: 0xFFFFFF }); nameText.anchor.set(0.5); nameText.y = 50; self.addChild(levelText); self.addChild(nameText); self.level = 1; self.unlocked = true; self.init = function (level, name, unlocked) { self.level = level; self.unlocked = unlocked === undefined ? true : unlocked; levelText.setText(level); nameText.setText(name || "Level " + level); // Visual state if (!self.unlocked) { box.tint = 0x7f8c8d; levelText.alpha = 0.5; nameText.alpha = 0.5; } else { box.tint = 0x9b59b6; levelText.alpha = 1; nameText.alpha = 1; } // If completed, show a checkmark or different color if (storage.completedLevels.includes(level)) { box.tint = 0x2ecc71; } }; self.down = function () { if (self.unlocked) { tween(box, { scale: 0.9 }, { duration: 100 }); } }; self.up = function () { if (self.unlocked) { tween(box, { scale: 1 }, { duration: 100 }); LK.getSound('levelSelect').play(); startLevel(self.level); } }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); self.type = 'spike'; // Default type var graphics; self.init = function (type, x, y, width, height) { self.type = type || 'spike'; // Remove existing graphics if any if (graphics) { self.removeChild(graphics); } graphics = self.attachAsset(self.type, { anchorX: 0.5, anchorY: 0.5 }); if (width) { graphics.width = width; } if (height) { graphics.height = height; } self.x = x; self.y = y; }; return self; }); var Particle = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); self.init = function (x, y, color) { self.x = x; self.y = y; self.vx = Math.random() * 10 - 5; self.vy = Math.random() * -15 - 5; self.gravity = 0.5; self.life = Math.random() * 30 + 30; self.maxLife = self.life; graphics.tint = color || 0x3498db; }; self.update = function () { self.x += self.vx; self.vy += self.gravity; self.y += self.vy; self.life--; // Fade out as life decreases graphics.alpha = self.life / self.maxLife * 0.8; graphics.scale.set(self.life / self.maxLife); if (self.life <= 0) { self.destroy(); return true; // Signal to remove from array } return false; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.speed = 8; self.gravity = 0.8; self.jumpForce = -20; self.isGrounded = false; self.isDead = false; self.autoMove = true; self.init = function () { self.vx = self.speed; self.vy = 0; self.isDead = false; graphics.rotation = 0; graphics.alpha = 1; }; self.update = function () { if (self.isDead) { return; } // Apply gravity self.vy += self.gravity; // Update position if (self.autoMove) { self.x += self.vx; } self.y += self.vy; // Rotate based on movement (for visual effect) graphics.rotation += 0.1; // Check if fallen off screen if (self.y > 2732) { self.die(); } }; self.jump = function () { if (self.isGrounded && !self.isDead) { self.vy = self.jumpForce; self.isGrounded = false; LK.getSound('jump').play(); return true; } return false; }; self.die = function () { if (!self.isDead) { self.isDead = true; LK.getSound('death').play(); createDeathParticles(self.x, self.y); tween(graphics, { alpha: 0 }, { duration: 300 }); storage.deaths++; storage.attempts++; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ // Game state var gameState = "menu"; // menu, playing, gameOver var player; var currentLevel; var camera = { x: 0, y: 0 }; var particles = []; var levels = []; var levelButtons = []; var lastTick = 0; // UI Elements var scoreText = new Text2("SCORE: 0", { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 150; scoreText.y = 50; LK.gui.top.addChild(scoreText); var levelNameText = new Text2("LEVEL 1", { size: 60, fill: 0xFFFFFF }); levelNameText.anchor.set(0.5, 0); levelNameText.y = 50; LK.gui.top.addChild(levelNameText); var deathCountText = new Text2("DEATHS: 0", { size: 40, fill: 0xFFFFFF }); deathCountText.anchor.set(1, 0); deathCountText.x = -150; deathCountText.y = 50; LK.gui.topRight.addChild(deathCountText); var messageText = new Text2("TAP TO JUMP", { size: 80, fill: 0xFFFFFF }); messageText.anchor.set(0.5, 0.5); LK.gui.center.addChild(messageText); messageText.alpha = 0; // Define all levels function defineLevels() { levels = [{ id: 1, name: "Simple Run", difficulty: 1, length: 8000, music: "level1Music", obstacles: [{ type: "spike", x: 2000, y: 2650 }, { type: "spike", x: 2300, y: 2650 }, { type: "spike", x: 3000, y: 2650 }, { type: "spike", x: 3300, y: 2650 }, { type: "spike", x: 3600, y: 2650 }, { type: "spike", x: 4500, y: 2650 }, { type: "spike", x: 4800, y: 2650 }, { type: "spike", x: 5500, y: 2650 }, { type: "spike", x: 6000, y: 2650 }, { type: "spike", x: 6300, y: 2650 }], platforms: [{ x: 2700, y: 2500, width: 300, height: 30 }, { x: 3800, y: 2400, width: 300, height: 30 }, { x: 4200, y: 2300, width: 300, height: 30 }, { x: 5200, y: 2500, width: 500, height: 30 }, { x: 6500, y: 2400, width: 300, height: 30 }] }, { id: 2, name: "Spike Madness", difficulty: 2, length: 10000, music: "level2Music", obstacles: [{ type: "spike", x: 1500, y: 2650 }, { type: "spike", x: 1600, y: 2650 }, { type: "spike", x: 2200, y: 2650 }, { type: "spike", x: 2500, y: 2650 }, { type: "spike", x: 2800, y: 2650 }, { type: "spike", x: 3100, y: 2650 }, { type: "spike", x: 3400, y: 2350 }, // On platform { type: "spike", x: 3700, y: 2650 }, { type: "spike", x: 4000, y: 2650 }, { type: "spike", x: 4300, y: 2650 }, { type: "spike", x: 4600, y: 2250 }, // On platform { type: "spike", x: 4900, y: 2250 }, // On platform { type: "spike", x: 5200, y: 2650 }, { type: "spike", x: 5500, y: 2650 }, { type: "spike", x: 5800, y: 2650 }, { type: "spike", x: 6100, y: 2650 }, { type: "spike", x: 6400, y: 2650 }, { type: "spike", x: 6700, y: 2400 }, // On platform { type: "spike", x: 7000, y: 2400 }, // On platform { type: "spike", x: 7300, y: 2400 }, // On platform { type: "spike", x: 7900, y: 2650 }, { type: "spike", x: 8200, y: 2650 }, { type: "spike", x: 8500, y: 2650 }], platforms: [{ x: 1800, y: 2500, width: 300, height: 30 }, { x: 3400, y: 2400, width: 500, height: 30 }, { x: 4600, y: 2300, width: 700, height: 30 }, { x: 7000, y: 2450, width: 1200, height: 30 }, { x: 8700, y: 2500, width: 400, height: 30 }] }, { id: 3, name: "The Final Dash", difficulty: 3, length: 12000, music: "level3Music", obstacles: [{ type: "spike", x: 1200, y: 2650 }, { type: "spike", x: 1500, y: 2650 }, { type: "spike", x: 1800, y: 2500 }, // On platform { type: "spike", x: 2100, y: 2500 }, // On platform { type: "spike", x: 2400, y: 2650 }, { type: "spike", x: 2700, y: 2650 }, { type: "spike", x: 3000, y: 2400 }, // On platform { type: "spike", x: 3300, y: 2400 }, // On platform { type: "spike", x: 3600, y: 2400 }, // On platform { type: "spike", x: 3900, y: 2650 }, { type: "spike", x: 4200, y: 2650 }, { type: "spike", x: 4500, y: 2650 }, { type: "spike", x: 4800, y: 2300 }, // On platform { type: "spike", x: 5100, y: 2300 }, // On platform { type: "spike", x: 5400, y: 2300 }, // On platform { type: "spike", x: 5700, y: 2650 }, { type: "spike", x: 6000, y: 2650 }, { type: "spike", x: 6300, y: 2650 }, { type: "spike", x: 6600, y: 2650 }, { type: "spike", x: 6900, y: 2650 }, { type: "spike", x: 7200, y: 2200 }, // On platform { type: "spike", x: 7500, y: 2200 }, // On platform { type: "spike", x: 7800, y: 2200 }, // On platform { type: "spike", x: 8100, y: 2650 }, { type: "spike", x: 8400, y: 2650 }, { type: "spike", x: 8700, y: 2650 }, { type: "spike", x: 9000, y: 2100 }, // On platform { type: "spike", x: 9300, y: 2100 }, // On platform { type: "spike", x: 9600, y: 2100 }, // On platform { type: "spike", x: 9900, y: 2650 }, { type: "spike", x: 10200, y: 2650 }, { type: "spike", x: 10500, y: 2650 }], platforms: [{ x: 1800, y: 2550, width: 600, height: 30 }, { x: 3300, y: 2450, width: 900, height: 30 }, { x: 5100, y: 2350, width: 900, height: 30 }, { x: 7500, y: 2250, width: 900, height: 30 }, { x: 9300, y: 2150, width: 900, height: 30 }, { x: 11000, y: 2500, width: 400, height: 30 }] }]; } // Initialize level select menu function initLevelSelect() { gameState = "menu"; clearLevel(); // Create background var background = game.attachAsset('background', { anchorX: 0, anchorY: 0 }); // Play menu music LK.playMusic('menuMusic'); // Show title messageText.setText("GEOMETRY DASH 5: LEVEL SELECT"); tween(messageText, { alpha: 1 }, { duration: 500 }); // Calculate how many levels are unlocked var unlockedLevels = storage.completedLevels.length + 1; if (unlockedLevels > levels.length) { unlockedLevels = levels.length; } // Create level buttons levelButtons = []; for (var i = 0; i < levels.length; i++) { var level = levels[i]; var button = new LevelButton(); button.init(level.id, level.name, i < unlockedLevels); // Position buttons in a grid, 3 per row var row = Math.floor(i / 3); var col = i % 3; button.x = 512 + col * 512; button.y = 800 + row * 500; game.addChild(button); levelButtons.push(button); } // Show stats scoreText.setText("COMPLETED: " + storage.completedLevels.length + "/" + levels.length); deathCountText.setText("DEATHS: " + storage.deaths); } // Start a specific level function startLevel(levelId) { gameState = "playing"; clearLevel(); // Find level data var levelData = null; for (var i = 0; i < levels.length; i++) { if (levels[i].id === levelId) { levelData = levels[i]; break; } } if (!levelData) { console.log("Level not found: " + levelId); return; } // Store the current level storage.currentLevel = levelId; // Create level currentLevel = new Level(); currentLevel.init(levelData); game.addChild(currentLevel); // Create player player = new Player(); player.x = 300; player.y = 2500; player.init(); game.addChild(player); // Update UI levelNameText.setText(levelData.name); deathCountText.setText("DEATHS: " + storage.deaths); // Show message messageText.setText("TAP TO JUMP"); tween(messageText, { alpha: 1 }, { duration: 500, onFinish: function onFinish() { LK.setTimeout(function () { tween(messageText, { alpha: 0 }, { duration: 500 }); }, 1500); } }); // Play level music LK.playMusic(levelData.music); // Reset camera camera.x = 0; camera.y = 0; } // Clear all level elements function clearLevel() { // Remove level elements if (currentLevel) { game.removeChild(currentLevel); currentLevel = null; } // Remove player if (player) { game.removeChild(player); player = null; } // Clear messages messageText.alpha = 0; // Remove level buttons for (var i = 0; i < levelButtons.length; i++) { game.removeChild(levelButtons[i]); } levelButtons = []; // Clear particles for (var j = 0; j < particles.length; j++) { particles[j].destroy(); } particles = []; } // Handle level completion function completeLevel() { gameState = "levelComplete"; // Add level to completed levels if not already there if (!storage.completedLevels.includes(storage.currentLevel)) { storage.completedLevels.push(storage.currentLevel); } // Play success sound LK.getSound('levelComplete').play(); // Show completion message messageText.setText("LEVEL COMPLETE!"); tween(messageText, { alpha: 1 }, { duration: 500 }); // Return to level select after a delay LK.setTimeout(function () { LK.showYouWin(); }, 2000); } // Reset the current level after death function resetLevel() { // Don't reset if we're not playing if (gameState !== "playing") { return; } // Hide death message tween(messageText, { alpha: 0 }, { duration: 300 }); // Create player if (player) { game.removeChild(player); } player = new Player(); player.x = 300; player.y = 2500; player.init(); game.addChild(player); // Reset camera camera.x = 0; camera.y = 0; // Update death count deathCountText.setText("DEATHS: " + storage.deaths); // Clear particles for (var i = 0; i < particles.length; i++) { particles[i].destroy(); } particles = []; } // Create explosion particles when player dies function createDeathParticles(x, y) { var particleCount = 30; var playerColor = 0x3498db; for (var i = 0; i < particleCount; i++) { var particle = new Particle(); particle.init(x, y, playerColor); game.addChild(particle); particles.push(particle); } // Show death message messageText.setText("TAP TO RETRY"); tween(messageText, { alpha: 1 }, { duration: 300 }); // Reset level after a short delay LK.setTimeout(resetLevel, 1000); } // Input Handlers game.down = function (x, y) { if (gameState === "playing") { if (player && !player.isDead) { player.jump(); } else if (player && player.isDead) { resetLevel(); } } }; game.update = function () { var now = Date.now(); var delta = now - lastTick; lastTick = now; // Process particles for (var i = particles.length - 1; i >= 0; i--) { if (particles[i].update()) { particles.splice(i, 1); } } if (gameState === "playing" && player && !player.isDead) { // Update player player.update(); // Check collisions if (currentLevel) { var collision = currentLevel.checkCollisions(player); if (collision === 'finish') { completeLevel(); } } // Camera follow player camera.x = player.x - 512; // Keep player at 1/4 of screen if (camera.x < 0) { camera.x = 0; } // Apply camera transform to level if (currentLevel) { currentLevel.x = -camera.x; } } }; // Initialize the game function initGame() { defineLevels(); initLevelSelect(); } // Start the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,995 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ completedLevels: [],
+ currentLevel: 0,
+ attempts: 0,
+ deaths: 0
+});
+
+/****
+* Classes
+****/
+var Level = Container.expand(function () {
+ var self = Container.call(this);
+ self.obstacles = [];
+ self.platforms = [];
+ self.length = 0;
+ self.id = 0;
+ self.startX = 300;
+ self.music = 'level1Music';
+ self.difficulty = 1;
+ self.name = "Level 1";
+ self.init = function (levelData) {
+ self.obstacles = [];
+ self.platforms = [];
+ self.id = levelData.id;
+ self.length = levelData.length || 10000;
+ self.music = levelData.music || 'level1Music';
+ self.difficulty = levelData.difficulty || 1;
+ self.name = levelData.name || "Level " + self.id;
+ // Create obstacles based on level data
+ if (levelData.obstacles) {
+ levelData.obstacles.forEach(function (obs) {
+ var obstacle = new Obstacle();
+ obstacle.init(obs.type, obs.x, obs.y, obs.width, obs.height);
+ self.addChild(obstacle);
+ self.obstacles.push(obstacle);
+ });
+ }
+ // Create platforms based on level data
+ if (levelData.platforms) {
+ levelData.platforms.forEach(function (plat) {
+ var platform = new Obstacle();
+ platform.init('platform', plat.x, plat.y, plat.width, plat.height);
+ self.addChild(platform);
+ self.platforms.push(platform);
+ });
+ }
+ // Always have a ground platform
+ var ground = new Obstacle();
+ ground.init('ground', self.length / 2, 2700, self.length, 50);
+ self.addChild(ground);
+ self.platforms.push(ground);
+ // Add decorative grid lines
+ for (var i = 0; i < 10; i++) {
+ var gridLine = self.attachAsset('gridLine', {
+ anchorX: 0,
+ anchorY: 0.5,
+ y: 500 + i * 250,
+ x: 0,
+ alpha: 0.3
+ });
+ gridLine.width = self.length;
+ }
+ // Create finish line
+ var finishLine = new Obstacle();
+ finishLine.init('platform', self.length - 100, 2650, 20, 100);
+ finishLine.type = 'finish';
+ var finishGraphics = finishLine.attachAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0x2ecc71
+ });
+ self.addChild(finishLine);
+ self.obstacles.push(finishLine);
+ };
+ self.checkCollisions = function (player) {
+ // Check platform collisions
+ player.isGrounded = false;
+ for (var i = 0; i < self.platforms.length; i++) {
+ var platform = self.platforms[i];
+ if (player.intersects(platform)) {
+ // Only collide with top of platform
+ if (player.y - player.height / 2 < platform.y - platform.height / 2) {
+ player.y = platform.y - platform.height / 2 - player.height / 2;
+ player.vy = 0;
+ player.isGrounded = true;
+ }
+ }
+ }
+ // Check obstacle collisions
+ for (var j = 0; j < self.obstacles.length; j++) {
+ var obstacle = self.obstacles[j];
+ if (player.intersects(obstacle)) {
+ if (obstacle.type === 'finish') {
+ return 'finish';
+ } else if (obstacle.type === 'spike') {
+ player.die();
+ return 'death';
+ }
+ }
+ }
+ return null;
+ };
+ return self;
+});
+var LevelButton = Container.expand(function () {
+ var self = Container.call(this);
+ var box = self.attachAsset('levelBox', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var levelText = new Text2("1", {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ levelText.anchor.set(0.5);
+ var nameText = new Text2("Level 1", {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ nameText.anchor.set(0.5);
+ nameText.y = 50;
+ self.addChild(levelText);
+ self.addChild(nameText);
+ self.level = 1;
+ self.unlocked = true;
+ self.init = function (level, name, unlocked) {
+ self.level = level;
+ self.unlocked = unlocked === undefined ? true : unlocked;
+ levelText.setText(level);
+ nameText.setText(name || "Level " + level);
+ // Visual state
+ if (!self.unlocked) {
+ box.tint = 0x7f8c8d;
+ levelText.alpha = 0.5;
+ nameText.alpha = 0.5;
+ } else {
+ box.tint = 0x9b59b6;
+ levelText.alpha = 1;
+ nameText.alpha = 1;
+ }
+ // If completed, show a checkmark or different color
+ if (storage.completedLevels.includes(level)) {
+ box.tint = 0x2ecc71;
+ }
+ };
+ self.down = function () {
+ if (self.unlocked) {
+ tween(box, {
+ scale: 0.9
+ }, {
+ duration: 100
+ });
+ }
+ };
+ self.up = function () {
+ if (self.unlocked) {
+ tween(box, {
+ scale: 1
+ }, {
+ duration: 100
+ });
+ LK.getSound('levelSelect').play();
+ startLevel(self.level);
+ }
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ self.type = 'spike'; // Default type
+ var graphics;
+ self.init = function (type, x, y, width, height) {
+ self.type = type || 'spike';
+ // Remove existing graphics if any
+ if (graphics) {
+ self.removeChild(graphics);
+ }
+ graphics = self.attachAsset(self.type, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ if (width) {
+ graphics.width = width;
+ }
+ if (height) {
+ graphics.height = height;
+ }
+ self.x = x;
+ self.y = y;
+ };
+ return self;
+});
+var Particle = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('particle', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.8
+ });
+ self.init = function (x, y, color) {
+ self.x = x;
+ self.y = y;
+ self.vx = Math.random() * 10 - 5;
+ self.vy = Math.random() * -15 - 5;
+ self.gravity = 0.5;
+ self.life = Math.random() * 30 + 30;
+ self.maxLife = self.life;
+ graphics.tint = color || 0x3498db;
+ };
+ self.update = function () {
+ self.x += self.vx;
+ self.vy += self.gravity;
+ self.y += self.vy;
+ self.life--;
+ // Fade out as life decreases
+ graphics.alpha = self.life / self.maxLife * 0.8;
+ graphics.scale.set(self.life / self.maxLife);
+ if (self.life <= 0) {
+ self.destroy();
+ return true; // Signal to remove from array
+ }
+ return false;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.vx = 0;
+ self.vy = 0;
+ self.speed = 8;
+ self.gravity = 0.8;
+ self.jumpForce = -20;
+ self.isGrounded = false;
+ self.isDead = false;
+ self.autoMove = true;
+ self.init = function () {
+ self.vx = self.speed;
+ self.vy = 0;
+ self.isDead = false;
+ graphics.rotation = 0;
+ graphics.alpha = 1;
+ };
+ self.update = function () {
+ if (self.isDead) {
+ return;
+ }
+ // Apply gravity
+ self.vy += self.gravity;
+ // Update position
+ if (self.autoMove) {
+ self.x += self.vx;
+ }
+ self.y += self.vy;
+ // Rotate based on movement (for visual effect)
+ graphics.rotation += 0.1;
+ // Check if fallen off screen
+ if (self.y > 2732) {
+ self.die();
+ }
+ };
+ self.jump = function () {
+ if (self.isGrounded && !self.isDead) {
+ self.vy = self.jumpForce;
+ self.isGrounded = false;
+ LK.getSound('jump').play();
+ return true;
+ }
+ return false;
+ };
+ self.die = function () {
+ if (!self.isDead) {
+ self.isDead = true;
+ LK.getSound('death').play();
+ createDeathParticles(self.x, self.y);
+ tween(graphics, {
+ alpha: 0
+ }, {
+ duration: 300
+ });
+ storage.deaths++;
+ storage.attempts++;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1a1a2e
+});
+
+/****
+* Game Code
+****/
+// Game state
+var gameState = "menu"; // menu, playing, gameOver
+var player;
+var currentLevel;
+var camera = {
+ x: 0,
+ y: 0
+};
+var particles = [];
+var levels = [];
+var levelButtons = [];
+var lastTick = 0;
+// UI Elements
+var scoreText = new Text2("SCORE: 0", {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+scoreText.x = 150;
+scoreText.y = 50;
+LK.gui.top.addChild(scoreText);
+var levelNameText = new Text2("LEVEL 1", {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelNameText.anchor.set(0.5, 0);
+levelNameText.y = 50;
+LK.gui.top.addChild(levelNameText);
+var deathCountText = new Text2("DEATHS: 0", {
+ size: 40,
+ fill: 0xFFFFFF
+});
+deathCountText.anchor.set(1, 0);
+deathCountText.x = -150;
+deathCountText.y = 50;
+LK.gui.topRight.addChild(deathCountText);
+var messageText = new Text2("TAP TO JUMP", {
+ size: 80,
+ fill: 0xFFFFFF
+});
+messageText.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(messageText);
+messageText.alpha = 0;
+// Define all levels
+function defineLevels() {
+ levels = [{
+ id: 1,
+ name: "Simple Run",
+ difficulty: 1,
+ length: 8000,
+ music: "level1Music",
+ obstacles: [{
+ type: "spike",
+ x: 2000,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 2300,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 3000,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 3300,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 3600,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4500,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4800,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 5500,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6000,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6300,
+ y: 2650
+ }],
+ platforms: [{
+ x: 2700,
+ y: 2500,
+ width: 300,
+ height: 30
+ }, {
+ x: 3800,
+ y: 2400,
+ width: 300,
+ height: 30
+ }, {
+ x: 4200,
+ y: 2300,
+ width: 300,
+ height: 30
+ }, {
+ x: 5200,
+ y: 2500,
+ width: 500,
+ height: 30
+ }, {
+ x: 6500,
+ y: 2400,
+ width: 300,
+ height: 30
+ }]
+ }, {
+ id: 2,
+ name: "Spike Madness",
+ difficulty: 2,
+ length: 10000,
+ music: "level2Music",
+ obstacles: [{
+ type: "spike",
+ x: 1500,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 1600,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 2200,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 2500,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 2800,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 3100,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 3400,
+ y: 2350
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 3700,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4000,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4300,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4600,
+ y: 2250
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 4900,
+ y: 2250
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 5200,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 5500,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 5800,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6100,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6400,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6700,
+ y: 2400
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 7000,
+ y: 2400
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 7300,
+ y: 2400
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 7900,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 8200,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 8500,
+ y: 2650
+ }],
+ platforms: [{
+ x: 1800,
+ y: 2500,
+ width: 300,
+ height: 30
+ }, {
+ x: 3400,
+ y: 2400,
+ width: 500,
+ height: 30
+ }, {
+ x: 4600,
+ y: 2300,
+ width: 700,
+ height: 30
+ }, {
+ x: 7000,
+ y: 2450,
+ width: 1200,
+ height: 30
+ }, {
+ x: 8700,
+ y: 2500,
+ width: 400,
+ height: 30
+ }]
+ }, {
+ id: 3,
+ name: "The Final Dash",
+ difficulty: 3,
+ length: 12000,
+ music: "level3Music",
+ obstacles: [{
+ type: "spike",
+ x: 1200,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 1500,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 1800,
+ y: 2500
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 2100,
+ y: 2500
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 2400,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 2700,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 3000,
+ y: 2400
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 3300,
+ y: 2400
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 3600,
+ y: 2400
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 3900,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4200,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4500,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 4800,
+ y: 2300
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 5100,
+ y: 2300
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 5400,
+ y: 2300
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 5700,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6000,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6300,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6600,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 6900,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 7200,
+ y: 2200
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 7500,
+ y: 2200
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 7800,
+ y: 2200
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 8100,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 8400,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 8700,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 9000,
+ y: 2100
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 9300,
+ y: 2100
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 9600,
+ y: 2100
+ },
+ // On platform
+ {
+ type: "spike",
+ x: 9900,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 10200,
+ y: 2650
+ }, {
+ type: "spike",
+ x: 10500,
+ y: 2650
+ }],
+ platforms: [{
+ x: 1800,
+ y: 2550,
+ width: 600,
+ height: 30
+ }, {
+ x: 3300,
+ y: 2450,
+ width: 900,
+ height: 30
+ }, {
+ x: 5100,
+ y: 2350,
+ width: 900,
+ height: 30
+ }, {
+ x: 7500,
+ y: 2250,
+ width: 900,
+ height: 30
+ }, {
+ x: 9300,
+ y: 2150,
+ width: 900,
+ height: 30
+ }, {
+ x: 11000,
+ y: 2500,
+ width: 400,
+ height: 30
+ }]
+ }];
+}
+// Initialize level select menu
+function initLevelSelect() {
+ gameState = "menu";
+ clearLevel();
+ // Create background
+ var background = game.attachAsset('background', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ // Play menu music
+ LK.playMusic('menuMusic');
+ // Show title
+ messageText.setText("GEOMETRY DASH 5: LEVEL SELECT");
+ tween(messageText, {
+ alpha: 1
+ }, {
+ duration: 500
+ });
+ // Calculate how many levels are unlocked
+ var unlockedLevels = storage.completedLevels.length + 1;
+ if (unlockedLevels > levels.length) {
+ unlockedLevels = levels.length;
+ }
+ // Create level buttons
+ levelButtons = [];
+ for (var i = 0; i < levels.length; i++) {
+ var level = levels[i];
+ var button = new LevelButton();
+ button.init(level.id, level.name, i < unlockedLevels);
+ // Position buttons in a grid, 3 per row
+ var row = Math.floor(i / 3);
+ var col = i % 3;
+ button.x = 512 + col * 512;
+ button.y = 800 + row * 500;
+ game.addChild(button);
+ levelButtons.push(button);
+ }
+ // Show stats
+ scoreText.setText("COMPLETED: " + storage.completedLevels.length + "/" + levels.length);
+ deathCountText.setText("DEATHS: " + storage.deaths);
+}
+// Start a specific level
+function startLevel(levelId) {
+ gameState = "playing";
+ clearLevel();
+ // Find level data
+ var levelData = null;
+ for (var i = 0; i < levels.length; i++) {
+ if (levels[i].id === levelId) {
+ levelData = levels[i];
+ break;
+ }
+ }
+ if (!levelData) {
+ console.log("Level not found: " + levelId);
+ return;
+ }
+ // Store the current level
+ storage.currentLevel = levelId;
+ // Create level
+ currentLevel = new Level();
+ currentLevel.init(levelData);
+ game.addChild(currentLevel);
+ // Create player
+ player = new Player();
+ player.x = 300;
+ player.y = 2500;
+ player.init();
+ game.addChild(player);
+ // Update UI
+ levelNameText.setText(levelData.name);
+ deathCountText.setText("DEATHS: " + storage.deaths);
+ // Show message
+ messageText.setText("TAP TO JUMP");
+ tween(messageText, {
+ alpha: 1
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ LK.setTimeout(function () {
+ tween(messageText, {
+ alpha: 0
+ }, {
+ duration: 500
+ });
+ }, 1500);
+ }
+ });
+ // Play level music
+ LK.playMusic(levelData.music);
+ // Reset camera
+ camera.x = 0;
+ camera.y = 0;
+}
+// Clear all level elements
+function clearLevel() {
+ // Remove level elements
+ if (currentLevel) {
+ game.removeChild(currentLevel);
+ currentLevel = null;
+ }
+ // Remove player
+ if (player) {
+ game.removeChild(player);
+ player = null;
+ }
+ // Clear messages
+ messageText.alpha = 0;
+ // Remove level buttons
+ for (var i = 0; i < levelButtons.length; i++) {
+ game.removeChild(levelButtons[i]);
+ }
+ levelButtons = [];
+ // Clear particles
+ for (var j = 0; j < particles.length; j++) {
+ particles[j].destroy();
+ }
+ particles = [];
+}
+// Handle level completion
+function completeLevel() {
+ gameState = "levelComplete";
+ // Add level to completed levels if not already there
+ if (!storage.completedLevels.includes(storage.currentLevel)) {
+ storage.completedLevels.push(storage.currentLevel);
+ }
+ // Play success sound
+ LK.getSound('levelComplete').play();
+ // Show completion message
+ messageText.setText("LEVEL COMPLETE!");
+ tween(messageText, {
+ alpha: 1
+ }, {
+ duration: 500
+ });
+ // Return to level select after a delay
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 2000);
+}
+// Reset the current level after death
+function resetLevel() {
+ // Don't reset if we're not playing
+ if (gameState !== "playing") {
+ return;
+ }
+ // Hide death message
+ tween(messageText, {
+ alpha: 0
+ }, {
+ duration: 300
+ });
+ // Create player
+ if (player) {
+ game.removeChild(player);
+ }
+ player = new Player();
+ player.x = 300;
+ player.y = 2500;
+ player.init();
+ game.addChild(player);
+ // Reset camera
+ camera.x = 0;
+ camera.y = 0;
+ // Update death count
+ deathCountText.setText("DEATHS: " + storage.deaths);
+ // Clear particles
+ for (var i = 0; i < particles.length; i++) {
+ particles[i].destroy();
+ }
+ particles = [];
+}
+// Create explosion particles when player dies
+function createDeathParticles(x, y) {
+ var particleCount = 30;
+ var playerColor = 0x3498db;
+ for (var i = 0; i < particleCount; i++) {
+ var particle = new Particle();
+ particle.init(x, y, playerColor);
+ game.addChild(particle);
+ particles.push(particle);
+ }
+ // Show death message
+ messageText.setText("TAP TO RETRY");
+ tween(messageText, {
+ alpha: 1
+ }, {
+ duration: 300
+ });
+ // Reset level after a short delay
+ LK.setTimeout(resetLevel, 1000);
+}
+// Input Handlers
+game.down = function (x, y) {
+ if (gameState === "playing") {
+ if (player && !player.isDead) {
+ player.jump();
+ } else if (player && player.isDead) {
+ resetLevel();
+ }
+ }
+};
+game.update = function () {
+ var now = Date.now();
+ var delta = now - lastTick;
+ lastTick = now;
+ // Process particles
+ for (var i = particles.length - 1; i >= 0; i--) {
+ if (particles[i].update()) {
+ particles.splice(i, 1);
+ }
+ }
+ if (gameState === "playing" && player && !player.isDead) {
+ // Update player
+ player.update();
+ // Check collisions
+ if (currentLevel) {
+ var collision = currentLevel.checkCollisions(player);
+ if (collision === 'finish') {
+ completeLevel();
+ }
+ }
+ // Camera follow player
+ camera.x = player.x - 512; // Keep player at 1/4 of screen
+ if (camera.x < 0) {
+ camera.x = 0;
+ }
+ // Apply camera transform to level
+ if (currentLevel) {
+ currentLevel.x = -camera.x;
+ }
+ }
+};
+// Initialize the game
+function initGame() {
+ defineLevels();
+ initLevelSelect();
+}
+// Start the game
+initGame();
\ No newline at end of file