User prompt
Reduce character speed to half
User prompt
Let this newly added money be a separate entity
User prompt
Let this newly added currency be different from other currencies.
User prompt
Some pipes have different coins, these give 5 coins
User prompt
Let there be an icon on the side of the screen that shows how much money we have
User prompt
Don't let the coins move
User prompt
put collectible coins between the pipes
User prompt
Let's earn points for each pass through the pipes
Code edit (1 edits merged)
Please save this source code
User prompt
Flappy Flight
Initial prompt
flappy bird
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Bird class
var Bird = Container.expand(function () {
var self = Container.call(this);
// Attach bird asset (ellipse, yellow)
var birdAsset = self.attachAsset('bird', {
anchorX: 0.5,
anchorY: 0.5
});
// Set up bird asset properties
birdAsset.width = 120;
birdAsset.height = 120;
birdAsset.color = 0xffe066;
birdAsset.shape = 'ellipse';
// Bird physics
self.velocityY = 0;
self.gravity = 1.5; // Gravity per frame
self.flapStrength = -28; // Negative for upward movement
// Bird update method (called every tick)
self.update = function () {
self.velocityY += self.gravity;
self.y += self.velocityY;
// Clamp bird to not go above the screen
if (self.y < self.height / 2) {
self.y = self.height / 2;
self.velocityY = 0;
}
};
// Flap method
self.flap = function () {
self.velocityY = self.flapStrength;
};
return self;
});
// Coin class
var Coin = Container.expand(function () {
var self = Container.call(this);
// Attach coin asset (ellipse, gold)
var coinAsset = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5,
width: 100,
height: 100,
color: 0xffd700,
shape: 'ellipse',
x: 0,
y: 0
});
self.collected = false;
// Coin update: move left at pipe speed
self.update = function (speed) {
self.x -= speed;
};
return self;
});
// PipePair class (top and bottom pipes as a pair)
var PipePair = Container.expand(function () {
var self = Container.call(this);
// Pipe properties
self.pipeWidth = 220;
self.gapHeight = 520; // Vertical gap between pipes
self.speed = 12; // Speed at which pipes move left
// Randomize gap position
var minGapY = 400;
var maxGapY = 2732 - 400 - self.gapHeight;
self.gapY = minGapY + Math.floor(Math.random() * (maxGapY - minGapY + 1));
// Top pipe
self.topPipe = self.attachAsset('pipeTop', {
anchorX: 0.5,
anchorY: 1.0,
width: self.pipeWidth,
height: self.gapY,
color: 0x4ec04e,
shape: 'box',
x: 0,
y: self.gapY
});
// Bottom pipe
self.bottomPipe = self.attachAsset('pipeBottom', {
anchorX: 0.5,
anchorY: 0.0,
width: self.pipeWidth,
height: 2732 - (self.gapY + self.gapHeight),
color: 0x4ec04e,
shape: 'box',
x: 0,
y: self.gapY + self.gapHeight
});
// Scoring flag (to ensure only one score per pipe pair)
self.scored = false;
// Add coin between pipes
self.coin = new Coin();
// Place coin in the center of the gap
self.coin.x = 0;
self.coin.y = self.gapY + self.gapHeight / 2;
self.addChild(self.coin);
// Update method
self.update = function () {
self.x -= self.speed;
// Move coin with pipes
if (self.coin && !self.coin.collected) {
self.coin.update(self.speed);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb // Sky blue
});
/****
* Game Code
****/
// Game constants
// Tween plugin for animations (optional, not used in MVP but included for future use)
var GROUND_HEIGHT = 220;
var PIPE_INTERVAL = 90; // Frames between pipes (1.5s at 60fps)
var BIRD_START_X = 600;
var BIRD_START_Y = 1200;
// Game state variables
var bird;
var pipes = [];
var score = 0;
var scoreTxt;
var ground;
var gameStarted = false;
var gameOver = false;
var ticksSinceLastPipe = 0;
// Add ground (simple green box at bottom)
ground = LK.getAsset('ground', {
anchorX: 0,
anchorY: 0,
width: 2048,
height: GROUND_HEIGHT,
color: 0x3b7a2a,
shape: 'box',
x: 0,
y: 2732 - GROUND_HEIGHT
});
game.addChild(ground);
// Add bird
bird = new Bird();
bird.x = BIRD_START_X;
bird.y = BIRD_START_Y;
game.addChild(bird);
// Add score text to GUI
scoreTxt = new Text2('0', {
size: 180,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Helper: Reset game state
function resetGame() {
// Remove all pipes
for (var i = 0; i < pipes.length; i++) {
pipes[i].destroy();
}
pipes = [];
score = 0;
scoreTxt.setText('0');
bird.x = BIRD_START_X;
bird.y = BIRD_START_Y;
bird.velocityY = 0;
gameStarted = false;
gameOver = false;
ticksSinceLastPipe = 0;
}
// Helper: Start game (first flap)
function startGame() {
if (!gameStarted && !gameOver) {
gameStarted = true;
}
}
// Helper: End game
function endGame() {
gameOver = true;
LK.effects.flashScreen(0xff0000, 600);
LK.showGameOver();
}
// Game tap/flap handler
game.down = function (x, y, obj) {
if (gameOver) return;
if (!gameStarted) {
startGame();
}
bird.flap();
};
// Main game update loop
game.update = function () {
if (gameOver) return;
// Only update bird and pipes if game started
if (gameStarted) {
bird.update();
// Add new pipes at interval
ticksSinceLastPipe++;
if (ticksSinceLastPipe >= PIPE_INTERVAL) {
ticksSinceLastPipe = 0;
var pipePair = new PipePair();
pipePair.x = 2048 + pipePair.pipeWidth / 2;
pipePair.y = 0;
pipes.push(pipePair);
game.addChild(pipePair);
}
// Update pipes and check for collisions
for (var i = pipes.length - 1; i >= 0; i--) {
var pipe = pipes[i];
pipe.update();
// Remove pipes that have gone off screen
if (pipe.x < -pipe.pipeWidth / 2) {
pipe.destroy();
pipes.splice(i, 1);
continue;
}
// Collision detection (bird with pipes)
// Use .intersects for both top and bottom pipes
if (bird.intersects(pipe.topPipe) || bird.intersects(pipe.bottomPipe)) {
endGame();
return;
}
// Coin collection
if (pipe.coin && !pipe.coin.collected && bird.intersects(pipe.coin)) {
pipe.coin.collected = true;
pipe.coin.visible = false;
score += 5; // Award 5 points for coin
scoreTxt.setText(score + '');
}
// Scoring: if bird passes the center of the pipe and hasn't scored yet
if (!pipe.scored && pipe.x + pipe.pipeWidth / 2 < bird.x - bird.width / 2) {
pipe.scored = true;
score += 1;
scoreTxt.setText(score + '');
}
}
// Collision with ground
if (bird.y + bird.height / 2 >= 2732 - GROUND_HEIGHT) {
bird.y = 2732 - GROUND_HEIGHT - bird.height / 2;
endGame();
return;
}
}
};
// Reset game on game over (handled by LK automatically, but for clarity)
game.onGameOver = function () {
resetGame();
};
// Initial reset
resetGame(); ===================================================================
--- original.js
+++ change.js
@@ -38,8 +38,29 @@
self.velocityY = self.flapStrength;
};
return self;
});
+// Coin class
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach coin asset (ellipse, gold)
+ var coinAsset = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ width: 100,
+ height: 100,
+ color: 0xffd700,
+ shape: 'ellipse',
+ x: 0,
+ y: 0
+ });
+ self.collected = false;
+ // Coin update: move left at pipe speed
+ self.update = function (speed) {
+ self.x -= speed;
+ };
+ return self;
+});
// PipePair class (top and bottom pipes as a pair)
var PipePair = Container.expand(function () {
var self = Container.call(this);
// Pipe properties
@@ -73,11 +94,21 @@
y: self.gapY + self.gapHeight
});
// Scoring flag (to ensure only one score per pipe pair)
self.scored = false;
+ // Add coin between pipes
+ self.coin = new Coin();
+ // Place coin in the center of the gap
+ self.coin.x = 0;
+ self.coin.y = self.gapY + self.gapHeight / 2;
+ self.addChild(self.coin);
// Update method
self.update = function () {
self.x -= self.speed;
+ // Move coin with pipes
+ if (self.coin && !self.coin.collected) {
+ self.coin.update(self.speed);
+ }
};
return self;
});
@@ -90,10 +121,10 @@
/****
* Game Code
****/
-// Tween plugin for animations (optional, not used in MVP but included for future use)
// Game constants
+// Tween plugin for animations (optional, not used in MVP but included for future use)
var GROUND_HEIGHT = 220;
var PIPE_INTERVAL = 90; // Frames between pipes (1.5s at 60fps)
var BIRD_START_X = 600;
var BIRD_START_Y = 1200;
@@ -197,17 +228,21 @@
if (bird.intersects(pipe.topPipe) || bird.intersects(pipe.bottomPipe)) {
endGame();
return;
}
- // Scoring: award point at the exact moment bird passes the pipe's center using lastX tracking
- if (pipe.lastX === undefined) pipe.lastX = pipe.x;
- var pipePassX = bird.x - bird.width / 2 - pipe.pipeWidth / 2;
- if (!pipe.scored && pipe.lastX >= pipePassX && pipe.x < pipePassX) {
+ // Coin collection
+ if (pipe.coin && !pipe.coin.collected && bird.intersects(pipe.coin)) {
+ pipe.coin.collected = true;
+ pipe.coin.visible = false;
+ score += 5; // Award 5 points for coin
+ scoreTxt.setText(score + '');
+ }
+ // Scoring: if bird passes the center of the pipe and hasn't scored yet
+ if (!pipe.scored && pipe.x + pipe.pipeWidth / 2 < bird.x - bird.width / 2) {
pipe.scored = true;
score += 1;
scoreTxt.setText(score + '');
}
- pipe.lastX = pipe.x;
}
// Collision with ground
if (bird.y + bird.height / 2 >= 2732 - GROUND_HEIGHT) {
bird.y = 2732 - GROUND_HEIGHT - bird.height / 2;
a pixel art coin. In-Game asset. 2d. High contrast. pixel
a bird like flappy bird but they are not same In-Game asset. 2d. High contrast. pixel
green grass ground. In-Game asset. 2d. High contrast. pixel no shadow
a beautiful sky. pixel In-Game asset. 2d. High contrast. No shadows
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Flappy Flight" and with the description "Guide a bird through gaps in pipes by tapping to flap and avoid obstacles. Score points for each successful pass.". No text on banner! pixel
a long mario pipeTop. pixel PIPE TOP In-Game asset. 2d. High contrast. No shadows
a pixel bird head. In-Game asset. 2d. High contrast. No shadows
Shop background. In-Game asset. 2d. High contrast. No shadows