User prompt
Please fix the bug: 'Script error.' in or related to this line: 'tween.to(playerSprite, {' Line Number: 75 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
When I jump make the icon do a 360
User prompt
When I press back it just shows the text on the screen fix it
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'playerSprite.setColor(skinColors[storage.selectedSkin]);' Line Number: 50
User prompt
Do it
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.remove('lastCompletedLevel');' Line Number: 295
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.lastCompletedLevel = undefined;' Line Number: 295
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.x = PLAYER_START_X;' Line Number: 375
User prompt
And every time you beat each level you get coins in the first level you get +20 in the second +50 and in the last level +100 you can claim the coins every time you beat the level ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make a main menu and the play button puts you in a new menu and there’s multiple levels and there is 3 and the first one is called first steps make it an easy level with the difficulty easy and the second level is called Erin’s atventure and the difficulty is medium and the third level is called Final steps and make the difficulty hard
Code edit (1 edits merged)
Please save this source code
User prompt
Geometry Dash: Jump & Dodge
Initial prompt
Make geometry dash
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Obstacle class (tall block)
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsSprite = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 1
});
self.speed = 22;
self.update = function () {
self.x -= self.speed;
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 1
});
// Physics
self.vy = 0;
self.isJumping = false;
self.gravity = 2.2;
self.jumpStrength = -48;
self.groundY = 0; // Set after ground is created
// Update method
self.update = function () {
// Apply gravity
self.vy += self.gravity;
self.y += self.vy;
// Ground collision
if (self.y > self.groundY) {
self.y = self.groundY;
self.vy = 0;
self.isJumping = false;
}
};
// Jump method
self.jump = function () {
if (!self.isJumping && self.y >= self.groundY) {
self.vy = self.jumpStrength;
self.isJumping = true;
}
};
return self;
});
// Spike class (obstacle)
var Spike = Container.expand(function () {
var self = Container.call(this);
var spikeSprite = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 1
});
self.speed = 22; // Moves left
self.update = function () {
self.x -= self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222831
});
/****
* Game Code
****/
// Obstacle: purple rectangle
// Spike: red triangle (approximate with a tall, thin box for MVP)
// Ground: gray rectangle
// Player: blue square
// --- LEVEL DATA ---
var LEVELS = [{
name: "First Steps",
difficulty: "Easy",
color: 0x2ecc71,
minGap: 800,
maxGap: 1200,
types: ['spike'],
intro: "Welcome to your first steps!"
}, {
name: "Erin's Adventure",
difficulty: "Medium",
color: 0xf1c40f,
minGap: 650,
maxGap: 1050,
types: ['spike', 'obstacle'],
intro: "A trickier journey awaits."
}, {
name: "Final Steps",
difficulty: "Hard",
color: 0xe74c3c,
minGap: 500,
maxGap: 900,
types: ['spike', 'obstacle', 'spike'],
intro: "Only the brave survive!"
}];
// --- MENU STATE ---
var MENU_STATE = {
MAIN: 0,
LEVEL_SELECT: 1,
PLAYING: 2
};
var menuState = MENU_STATE.MAIN;
var selectedLevel = 0;
// --- UI ELEMENTS ---
var menuContainer = new Container();
var levelSelectContainer = new Container();
var introText = null;
// --- GAME CONSTANTS ---
var GROUND_HEIGHT = 120;
var PLAYER_SIZE = 120;
var PLAYER_START_X = 400;
var OBSTACLE_MIN_GAP = 600;
var OBSTACLE_MAX_GAP = 1100;
var OBSTACLE_TYPES = ['spike', 'obstacle'];
var OBSTACLE_Y = 2732 - GROUND_HEIGHT;
// --- GAME STATE ---
var player;
var ground;
var obstacles = [];
var score = 0;
var scoreTxt;
var lastObstacleX = 0;
var isGameOver = false;
// --- UI HELPERS ---
function clearMenuUI() {
if (menuContainer.parent) menuContainer.parent.removeChild(menuContainer);
if (levelSelectContainer.parent) levelSelectContainer.parent.removeChild(levelSelectContainer);
if (introText && introText.parent) introText.parent.removeChild(introText);
}
// --- MAIN MENU ---
function showMainMenu() {
clearMenuUI();
menuState = MENU_STATE.MAIN;
menuContainer.removeChildren();
// Title
var title = new Text2("Geometry Dash", {
size: 180,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 400;
menuContainer.addChild(title);
// Play button
var playBtn = new Text2("Play", {
size: 140,
fill: 0x2ECC71
});
playBtn.anchor.set(0.5, 0.5);
playBtn.x = 2048 / 2;
playBtn.y = 1000;
playBtn.interactive = true;
playBtn.buttonMode = true;
playBtn.down = function () {
showLevelSelect();
};
menuContainer.addChild(playBtn);
// Add to game
game.addChild(menuContainer);
}
// --- LEVEL SELECT MENU ---
function showLevelSelect() {
clearMenuUI();
menuState = MENU_STATE.LEVEL_SELECT;
levelSelectContainer.removeChildren();
// Title
var selTitle = new Text2("Select Level", {
size: 150,
fill: 0xFFFFFF
});
selTitle.anchor.set(0.5, 0);
selTitle.x = 2048 / 2;
selTitle.y = 300;
levelSelectContainer.addChild(selTitle);
// Level buttons
for (var i = 0; i < LEVELS.length; i++) {
(function (idx) {
var lvl = LEVELS[idx];
var btn = new Text2(lvl.name + " (" + lvl.difficulty + ")", {
size: 110,
fill: "#" + lvl.color.toString(16).padStart(6, "0")
});
btn.anchor.set(0.5, 0.5);
btn.x = 2048 / 2;
btn.y = 600 + idx * 250;
btn.interactive = true;
btn.buttonMode = true;
btn.down = function () {
selectedLevel = idx;
showLevelIntro();
};
levelSelectContainer.addChild(btn);
})(i);
}
// Back button
var backBtn = new Text2("Back", {
size: 90,
fill: 0x888888
});
backBtn.anchor.set(0.5, 0.5);
backBtn.x = 2048 / 2;
backBtn.y = 600 + LEVELS.length * 250 + 100;
backBtn.interactive = true;
backBtn.buttonMode = true;
backBtn.down = function () {
showMainMenu();
};
levelSelectContainer.addChild(backBtn);
game.addChild(levelSelectContainer);
}
// --- LEVEL INTRO ---
function showLevelIntro() {
clearMenuUI();
menuState = MENU_STATE.LEVEL_SELECT;
var lvl = LEVELS[selectedLevel];
introText = new Text2(lvl.name + "\nDifficulty: " + lvl.difficulty + "\n\n" + lvl.intro + "\n\nTap to Start", {
size: 100,
fill: "#" + lvl.color.toString(16).padStart(6, "0"),
align: "center"
});
introText.anchor.set(0.5, 0.5);
introText.x = 2048 / 2;
introText.y = 1200;
introText.interactive = true;
introText.buttonMode = true;
introText.down = function () {
startLevel(selectedLevel);
};
game.addChild(introText);
}
// --- START LEVEL ---
function startLevel(levelIdx) {
clearMenuUI();
menuState = MENU_STATE.PLAYING;
// Set level params
var lvl = LEVELS[levelIdx];
OBSTACLE_MIN_GAP = lvl.minGap;
OBSTACLE_MAX_GAP = lvl.maxGap;
OBSTACLE_TYPES = lvl.types;
// Reset game state
resetGame();
// Show score
scoreTxt.setText("0");
scoreTxt.visible = true;
// Show ground and player
if (!ground) {
ground = LK.getAsset('ground', {
anchorX: 0,
anchorY: 1,
x: 0,
y: 2732
});
game.addChild(ground);
}
if (!player) {
player = new Player();
player.x = PLAYER_START_X;
player.groundY = 2732 - GROUND_HEIGHT;
player.y = player.groundY;
game.addChild(player);
}
// Initial obstacle
lastObstacleX = 1200;
spawnObstacle();
}
// --- SCORE TEXT ---
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.visible = false;
// --- INITIALIZE: show main menu ---
showMainMenu();
// Helper: spawn obstacle
function spawnObstacle() {
// Randomly pick type
var type = OBSTACLE_TYPES[Math.floor(Math.random() * OBSTACLE_TYPES.length)];
var obs;
if (type === 'spike') {
obs = new Spike();
obs.x = 2048 + 100;
obs.y = OBSTACLE_Y;
} else {
obs = new Obstacle();
obs.x = 2048 + 100;
obs.y = OBSTACLE_Y;
}
obstacles.push(obs);
game.addChild(obs);
lastObstacleX = obs.x;
}
// Helper: reset game state
function resetGame() {
// Remove obstacles
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].destroy();
}
obstacles = [];
// Reset player
player.x = PLAYER_START_X;
player.y = player.groundY;
player.vy = 0;
player.isJumping = false;
// Reset score
score = 0;
scoreTxt.setText(score);
lastObstacleX = 1200;
isGameOver = false;
}
// Touch/click to jump
game.down = function (x, y, obj) {
if (menuState !== MENU_STATE.PLAYING) return;
if (isGameOver) return;
player.jump();
};
// Main update loop
game.update = function () {
if (menuState !== MENU_STATE.PLAYING) return;
if (isGameOver) return;
// Update player
player.update();
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.update();
// Remove if off screen
if (obs.x < -200) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision detection
if (player.intersects(obs)) {
LK.effects.flashScreen(0xff0000, 800);
isGameOver = true;
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
return;
}
}
// Score: increase as player passes obstacles
for (var j = 0; j < obstacles.length; j++) {
var o = obstacles[j];
if (!o.passed && o.x + 60 < player.x) {
o.passed = true;
score += 1;
scoreTxt.setText(score);
}
}
// Spawn new obstacles
if (obstacles.length === 0 || 2048 - lastObstacleX > OBSTACLE_MIN_GAP + Math.floor(Math.random() * (OBSTACLE_MAX_GAP - OBSTACLE_MIN_GAP))) {
spawnObstacle();
}
};
// Reset game on game over
LK.on('gameover', function () {
scoreTxt.visible = false;
showMainMenu();
}); ===================================================================
--- original.js
+++ change.js
@@ -80,45 +80,214 @@
// Obstacle: purple rectangle
// Spike: red triangle (approximate with a tall, thin box for MVP)
// Ground: gray rectangle
// Player: blue square
-// Constants
+// --- LEVEL DATA ---
+var LEVELS = [{
+ name: "First Steps",
+ difficulty: "Easy",
+ color: 0x2ecc71,
+ minGap: 800,
+ maxGap: 1200,
+ types: ['spike'],
+ intro: "Welcome to your first steps!"
+}, {
+ name: "Erin's Adventure",
+ difficulty: "Medium",
+ color: 0xf1c40f,
+ minGap: 650,
+ maxGap: 1050,
+ types: ['spike', 'obstacle'],
+ intro: "A trickier journey awaits."
+}, {
+ name: "Final Steps",
+ difficulty: "Hard",
+ color: 0xe74c3c,
+ minGap: 500,
+ maxGap: 900,
+ types: ['spike', 'obstacle', 'spike'],
+ intro: "Only the brave survive!"
+}];
+// --- MENU STATE ---
+var MENU_STATE = {
+ MAIN: 0,
+ LEVEL_SELECT: 1,
+ PLAYING: 2
+};
+var menuState = MENU_STATE.MAIN;
+var selectedLevel = 0;
+// --- UI ELEMENTS ---
+var menuContainer = new Container();
+var levelSelectContainer = new Container();
+var introText = null;
+// --- GAME CONSTANTS ---
var GROUND_HEIGHT = 120;
var PLAYER_SIZE = 120;
var PLAYER_START_X = 400;
var OBSTACLE_MIN_GAP = 600;
var OBSTACLE_MAX_GAP = 1100;
var OBSTACLE_TYPES = ['spike', 'obstacle'];
var OBSTACLE_Y = 2732 - GROUND_HEIGHT;
-// Game state
+// --- GAME STATE ---
var player;
var ground;
var obstacles = [];
var score = 0;
var scoreTxt;
var lastObstacleX = 0;
var isGameOver = false;
-// Create ground
-ground = LK.getAsset('ground', {
- anchorX: 0,
- anchorY: 1,
- x: 0,
- y: 2732
-});
-game.addChild(ground);
-// Create player
-player = new Player();
-player.x = PLAYER_START_X;
-player.groundY = 2732 - GROUND_HEIGHT;
-player.y = player.groundY;
-game.addChild(player);
-// Score text
+// --- UI HELPERS ---
+function clearMenuUI() {
+ if (menuContainer.parent) menuContainer.parent.removeChild(menuContainer);
+ if (levelSelectContainer.parent) levelSelectContainer.parent.removeChild(levelSelectContainer);
+ if (introText && introText.parent) introText.parent.removeChild(introText);
+}
+// --- MAIN MENU ---
+function showMainMenu() {
+ clearMenuUI();
+ menuState = MENU_STATE.MAIN;
+ menuContainer.removeChildren();
+ // Title
+ var title = new Text2("Geometry Dash", {
+ size: 180,
+ fill: 0xFFFFFF
+ });
+ title.anchor.set(0.5, 0);
+ title.x = 2048 / 2;
+ title.y = 400;
+ menuContainer.addChild(title);
+ // Play button
+ var playBtn = new Text2("Play", {
+ size: 140,
+ fill: 0x2ECC71
+ });
+ playBtn.anchor.set(0.5, 0.5);
+ playBtn.x = 2048 / 2;
+ playBtn.y = 1000;
+ playBtn.interactive = true;
+ playBtn.buttonMode = true;
+ playBtn.down = function () {
+ showLevelSelect();
+ };
+ menuContainer.addChild(playBtn);
+ // Add to game
+ game.addChild(menuContainer);
+}
+// --- LEVEL SELECT MENU ---
+function showLevelSelect() {
+ clearMenuUI();
+ menuState = MENU_STATE.LEVEL_SELECT;
+ levelSelectContainer.removeChildren();
+ // Title
+ var selTitle = new Text2("Select Level", {
+ size: 150,
+ fill: 0xFFFFFF
+ });
+ selTitle.anchor.set(0.5, 0);
+ selTitle.x = 2048 / 2;
+ selTitle.y = 300;
+ levelSelectContainer.addChild(selTitle);
+ // Level buttons
+ for (var i = 0; i < LEVELS.length; i++) {
+ (function (idx) {
+ var lvl = LEVELS[idx];
+ var btn = new Text2(lvl.name + " (" + lvl.difficulty + ")", {
+ size: 110,
+ fill: "#" + lvl.color.toString(16).padStart(6, "0")
+ });
+ btn.anchor.set(0.5, 0.5);
+ btn.x = 2048 / 2;
+ btn.y = 600 + idx * 250;
+ btn.interactive = true;
+ btn.buttonMode = true;
+ btn.down = function () {
+ selectedLevel = idx;
+ showLevelIntro();
+ };
+ levelSelectContainer.addChild(btn);
+ })(i);
+ }
+ // Back button
+ var backBtn = new Text2("Back", {
+ size: 90,
+ fill: 0x888888
+ });
+ backBtn.anchor.set(0.5, 0.5);
+ backBtn.x = 2048 / 2;
+ backBtn.y = 600 + LEVELS.length * 250 + 100;
+ backBtn.interactive = true;
+ backBtn.buttonMode = true;
+ backBtn.down = function () {
+ showMainMenu();
+ };
+ levelSelectContainer.addChild(backBtn);
+ game.addChild(levelSelectContainer);
+}
+// --- LEVEL INTRO ---
+function showLevelIntro() {
+ clearMenuUI();
+ menuState = MENU_STATE.LEVEL_SELECT;
+ var lvl = LEVELS[selectedLevel];
+ introText = new Text2(lvl.name + "\nDifficulty: " + lvl.difficulty + "\n\n" + lvl.intro + "\n\nTap to Start", {
+ size: 100,
+ fill: "#" + lvl.color.toString(16).padStart(6, "0"),
+ align: "center"
+ });
+ introText.anchor.set(0.5, 0.5);
+ introText.x = 2048 / 2;
+ introText.y = 1200;
+ introText.interactive = true;
+ introText.buttonMode = true;
+ introText.down = function () {
+ startLevel(selectedLevel);
+ };
+ game.addChild(introText);
+}
+// --- START LEVEL ---
+function startLevel(levelIdx) {
+ clearMenuUI();
+ menuState = MENU_STATE.PLAYING;
+ // Set level params
+ var lvl = LEVELS[levelIdx];
+ OBSTACLE_MIN_GAP = lvl.minGap;
+ OBSTACLE_MAX_GAP = lvl.maxGap;
+ OBSTACLE_TYPES = lvl.types;
+ // Reset game state
+ resetGame();
+ // Show score
+ scoreTxt.setText("0");
+ scoreTxt.visible = true;
+ // Show ground and player
+ if (!ground) {
+ ground = LK.getAsset('ground', {
+ anchorX: 0,
+ anchorY: 1,
+ x: 0,
+ y: 2732
+ });
+ game.addChild(ground);
+ }
+ if (!player) {
+ player = new Player();
+ player.x = PLAYER_START_X;
+ player.groundY = 2732 - GROUND_HEIGHT;
+ player.y = player.groundY;
+ game.addChild(player);
+ }
+ // Initial obstacle
+ lastObstacleX = 1200;
+ spawnObstacle();
+}
+// --- SCORE TEXT ---
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
+scoreTxt.visible = false;
+// --- INITIALIZE: show main menu ---
+showMainMenu();
// Helper: spawn obstacle
function spawnObstacle() {
// Randomly pick type
var type = OBSTACLE_TYPES[Math.floor(Math.random() * OBSTACLE_TYPES.length)];
@@ -155,13 +324,15 @@
isGameOver = false;
}
// Touch/click to jump
game.down = function (x, y, obj) {
+ if (menuState !== MENU_STATE.PLAYING) return;
if (isGameOver) return;
player.jump();
};
// Main update loop
game.update = function () {
+ if (menuState !== MENU_STATE.PLAYING) return;
if (isGameOver) return;
// Update player
player.update();
// Update obstacles
@@ -175,9 +346,8 @@
continue;
}
// Collision detection
if (player.intersects(obs)) {
- // Flash screen and game over
LK.effects.flashScreen(0xff0000, 800);
isGameOver = true;
LK.setTimeout(function () {
LK.showGameOver();
@@ -200,9 +370,7 @@
}
};
// Reset game on game over
LK.on('gameover', function () {
- resetGame();
-});
-// Initial obstacle
-lastObstacleX = 1200;
-spawnObstacle();
\ No newline at end of file
+ scoreTxt.visible = false;
+ showMainMenu();
+});
\ No newline at end of file