/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Background = Container.expand(function () {
var self = Container.call(this);
// Create sky
var sky = self.attachAsset('sky', {
anchorX: 0,
anchorY: 0
});
// Create scrolling ground
var ground1 = self.attachAsset('ground', {
anchorX: 0,
anchorY: 0
});
var ground2 = self.attachAsset('ground', {
anchorX: 0,
anchorY: 0
});
// Position ground at bottom of screen
ground1.y = 2732 - ground1.height;
ground2.y = 2732 - ground2.height;
ground2.x = ground1.width;
self.ground1 = ground1;
self.ground2 = ground2;
self.groundY = ground1.y;
// Update ground scroll effect
self.update = function () {
if (game.gameActive) {
// Scroll ground
ground1.x -= 5;
ground2.x -= 5;
// Loop ground tiles
if (ground1.x <= -ground1.width) {
ground1.x = ground2.x + ground2.width;
}
if (ground2.x <= -ground2.width) {
ground2.x = ground1.x + ground1.width;
}
}
};
return self;
});
var Bird = Container.expand(function () {
var self = Container.call(this);
// Bird graphics
var birdGraphics = self.attachAsset('bird', {
anchorX: 0.5,
anchorY: 0.5
});
// Bird physics
self.velocity = 0;
self.gravity = 0.5;
self.flapPower = -10;
self.rotation = 0;
self.isDead = false;
self.lastY = 0;
// Flap the bird's wings (jump)
self.flap = function () {
if (self.isDead) return;
self.velocity = self.flapPower;
LK.getSound('flap').play();
// Animate rotation upward
tween(self, {
rotation: -0.3
}, {
duration: 100,
easing: tween.easeOut
});
};
// Update bird position and physics
self.update = function () {
self.lastY = self.y;
if (!self.isDead) {
// Apply gravity
self.velocity += self.gravity;
self.y += self.velocity;
// Rotate bird based on velocity
if (self.velocity > 0) {
var targetRotation = Math.min(Math.PI / 2, self.velocity * 0.05);
tween(self, {
rotation: targetRotation
}, {
duration: 200,
easing: tween.linear
});
}
}
};
// Handle bird death
self.die = function () {
if (self.isDead) return;
self.isDead = true;
LK.getSound('hit').play();
// Animate death (fall with rotation)
tween(self, {
rotation: Math.PI / 2
}, {
duration: 500,
easing: tween.easeIn
});
};
return self;
});
var Pipe = Container.expand(function () {
var self = Container.call(this);
// Pipe properties
self.speed = 5;
self.passed = false;
self.lastX = 0;
// Create top and bottom pipes
self.init = function (gapY, gapHeight) {
// Top pipe
var topPipe = self.attachAsset('pipe', {
anchorX: 0.5,
anchorY: 1.0 // Bottom anchor
});
topPipe.y = gapY - gapHeight / 2;
// Bottom pipe
var bottomPipe = self.attachAsset('pipe', {
anchorX: 0.5,
anchorY: 0.0 // Top anchor
});
bottomPipe.y = gapY + gapHeight / 2;
// Store references
self.topPipe = topPipe;
self.bottomPipe = bottomPipe;
};
// Update pipe position
self.update = function () {
self.lastX = self.x;
self.x -= self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Set background color
game.setBackgroundColor(0x87CEEB);
// Game variables
var pipes = [];
var pipeSpawnInterval = 90; // In ticks (frames)
var gapHeight = 300; // Gap between pipes
var score = 0;
var gameStarted = false;
var gameActive = true;
game.gameActive = gameActive; // Make it accessible to other classes
// Create background
var background = new Background();
game.addChild(background);
// Create bird
var bird = new Bird();
bird.x = 400;
bird.y = 2732 / 2;
game.addChild(bird);
// Create score text
var scoreText = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
scoreText.y = 100;
scoreText.x = 2048 / 2;
LK.gui.top.addChild(scoreText);
// Create tap to start text
var startText = new Text2('TAP TO START', {
size: 100,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startText.x = 2048 / 2;
startText.y = 2732 / 2;
LK.gui.center.addChild(startText);
// Create flash overlay for game over
var flashOverlay = LK.getAsset('flash', {
anchorX: 0,
anchorY: 0,
alpha: 0
});
game.addChild(flashOverlay);
// Game event handlers
game.down = function (x, y, obj) {
if (!gameStarted) {
// First tap starts the game
gameStarted = true;
startText.visible = false;
}
if (gameActive) {
bird.flap();
}
};
// Spawn a new pipe pair
function spawnPipe() {
var pipe = new Pipe();
// Random gap position between pipes (constrained to middle 60% of screen)
var minY = 2732 * 0.2;
var maxY = 2732 * 0.8 - background.ground1.height;
var gapY = minY + Math.random() * (maxY - minY);
pipe.init(gapY, gapHeight);
pipe.x = 2048 + 100;
pipes.push(pipe);
game.addChild(pipe);
}
// Check collisions
function checkCollisions() {
// Ground collision
if (bird.y + bird.height / 2 >= background.groundY) {
bird.y = background.groundY - bird.height / 2;
gameOver();
return;
}
// Ceiling collision
if (bird.y - bird.height / 2 <= 0) {
bird.y = bird.height / 2;
bird.velocity = 0;
}
// Pipe collisions
for (var i = 0; i < pipes.length; i++) {
var pipe = pipes[i];
if (bird.intersects(pipe.topPipe) || bird.intersects(pipe.bottomPipe)) {
gameOver();
return;
}
// Score when passing pipe
if (!pipe.passed && pipe.lastX > bird.x && pipe.x <= bird.x) {
pipe.passed = true;
score++;
LK.setScore(score);
scoreText.setText(score.toString());
LK.getSound('score').play();
}
}
}
// Game over handling
function gameOver() {
if (!gameActive) return;
gameActive = false;
game.gameActive = false;
bird.die();
// Flash effect
flashOverlay.alpha = 0.8;
tween(flashOverlay, {
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
// Show game over after flash
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
});
}
// Main game update loop
game.update = function () {
if (!gameStarted) return;
// Update bird
bird.update();
if (gameActive) {
// Spawn pipes at interval
if (LK.ticks % pipeSpawnInterval === 0) {
spawnPipe();
}
// Update pipes
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 < -150) {
pipe.destroy();
pipes.splice(i, 1);
}
}
// Check for collisions
checkCollisions();
}
// Update background
background.update();
}; ===================================================================
--- original.js
+++ change.js
@@ -45,9 +45,8 @@
}
};
return self;
});
-// Set background color
var Bird = Container.expand(function () {
var self = Container.call(this);
// Bird graphics
var birdGraphics = self.attachAsset('bird', {
@@ -150,18 +149,8 @@
/****
* Game Code
****/
// Set background color
-/*
-* Assets
-*/
-// Bird character
-// Pipe obstacle (top and bottom)
-// Background ground
-// Sky background
-// Game over flash effect
-// Sound effects
-// Import tween plugin for animations
game.setBackgroundColor(0x87CEEB);
// Game variables
var pipes = [];
var pipeSpawnInterval = 90; // In ticks (frames)