/****
* 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;
}
}
}
};