User prompt
reduce distance between obstacles
User prompt
best score Let him write
User prompt
Let there be a best score in the upper right corner, like a high score ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Let the highest score be in the upper right corner
User prompt
Let there be floating clouds in the background ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
edit the death code according to the current size of the pipes ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
The moment the bird touches the pipes, it dies ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
resize the pipes' measurement value
User prompt
There is an obstacle, you can pass between two pipes, but the obstacle is short, the remaining space is increased, the pipe is too long.
User prompt
delete ground put on screen show
User prompt
Let the ground remain fixed on the front screen
User prompt
move the grass to the front layer and keep it fixed on the screen
User prompt
make the game easier and pass the obstacles more easily
User prompt
Put more ground side by side and let the ground die as soon as it touches you ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Duplicate ground side by side and create like ground and if it touches the ground it will die
User prompt
Increase the distance between the pipes the bird passes through
User prompt
When the pipe is touched, it will die immediately and resize it. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
First pipe obstacle start closer
User prompt
There should be more space between the first pipe obstacle and the second obstacle it will pass through.
User prompt
Let there be more space between the first and second obstacles, 3 times or 2 times
User prompt
Let there be more space between the obstacles he passes through
User prompt
When you press the screen you jump more
User prompt
Make the bird jump higher when you tap the screen
Code edit (1 edits merged)
Please save this source code
User prompt
Flappy Bird
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Bird = Container.expand(function () { var self = Container.call(this); var birdGraphics = self.attachAsset('bird', { anchorX: 0.5, anchorY: 0.5 }); self.velocity = 0; self.gravity = 0.4; // Reduced from 0.6 for gentler falling self.flapStrength = -14; // Reduced from -16 for more controlled flight self.maxVelocity = 12; // Reduced from 15 for better control self.flap = function () { self.velocity = self.flapStrength; LK.getSound('flap').play(); // Animation for flap tween(birdGraphics, { rotation: -0.5 }, { duration: 150 }); tween(birdGraphics, { rotation: 0 }, { duration: 300 }); }; self.update = function () { // Apply gravity self.velocity += self.gravity; // Limit velocity if (self.velocity > self.maxVelocity) { self.velocity = self.maxVelocity; } // Update position self.y += self.velocity; // Rotate bird based on velocity var targetRotation = Math.min(Math.max(self.velocity * 0.1, -0.5), 1.5); birdGraphics.rotation = targetRotation; }; return self; }); var Cloud = Container.expand(function () { var self = Container.call(this); var cloudGraphics = self.attachAsset('cloud', { anchorX: 0.5, anchorY: 0.5 }); cloudGraphics.alpha = 0.6; self.speed = -1 - Math.random() * 2; // Random speed between -1 and -3 self.floatOffset = Math.random() * Math.PI * 2; // Random starting float phase self.floatSpeed = 0.02 + Math.random() * 0.02; // Random float speed self.initialY = self.y; self.update = function () { self.x += self.speed; // Floating motion using sine wave self.y = self.initialY + Math.sin(LK.ticks * self.floatSpeed + self.floatOffset) * 20; }; return self; }); var Pipe = Container.expand(function () { var self = Container.call(this); self.speed = -4; self.gapSize = 600; // Increased from 400 to 600 for easier passage self.scored = false; // Create top pipe self.topPipe = self.attachAsset('pipe', { anchorX: 0.5, anchorY: 1 }); // Create bottom pipe self.bottomPipe = self.attachAsset('pipe', { anchorX: 0.5, anchorY: 0 }); self.setupPipes = function (gapCenterY) { self.topPipe.y = gapCenterY - self.gapSize / 2; self.bottomPipe.y = gapCenterY + self.gapSize / 2; }; self.update = function () { self.x += self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var bird; var pipes = []; var clouds = []; var cloudSpawnTimer = 0; var cloudSpawnDelay = 300; // Spawn cloud every 300 frames (5 seconds at 60fps) var ground; var gameStarted = false; var gameOver = false; var pipeSpawnTimer = 0; var pipeSpawnDelay = 120; // Reduced from 200 frames for closer obstacles var initialPipeSpawnDelay = 100; // Increased from 60 frames for better start // UI elements var scoreTxt = new Text2('0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Best score display var bestScore = storage.bestScore || 0; var bestScoreTxt = new Text2('BEST: ' + bestScore, { size: 50, fill: 0xFFFFFF }); bestScoreTxt.anchor.set(1, 0); LK.gui.topRight.addChild(bestScoreTxt); var instructionTxt = new Text2('TAP TO FLAP', { size: 60, fill: 0xFFFFFF }); instructionTxt.anchor.set(0.5, 0.5); instructionTxt.x = 2048 / 2; instructionTxt.y = 2732 / 2 + 200; game.addChild(instructionTxt); // Create bird bird = game.addChild(new Bird()); bird.x = 400; bird.y = 2732 / 2; // Create ground - duplicated side by side for continuous ground - moved to GUI layer and fixed var groundTiles = []; for (var i = 0; i < 8; i++) { var groundTile = LK.getAsset('ground', { anchorX: 0, anchorY: 1 }); groundTile.x = i * 291; // Position tiles side by side based on ground width groundTile.y = 2732; groundTiles.push(groundTile); LK.gui.addChild(groundTile); // Add to GUI layer instead of game world } ground = groundTiles[0]; // Keep reference to first tile for backward compatibility // Spawn initial clouds for (var c = 0; c < 3; c++) { var initialCloud = new Cloud(); initialCloud.x = Math.random() * 2048; initialCloud.y = 200 + Math.random() * 800; initialCloud.initialY = initialCloud.y; var scale = 0.8 + Math.random() * 0.6; initialCloud.scaleX = scale; initialCloud.scaleY = scale; clouds.push(initialCloud); game.addChild(initialCloud); game.setChildIndex(initialCloud, 0); } function startGame() { gameStarted = true; instructionTxt.visible = false; bird.flap(); } function spawnPipe() { var pipe = new Pipe(); var minY = 400; var maxY = 2732 - 400; var gapCenterY = minY + Math.random() * (maxY - minY); pipe.x = 2048 + 60; pipe.setupPipes(gapCenterY); pipes.push(pipe); game.addChild(pipe); } function spawnCloud() { var cloud = new Cloud(); cloud.x = 2048 + 100; cloud.y = 200 + Math.random() * 800; // Random Y position in upper part of screen cloud.initialY = cloud.y; // Random scale for variety var scale = 0.8 + Math.random() * 0.6; // Scale between 0.8 and 1.4 cloud.scaleX = scale; cloud.scaleY = scale; clouds.push(cloud); game.addChild(cloud); // Send cloud to back so it appears behind other elements game.setChildIndex(cloud, 0); } function checkCollisions() { // Check ground collision - check against all ground tiles for (var g = 0; g < groundTiles.length; g++) { if (bird.y + 20 >= groundTiles[g].y) { // Reduced from 30 to 20 for more forgiving ground collision // Immediate death with ground tween effect tween(groundTiles[g], { scaleX: 1.3, scaleY: 1.3 }, { duration: 300 }); return true; } // Check if bird intersects with ground tile for immediate death if (bird.intersects(groundTiles[g])) { // Resize ground with tween effect tween(groundTiles[g], { scaleX: 1.3, scaleY: 1.3 }, { duration: 300 }); return true; } } // Check ceiling collision if (bird.y - 30 <= 0) { return true; } // Check pipe collisions for (var i = 0; i < pipes.length; i++) { var pipe = pipes[i]; // Simple collision detection with pipes - reduced hitbox for easier gameplay var birdLeft = bird.x - 20; // Reduced from 30 var birdRight = bird.x + 20; // Reduced from 30 var birdTop = bird.y - 15; // Reduced from 22 var birdBottom = bird.y + 15; // Reduced from 22 var pipeLeft = pipe.x - 60; var pipeRight = pipe.x + 60; if (birdRight > pipeLeft && birdLeft < pipeRight) { // Bird is within pipe's horizontal bounds var topPipeBottom = pipe.topPipe.y; var bottomPipeTop = pipe.bottomPipe.y; if (birdTop < topPipeBottom || birdBottom > bottomPipeTop) { return true; } } // Check if bird touches pipe - immediate death with resize effect if (bird.intersects(pipe.topPipe) || bird.intersects(pipe.bottomPipe)) { // Calculate current pipe scale and apply death effect scaling var currentTopScaleX = pipe.topPipe.scaleX || 1; var currentTopScaleY = pipe.topPipe.scaleY || 1; var currentBottomScaleX = pipe.bottomPipe.scaleX || 1; var currentBottomScaleY = pipe.bottomPipe.scaleY || 1; // Resize pipe with tween effect based on current size tween(pipe.topPipe, { scaleX: currentTopScaleX * 1.2, scaleY: currentTopScaleY * 1.2 }, { duration: 200 }); tween(pipe.bottomPipe, { scaleX: currentBottomScaleX * 1.2, scaleY: currentBottomScaleY * 1.2 }, { duration: 200 }); return true; } } return false; } function updateScore() { for (var i = 0; i < pipes.length; i++) { var pipe = pipes[i]; if (!pipe.scored && bird.x > pipe.x + 60) { pipe.scored = true; LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); // Update best score if current score is higher if (LK.getScore() > bestScore) { bestScore = LK.getScore(); storage.bestScore = bestScore; bestScoreTxt.setText('BEST: ' + bestScore); } LK.getSound('score').play(); } } } function cleanupPipes() { for (var i = pipes.length - 1; i >= 0; i--) { var pipe = pipes[i]; if (pipe.x < -120) { pipe.destroy(); pipes.splice(i, 1); } } } // Input handling game.down = function (x, y, obj) { if (!gameStarted) { startGame(); } else if (!gameOver) { bird.flap(); } }; // Main game loop game.update = function () { if (!gameStarted || gameOver) { return; } // Update bird bird.update(); // Spawn pipes pipeSpawnTimer++; var currentDelay = pipes.length === 0 ? initialPipeSpawnDelay : pipeSpawnDelay; if (pipeSpawnTimer >= currentDelay) { spawnPipe(); pipeSpawnTimer = 0; } // Spawn clouds cloudSpawnTimer++; if (cloudSpawnTimer >= cloudSpawnDelay) { spawnCloud(); cloudSpawnTimer = 0; } // Update clouds for (var c = 0; c < clouds.length; c++) { clouds[c].update(); } // Cleanup off-screen clouds for (var c = clouds.length - 1; c >= 0; c--) { var cloud = clouds[c]; if (cloud.x < -300) { cloud.destroy(); clouds.splice(c, 1); } } // Update pipes for (var i = 0; i < pipes.length; i++) { pipes[i].update(); } // Ground is now fixed in GUI layer, no scrolling needed // Check collisions if (checkCollisions()) { gameOver = true; LK.getSound('hit').play(); LK.showGameOver(); return; } // Update score updateScore(); // Cleanup off-screen pipes cleanupPipes(); };
===================================================================
--- original.js
+++ change.js
@@ -109,9 +109,9 @@
var ground;
var gameStarted = false;
var gameOver = false;
var pipeSpawnTimer = 0;
-var pipeSpawnDelay = 200; // Increased from 150 frames for more spacing
+var pipeSpawnDelay = 120; // Reduced from 200 frames for closer obstacles
var initialPipeSpawnDelay = 100; // Increased from 60 frames for better start
// UI elements
var scoreTxt = new Text2('0', {
size: 80,
@@ -120,9 +120,9 @@
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Best score display
var bestScore = storage.bestScore || 0;
-var bestScoreTxt = new Text2('BEST', {
+var bestScoreTxt = new Text2('BEST: ' + bestScore, {
size: 50,
fill: 0xFFFFFF
});
bestScoreTxt.anchor.set(1, 0);
@@ -273,9 +273,14 @@
if (!pipe.scored && bird.x > pipe.x + 60) {
pipe.scored = true;
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
- // Best score logic removed - text now shows just "BEST"
+ // Update best score if current score is higher
+ if (LK.getScore() > bestScore) {
+ bestScore = LK.getScore();
+ storage.bestScore = bestScore;
+ bestScoreTxt.setText('BEST: ' + bestScore);
+ }
LK.getSound('score').play();
}
}
}
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Flappy Bird" and with the description "Control a bird through pipe obstacles by tapping to flap and avoid crashing. Simple controls, challenging gameplay.". No text on banner!
vertical long pipe. In-Game asset. 2d. High contrast. No shadows
cloudy. In-Game asset. 2d. High contrast. No shadows