/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Barrier = Container.expand(function (height, position) { var self = Container.call(this); var barrierGraphics = self.attachAsset('barrier', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, // Make the barrier narrower scaleY: height / 980 // Scale to match desired height }); self.width = barrierGraphics.width * 0.1; // Update width based on scale self.height = height; self.position = position; self.speed = 5; self.scored = false; self.update = function () { self.x -= self.speed; // Remove barriers that are off screen if (self.x < -self.width) { self.destroy(); return true; // Signal to remove this barrier } return false; }; return self; }); var BarrierPair = Container.expand(function () { var self = Container.call(this); self.width = 100; self.gapHeight = 400; self.speed = 5; self.scored = false; // Randomly position the gap (top, middle, or bottom) var positions = [{ top: 0, gap: 800 }, // Top position { top: (2732 - self.gapHeight) / 2, gap: (2732 - self.gapHeight) / 2 }, // Middle position { top: 2732 - self.gapHeight, gap: 0 } // Bottom position ]; var randomPosition = positions[Math.floor(Math.random() * positions.length)]; // Create top barrier var topHeight = randomPosition.top; if (topHeight > 0) { var topBarrier = new Barrier(topHeight, "top"); topBarrier.x = 0; topBarrier.y = topHeight / 2; self.addChild(topBarrier); } // Create bottom barrier var bottomHeight = 2732 - randomPosition.top - self.gapHeight; if (bottomHeight > 0) { var bottomBarrier = new Barrier(bottomHeight, "bottom"); bottomBarrier.x = 0; bottomBarrier.y = 2732 - bottomHeight / 2; self.addChild(bottomBarrier); } // Create visual opening var opening = self.attachAsset('opening', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: self.gapHeight / 250 }); opening.x = 0; opening.y = randomPosition.top + self.gapHeight / 2; self.update = function () { self.x -= self.speed; // Remove barriers that are off screen if (self.x < -self.width) { self.destroy(); return true; // Signal to remove this barrier } return false; }; return self; }); var Fly = Container.expand(function () { var self = Container.call(this); var flyGraphics = self.attachAsset('fly', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8 }); self.velocity = 0; self.gravity = 0.7; self.flapStrength = -15; self.rotation = 0; self.isDead = false; self.flap = function () { if (self.isDead) { return; } self.velocity = self.flapStrength; LK.getSound('flap').play(); // Rotate the fly upward when flapping tween(self, { rotation: -0.5 }, { duration: 100 }); }; self.update = function () { if (self.isDead) { return; } // Apply gravity self.velocity += self.gravity; self.y += self.velocity; // Rotate the fly based on velocity if (self.velocity > 0) { var targetRotation = Math.min(self.velocity * 0.05, 1.2); self.rotation += (targetRotation - self.rotation) * 0.1; } // Boundaries check if (self.y < 0) { self.y = 0; self.velocity = 0; } if (self.y > 2732) { self.die(); } }; self.die = function () { if (self.isDead) { return; } self.isDead = true; LK.getSound('hit').play(); LK.effects.flashScreen(0xFF0000, 500); // Make the fly fall and rotate downward tween(self, { rotation: 1.5 }, { duration: 500 }); LK.setTimeout(function () { LK.showGameOver(); }, 1000); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var fly; var barriers = []; var isPlaying = false; var gameSpeed = 5; var spawnInterval = 120; var ticksSinceLastSpawn = 0; var score = 0; var highScore = storage.highScore || 0; // Set up score display var scoreTxt = new Text2('0', { size: 150, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Set up instructions text var instructionsTxt = new Text2('Tap to Start\nTap to flap, release to fall', { size: 80, fill: 0xFFFFFF }); instructionsTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(instructionsTxt); // Create the fly fly = new Fly(); fly.x = 500; fly.y = 2732 / 2; game.addChild(fly); // Start the game when the player taps function startGame() { if (isPlaying) { return; } isPlaying = true; score = 0; LK.setScore(score); scoreTxt.setText('0'); instructionsTxt.visible = false; // Reset fly position fly.y = 2732 / 2; fly.velocity = 0; fly.rotation = 0; fly.isDead = false; // Clear existing barriers for (var i = barriers.length - 1; i >= 0; i--) { barriers[i].destroy(); } barriers = []; // Play background music LK.playMusic('bgMusic'); } // Handle tap/click game.down = function (x, y, obj) { if (!isPlaying) { startGame(); } fly.flap(); // Play the Fisirti sound when fly moves LK.getSound('Fisirti').play(); }; // Create a new barrier function spawnBarrier() { var barrier = new BarrierPair(); barrier.x = 2048 + 100; // Start off-screen barrier.width = 100; // Set a fixed width for collision detection game.addChild(barrier); barriers.push(barrier); } // Game update loop game.update = function () { if (!isPlaying) { return; } // Update fly fly.update(); // Spawn new barriers ticksSinceLastSpawn++; if (ticksSinceLastSpawn >= spawnInterval) { spawnBarrier(); ticksSinceLastSpawn = 0; } // Update barriers and check collisions for (var i = barriers.length - 1; i >= 0; i--) { var barrier = barriers[i]; if (barrier.update()) { // Barrier is off-screen and has been destroyed barriers.splice(i, 1); continue; } // Check if fly passed the barrier to score if (!barrier.scored && barrier.x + barrier.width < fly.x) { barrier.scored = true; score++; LK.setScore(score); scoreTxt.setText(score.toString()); LK.getSound('score').play(); // Update high score if (score > highScore) { highScore = score; storage.highScore = highScore; } } // Check collision with barriers (all children) for (var j = 0; j < barrier.children.length; j++) { var child = barrier.children[j]; if (fly.intersects(child)) { fly.die(); isPlaying = false; // Stop background music when game ends LK.stopMusic(); break; } } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Barrier = Container.expand(function (height, position) {
var self = Container.call(this);
var barrierGraphics = self.attachAsset('barrier', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.1,
// Make the barrier narrower
scaleY: height / 980 // Scale to match desired height
});
self.width = barrierGraphics.width * 0.1; // Update width based on scale
self.height = height;
self.position = position;
self.speed = 5;
self.scored = false;
self.update = function () {
self.x -= self.speed;
// Remove barriers that are off screen
if (self.x < -self.width) {
self.destroy();
return true; // Signal to remove this barrier
}
return false;
};
return self;
});
var BarrierPair = Container.expand(function () {
var self = Container.call(this);
self.width = 100;
self.gapHeight = 400;
self.speed = 5;
self.scored = false;
// Randomly position the gap (top, middle, or bottom)
var positions = [{
top: 0,
gap: 800
},
// Top position
{
top: (2732 - self.gapHeight) / 2,
gap: (2732 - self.gapHeight) / 2
},
// Middle position
{
top: 2732 - self.gapHeight,
gap: 0
} // Bottom position
];
var randomPosition = positions[Math.floor(Math.random() * positions.length)];
// Create top barrier
var topHeight = randomPosition.top;
if (topHeight > 0) {
var topBarrier = new Barrier(topHeight, "top");
topBarrier.x = 0;
topBarrier.y = topHeight / 2;
self.addChild(topBarrier);
}
// Create bottom barrier
var bottomHeight = 2732 - randomPosition.top - self.gapHeight;
if (bottomHeight > 0) {
var bottomBarrier = new Barrier(bottomHeight, "bottom");
bottomBarrier.x = 0;
bottomBarrier.y = 2732 - bottomHeight / 2;
self.addChild(bottomBarrier);
}
// Create visual opening
var opening = self.attachAsset('opening', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: self.gapHeight / 250
});
opening.x = 0;
opening.y = randomPosition.top + self.gapHeight / 2;
self.update = function () {
self.x -= self.speed;
// Remove barriers that are off screen
if (self.x < -self.width) {
self.destroy();
return true; // Signal to remove this barrier
}
return false;
};
return self;
});
var Fly = Container.expand(function () {
var self = Container.call(this);
var flyGraphics = self.attachAsset('fly', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
self.velocity = 0;
self.gravity = 0.7;
self.flapStrength = -15;
self.rotation = 0;
self.isDead = false;
self.flap = function () {
if (self.isDead) {
return;
}
self.velocity = self.flapStrength;
LK.getSound('flap').play();
// Rotate the fly upward when flapping
tween(self, {
rotation: -0.5
}, {
duration: 100
});
};
self.update = function () {
if (self.isDead) {
return;
}
// Apply gravity
self.velocity += self.gravity;
self.y += self.velocity;
// Rotate the fly based on velocity
if (self.velocity > 0) {
var targetRotation = Math.min(self.velocity * 0.05, 1.2);
self.rotation += (targetRotation - self.rotation) * 0.1;
}
// Boundaries check
if (self.y < 0) {
self.y = 0;
self.velocity = 0;
}
if (self.y > 2732) {
self.die();
}
};
self.die = function () {
if (self.isDead) {
return;
}
self.isDead = true;
LK.getSound('hit').play();
LK.effects.flashScreen(0xFF0000, 500);
// Make the fly fall and rotate downward
tween(self, {
rotation: 1.5
}, {
duration: 500
});
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var fly;
var barriers = [];
var isPlaying = false;
var gameSpeed = 5;
var spawnInterval = 120;
var ticksSinceLastSpawn = 0;
var score = 0;
var highScore = storage.highScore || 0;
// Set up score display
var scoreTxt = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Set up instructions text
var instructionsTxt = new Text2('Tap to Start\nTap to flap, release to fall', {
size: 80,
fill: 0xFFFFFF
});
instructionsTxt.anchor.set(0.5, 0.5);
LK.gui.center.addChild(instructionsTxt);
// Create the fly
fly = new Fly();
fly.x = 500;
fly.y = 2732 / 2;
game.addChild(fly);
// Start the game when the player taps
function startGame() {
if (isPlaying) {
return;
}
isPlaying = true;
score = 0;
LK.setScore(score);
scoreTxt.setText('0');
instructionsTxt.visible = false;
// Reset fly position
fly.y = 2732 / 2;
fly.velocity = 0;
fly.rotation = 0;
fly.isDead = false;
// Clear existing barriers
for (var i = barriers.length - 1; i >= 0; i--) {
barriers[i].destroy();
}
barriers = [];
// Play background music
LK.playMusic('bgMusic');
}
// Handle tap/click
game.down = function (x, y, obj) {
if (!isPlaying) {
startGame();
}
fly.flap();
// Play the Fisirti sound when fly moves
LK.getSound('Fisirti').play();
};
// Create a new barrier
function spawnBarrier() {
var barrier = new BarrierPair();
barrier.x = 2048 + 100; // Start off-screen
barrier.width = 100; // Set a fixed width for collision detection
game.addChild(barrier);
barriers.push(barrier);
}
// Game update loop
game.update = function () {
if (!isPlaying) {
return;
}
// Update fly
fly.update();
// Spawn new barriers
ticksSinceLastSpawn++;
if (ticksSinceLastSpawn >= spawnInterval) {
spawnBarrier();
ticksSinceLastSpawn = 0;
}
// Update barriers and check collisions
for (var i = barriers.length - 1; i >= 0; i--) {
var barrier = barriers[i];
if (barrier.update()) {
// Barrier is off-screen and has been destroyed
barriers.splice(i, 1);
continue;
}
// Check if fly passed the barrier to score
if (!barrier.scored && barrier.x + barrier.width < fly.x) {
barrier.scored = true;
score++;
LK.setScore(score);
scoreTxt.setText(score.toString());
LK.getSound('score').play();
// Update high score
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
}
}
// Check collision with barriers (all children)
for (var j = 0; j < barrier.children.length; j++) {
var child = barrier.children[j];
if (fly.intersects(child)) {
fly.die();
isPlaying = false;
// Stop background music when game ends
LK.stopMusic();
break;
}
}
}
};