/**** * Classes ****/ // Boat class var Boat = Container.expand(function () { var self = Container.call(this); var boatGraphics = self.attachAsset('boat', { anchorX: 0.5, anchorY: 0.5 }); boatGraphics.alpha = 0.8; // Set opacity to 80% self.speed = -0.75; // Slow the boat by half its speed self.update = function () { self.x += self.speed; if (self.x < -boatGraphics.width) { self.destroy(); // Destroy the boat when it goes off screen } }; }); // City class var City = Container.expand(function () { var self = Container.call(this); var cityGraphics = self.attachAsset('cityTile', { anchorX: 0.5, anchorY: 0.5, scaleX: 5, scaleY: 5 }); cityGraphics.alpha = 0.2; // Set opacity to 20% self.speed = -0.1; // Move from right to left, half the ocean speed self.update = function () { self.x += self.speed; if (self.x < -cityGraphics.width) { self.x = 2048; // Reset position to the right } }; }); // Cloud class var Cloud = Container.expand(function () { var self = Container.call(this); var cloudGraphics = self.attachAsset('cloud', { anchorX: 0.5, anchorY: 0.5, scaleX: 5, scaleY: 5 }); cloudGraphics.alpha = 0.4; // Set opacity to 30% self.speed = -1; // Move from right to left self.update = function () { self.x += self.speed; if (self.x < -cloudGraphics.width) { self.x = 2048 + cloudGraphics.width; // Reset position to the right } }; }); // Fish class var Fish = Container.expand(function () { var self = Container.call(this); var fishGraphics = self.attachAsset('pelican', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); fishGraphics.alpha = 0.8; // Set alpha to 80% opaque self.speed = 2; self.direction = 1; // 1 for right, -1 for left self.update = function () { self.x += self.speed * self.direction; if (self.x > 2048 || self.x < 0) { self.direction *= -1; // Change direction fishGraphics.scale.x *= -1; // Flip the direction of the image } }; }); // The assets will be automatically created and loaded by the LK engine // Jet class var Jet = Container.expand(function () { var self = Container.call(this); var jetGraphics = self.attachAsset('jet', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.25, scaleY: 1.25 }); self.speed = 15; self.update = function () { self.x -= self.speed; if (self.x < -100) { self.destroy(); } }; }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self.update = function () { self.x += self.speed; self.children.forEach(function (child) { if (child instanceof Text2) { child.x = self.x; } }); if (self.x < -100) { self.destroy(); } }; self.createPipe = function (gapY, gapHeight) { var topPipe = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 1.0, height: gapY }); var bottomPipe = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 0.0, y: gapY + gapHeight, height: 2732 - (gapY + gapHeight) }); self.addChild(topPipe); self.addChild(bottomPipe); }; }); // Pelican class var Pelican = Container.expand(function () { var self = Container.call(this); var pelicanGraphics = self.attachAsset('pelicanSVG', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 0; self.update = function () { self.speed += 0.5; // Gravity effect self.y += self.speed; if (self.y < 0) { self.y = 0; } if (self.y > 2732) { LK.effects.flashScreen(0xff0000, 1000); LK.stopMusic(); LK.stopMusic(); LK.showGameOver(); } // Rotate pelican clockwise as it falls if (self.speed > 0) { pelicanGraphics.rotation += 0.025; // Rotate clockwise at half speed if (pelicanGraphics.rotation > Math.PI / 2) { pelicanGraphics.rotation = Math.PI / 2; // Limit rotation to face straight down } // Apply the same rotation logic to the flap image if it exists if (self.flapImage) { self.flapImage.rotation = pelicanGraphics.rotation; } } // Check if pelican is in the ocean layer if (self.y > 2732 * 0.8) { pelicanGraphics.alpha = 0.8; // Set to 80% opaque if (self.y < 2732 * 0.8 + 10) { // Check if pelican is at the top part of the ocean layer createSplashEffect(self.x, self.y); } } else { pelicanGraphics.alpha = 1; // Set to fully opaque } }; self.dive = function () { self.speed = 10; // Increase speed for diving }; self.fly = function () { self.speed = -15; // Increase upward speed for flying pelicanGraphics.rotation = 0; // Reset rotation }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Add instructions text at the start of the game var instructionsText = new Text2('Tap to fly, avoid obstacles, and catch fish!', { size: 100, fill: "#ffffff", stroke: "#000000", strokeThickness: 6 }); instructionsText.anchor.set(0.5, 0.5); instructionsText.x = 2048 / 2; instructionsText.y = 2732 / 2 - 500; game.addChild(instructionsText); // Remove the instructions text after 5 seconds LK.setTimeout(function () { instructionsText.destroy(); }, 5000); // Initialize city layers to create a continuous loop similar to the ocean var city1 = game.addChild(new City()); city1.x = 0; city1.y = 2732 * 0.8 - city1.height / 2 + 155; // Consolidated vertical position adjustment var city2 = game.addChild(new City()); city2.y = 2732 * 0.8 - city2.height / 2 + 155; // Consolidated vertical position adjustment city2.x = 2048; // Offset the second city to create a continuous loop // Initialize cloud layers with random heights var cloud1 = game.addChild(new Cloud()); cloud1.x = 2048 / 2; cloud1.y = Math.random() * 2732 * 0.5; // Random height within the top half var cloud2 = game.addChild(new Cloud()); cloud2.x = 2048 / 2 + 1024; // Offset the second cloud cloud2.y = Math.random() * 2732 * 0.5; // Random height within the top half function createSplashEffect(x, y) { var splash = LK.getAsset('splash', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 3 }); splash.x = x; splash.y = y; splash.alpha = 1; splash.update = function () { this.alpha -= 0.05; // Fade out the splash if (this.alpha <= 0) { this.destroy(); } }; LK.getSound('splash').play(); // Play splash sound game.addChild(splash); } game.pipesPassed = 0; game.jetsAppear = false; // Forest green color // No start screen, game begins immediately // Forest green color for pipes // Forest green color for pipes // Add a light blue layer at the bottom 20% of the screen var bottomLayer1 = LK.getAsset('ocean', { width: 2048, height: 2732 * 0.2, color: 0xADD8E6, anchorX: 0.5, anchorY: 0.0 }); bottomLayer1.x = 2048 / 2; bottomLayer1.y = 2732 * 0.8; game.addChild(city1); game.addChild(city2); game.addChild(bottomLayer1); var bottomLayer2 = LK.getAsset('ocean', { width: 2048, height: 2732 * 0.2, color: 0xADD8E6, anchorX: 0.5, anchorY: 0.0 }); bottomLayer2.x = 2048 / 2 + 2048; bottomLayer2.y = 2732 * 0.8; game.addChild(bottomLayer2); var scoreTxt = new Text2('0', { size: 150, fill: "#ffffff", stroke: "#000000", strokeThickness: 8 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var pelican = game.addChild(new Pelican()); var lastPelicanPosition = { x: pelican.x, y: pelican.y }; var fish = game.addChild(new Fish()); fish.x = 1024; // Start in the middle of the screen fish.y = 2732 * 0.9; // Position in the bottom layer pelican.speed = 0; // Initial speed pelican.x = 500; pelican.y = 1366; var obstacles = []; var oceanSwayDirection = 1; var oceanSwaySpeed = 0.5; var noMovementText = new Text2('Avoid the posts🚪\nCatch the fish🐟\nDodge the crows🦅', { size: 150, fill: "#ffffff", stroke: "#000000", strokeThickness: 8 }); noMovementText.anchor.set(0.5, 0.5); noMovementText.x = 2048 / 2; noMovementText.y = 2732 / 2; noMovementText.visible = false; game.addChild(noMovementText); var lastPelicanPosition = { x: pelican.x, y: pelican.y }; game.update = function () { // Check for movement var allObstaclesMotionless = obstacles.every(function (obstacle) { return obstacle.speed === 0; }); if (pelican.x === lastPelicanPosition.x && pelican.y === lastPelicanPosition.y && allObstaclesMotionless) { noMovementText.visible = true; } else { noMovementText.visible = false; } lastPelicanPosition.x = pelican.x; lastPelicanPosition.y = pelican.y; // Add a gentle sway to the ocean layer bottomLayer1.x -= oceanSwaySpeed * 0.2; bottomLayer2.x -= oceanSwaySpeed * 0.2; if (bottomLayer1.x < -2048 / 2) { bottomLayer1.x = bottomLayer2.x + 2048; } if (bottomLayer2.x < -2048 / 2) { bottomLayer2.x = bottomLayer1.x + 2048; } bottomLayer1.y += oceanSwaySpeed * oceanSwayDirection * 0.5; bottomLayer2.y += oceanSwaySpeed * oceanSwayDirection * 0.5; if (bottomLayer1.y > 2732 * 0.8 + 0.5 || bottomLayer1.y < 2732 * 0.8 - 0.5) { oceanSwayDirection *= -1; } if (LK.ticks % 400 == 0 && !game.jetsAppear) { var newObstacle = new Obstacle(); newObstacle.x = 2048; var gapY = Math.random() * (2000 - 600); // Random gap position var pelicanHeight = LK.getAsset('pelican', {}).height; var maxGapHeight = pelicanHeight * 10; var initialGapHeight = 2000 * 0.5; // Increase the initial gap height to create a very large gap var minGapHeight = initialGapHeight / 2; var gapHeight = Math.max(minGapHeight, Math.min(initialGapHeight, maxGapHeight) - LK.getScore() * 0.1); // Decrease gapHeight over time but not less than half its initial size newObstacle.createPipe(gapY, gapHeight); obstacles.push(newObstacle); game.addChild(newObstacle); game.pipesPassed++; if (game.pipesPassed % 8 == 0 && !game.jetsAppear) { game.jetsAppear = true; game.jetsTimer = 0; LK.getSound('alert').play(); } } for (var i = obstacles.length - 1; i >= 0; i--) { if (obstacles[i].x < -50) { obstacles[i].destroy(); obstacles.splice(i, 1); LK.setScore(LK.getScore() + 1); // Add 1 point to the score scoreTxt.setText(LK.getScore()); // Update the score text } if (obstacles[i] instanceof Obstacle && pelican.intersects(obstacles[i])) { LK.effects.flashScreen(0xff0000, 1000); LK.stopMusic(); LK.getSound('arcadefail').play(); LK.showGameOver(); } fish.update(); cloud1.update(); cloud2.update(); city1.update(); city2.update(); if (pelican.intersects(fish)) { fish.destroy(); fish = game.addChild(new Fish()); fish.x = 1024; // Reset fish position fish.y = 2732 * 0.9; LK.setScore(LK.getScore() + 10); // Add 10 points to the score scoreTxt.setText(LK.getScore()); // Update the score text LK.getSound('specialscore1').play(); // Play the sound Special Score 1 // Create and display a new unique graphic when the fish is eaten var yumGraphic = LK.getAsset('yumGraphic', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); yumGraphic.x = pelican.x; yumGraphic.y = pelican.y; yumGraphic.alpha = 1; yumGraphic.update = function () { this.y -= 2; // Move the graphic upwards this.alpha -= 0.02; // Fade out the graphic if (this.alpha <= 0) { this.destroy(); } }; game.addChild(yumGraphic); // Create and display the "+10" text var plusTenText = new Text2('+10', { size: 150, fill: "#000000", stroke: "#ffffff", strokeThickness: 8 }); plusTenText.anchor.set(0.5, 0); plusTenText.x = pelican.x; plusTenText.y = pelican.y - 300; // Position it higher above the "YUM" graphic plusTenText.alpha = 1; plusTenText.update = function () { this.y -= 2; // Move the text upwards this.alpha -= 0.02; // Fade out the text if (this.alpha <= 0) { this.destroy(); } }; game.addChild(plusTenText); } // Add a boat every 30 seconds if (LK.ticks % 1800 == 0) { // 1800 ticks = 30 seconds at 60 FPS var newBoat = new Boat(); newBoat.x = 2048 + newBoat.width; // Start from the right side of the screen newBoat.y = 2732 * 0.8 - 30; // Move the boat up by another 10 pixels game.addChild(newBoat); } // Add the jet to the game if (game.jetsAppear) { game.jetsTimer++; if (game.jetsTimer >= 300) { // 5 seconds have passed game.jetsAppear = false; } else if (LK.ticks % 60 == 0) { // Every second if (game.jetsTimer == 0) { // When the first jet appears // Play the alert sound LK.getSound('alert').play(); var crowsText = new Text2('CROWS!', { size: 200, fill: "#ffffff" }); crowsText.anchor.set(0.5, 0.5); crowsText.x = 2048 / 2; crowsText.y = 2732 / 2; game.addChild(crowsText); // Remove the "CROWS!" text after 2 seconds LK.setTimeout(function () { crowsText.destroy(); }, 2000); } for (var i = 0; i < 3; i++) { var newJet = new Jet(); newJet.x = 2048 + i * 500; // Start from the right side of the screen and spread out the jets newJet.y = Math.random() * 2732; // Random y position game.addChild(newJet); } } } // Check for collision with the jet for (var i = game.children.length - 1; i >= 0; i--) { if (game.children[i] instanceof Jet && pelican.intersects(game.children[i])) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } // Increment score for every two seconds the pelican stays alive if (LK.ticks % 120 == 0) { LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); } } }; game.down = function (x, y, obj) { pelican.fly(); LK.getSound('flap').play(); // Create and display the "FLAP" image var flapImage = LK.getAsset('flapImage', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); flapImage.x = pelican.x; flapImage.y = pelican.y; flapImage.alpha = 1; // Ensure the flap image is fully opaque flapImage.update = function () { this.alpha -= 0.1; // Fade out the image more quickly to last about a quarter second this.rotation = pelican.rotation; // Ensure the flap image rotates with the pelican if (this.alpha <= 0) { this.destroy(); pelican.visible = true; // Make the pelican visible again } }; pelican.flapImage = flapImage; // Store reference to flap image for rotation game.addChild(flapImage); pelican.visible = false; // Hide the pelican when the flap image is on screen }; game.up = function (x, y, obj) { // No action needed on mouse up }; // Start the music when the game begins LK.playMusic('soundtrack', { volume: 0.3 });
/****
* Classes
****/
// Boat class
var Boat = Container.expand(function () {
var self = Container.call(this);
var boatGraphics = self.attachAsset('boat', {
anchorX: 0.5,
anchorY: 0.5
});
boatGraphics.alpha = 0.8; // Set opacity to 80%
self.speed = -0.75; // Slow the boat by half its speed
self.update = function () {
self.x += self.speed;
if (self.x < -boatGraphics.width) {
self.destroy(); // Destroy the boat when it goes off screen
}
};
});
// City class
var City = Container.expand(function () {
var self = Container.call(this);
var cityGraphics = self.attachAsset('cityTile', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 5,
scaleY: 5
});
cityGraphics.alpha = 0.2; // Set opacity to 20%
self.speed = -0.1; // Move from right to left, half the ocean speed
self.update = function () {
self.x += self.speed;
if (self.x < -cityGraphics.width) {
self.x = 2048; // Reset position to the right
}
};
});
// Cloud class
var Cloud = Container.expand(function () {
var self = Container.call(this);
var cloudGraphics = self.attachAsset('cloud', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 5,
scaleY: 5
});
cloudGraphics.alpha = 0.4; // Set opacity to 30%
self.speed = -1; // Move from right to left
self.update = function () {
self.x += self.speed;
if (self.x < -cloudGraphics.width) {
self.x = 2048 + cloudGraphics.width; // Reset position to the right
}
};
});
// Fish class
var Fish = Container.expand(function () {
var self = Container.call(this);
var fishGraphics = self.attachAsset('pelican', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
fishGraphics.alpha = 0.8; // Set alpha to 80% opaque
self.speed = 2;
self.direction = 1; // 1 for right, -1 for left
self.update = function () {
self.x += self.speed * self.direction;
if (self.x > 2048 || self.x < 0) {
self.direction *= -1; // Change direction
fishGraphics.scale.x *= -1; // Flip the direction of the image
}
};
});
// The assets will be automatically created and loaded by the LK engine
// Jet class
var Jet = Container.expand(function () {
var self = Container.call(this);
var jetGraphics = self.attachAsset('jet', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.25,
scaleY: 1.25
});
self.speed = 15;
self.update = function () {
self.x -= self.speed;
if (self.x < -100) {
self.destroy();
}
};
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -5;
self.update = function () {
self.x += self.speed;
self.children.forEach(function (child) {
if (child instanceof Text2) {
child.x = self.x;
}
});
if (self.x < -100) {
self.destroy();
}
};
self.createPipe = function (gapY, gapHeight) {
var topPipe = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 1.0,
height: gapY
});
var bottomPipe = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.0,
y: gapY + gapHeight,
height: 2732 - (gapY + gapHeight)
});
self.addChild(topPipe);
self.addChild(bottomPipe);
};
});
// Pelican class
var Pelican = Container.expand(function () {
var self = Container.call(this);
var pelicanGraphics = self.attachAsset('pelicanSVG', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 0;
self.update = function () {
self.speed += 0.5; // Gravity effect
self.y += self.speed;
if (self.y < 0) {
self.y = 0;
}
if (self.y > 2732) {
LK.effects.flashScreen(0xff0000, 1000);
LK.stopMusic();
LK.stopMusic();
LK.showGameOver();
}
// Rotate pelican clockwise as it falls
if (self.speed > 0) {
pelicanGraphics.rotation += 0.025; // Rotate clockwise at half speed
if (pelicanGraphics.rotation > Math.PI / 2) {
pelicanGraphics.rotation = Math.PI / 2; // Limit rotation to face straight down
}
// Apply the same rotation logic to the flap image if it exists
if (self.flapImage) {
self.flapImage.rotation = pelicanGraphics.rotation;
}
}
// Check if pelican is in the ocean layer
if (self.y > 2732 * 0.8) {
pelicanGraphics.alpha = 0.8; // Set to 80% opaque
if (self.y < 2732 * 0.8 + 10) {
// Check if pelican is at the top part of the ocean layer
createSplashEffect(self.x, self.y);
}
} else {
pelicanGraphics.alpha = 1; // Set to fully opaque
}
};
self.dive = function () {
self.speed = 10; // Increase speed for diving
};
self.fly = function () {
self.speed = -15; // Increase upward speed for flying
pelicanGraphics.rotation = 0; // Reset rotation
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Add instructions text at the start of the game
var instructionsText = new Text2('Tap to fly, avoid obstacles, and catch fish!', {
size: 100,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 6
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 2048 / 2;
instructionsText.y = 2732 / 2 - 500;
game.addChild(instructionsText);
// Remove the instructions text after 5 seconds
LK.setTimeout(function () {
instructionsText.destroy();
}, 5000);
// Initialize city layers to create a continuous loop similar to the ocean
var city1 = game.addChild(new City());
city1.x = 0;
city1.y = 2732 * 0.8 - city1.height / 2 + 155; // Consolidated vertical position adjustment
var city2 = game.addChild(new City());
city2.y = 2732 * 0.8 - city2.height / 2 + 155; // Consolidated vertical position adjustment
city2.x = 2048; // Offset the second city to create a continuous loop
// Initialize cloud layers with random heights
var cloud1 = game.addChild(new Cloud());
cloud1.x = 2048 / 2;
cloud1.y = Math.random() * 2732 * 0.5; // Random height within the top half
var cloud2 = game.addChild(new Cloud());
cloud2.x = 2048 / 2 + 1024; // Offset the second cloud
cloud2.y = Math.random() * 2732 * 0.5; // Random height within the top half
function createSplashEffect(x, y) {
var splash = LK.getAsset('splash', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 3
});
splash.x = x;
splash.y = y;
splash.alpha = 1;
splash.update = function () {
this.alpha -= 0.05; // Fade out the splash
if (this.alpha <= 0) {
this.destroy();
}
};
LK.getSound('splash').play(); // Play splash sound
game.addChild(splash);
}
game.pipesPassed = 0;
game.jetsAppear = false;
// Forest green color
// No start screen, game begins immediately
// Forest green color for pipes
// Forest green color for pipes
// Add a light blue layer at the bottom 20% of the screen
var bottomLayer1 = LK.getAsset('ocean', {
width: 2048,
height: 2732 * 0.2,
color: 0xADD8E6,
anchorX: 0.5,
anchorY: 0.0
});
bottomLayer1.x = 2048 / 2;
bottomLayer1.y = 2732 * 0.8;
game.addChild(city1);
game.addChild(city2);
game.addChild(bottomLayer1);
var bottomLayer2 = LK.getAsset('ocean', {
width: 2048,
height: 2732 * 0.2,
color: 0xADD8E6,
anchorX: 0.5,
anchorY: 0.0
});
bottomLayer2.x = 2048 / 2 + 2048;
bottomLayer2.y = 2732 * 0.8;
game.addChild(bottomLayer2);
var scoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 8
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var pelican = game.addChild(new Pelican());
var lastPelicanPosition = {
x: pelican.x,
y: pelican.y
};
var fish = game.addChild(new Fish());
fish.x = 1024; // Start in the middle of the screen
fish.y = 2732 * 0.9; // Position in the bottom layer
pelican.speed = 0; // Initial speed
pelican.x = 500;
pelican.y = 1366;
var obstacles = [];
var oceanSwayDirection = 1;
var oceanSwaySpeed = 0.5;
var noMovementText = new Text2('Avoid the posts🚪\nCatch the fish🐟\nDodge the crows🦅', {
size: 150,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 8
});
noMovementText.anchor.set(0.5, 0.5);
noMovementText.x = 2048 / 2;
noMovementText.y = 2732 / 2;
noMovementText.visible = false;
game.addChild(noMovementText);
var lastPelicanPosition = {
x: pelican.x,
y: pelican.y
};
game.update = function () {
// Check for movement
var allObstaclesMotionless = obstacles.every(function (obstacle) {
return obstacle.speed === 0;
});
if (pelican.x === lastPelicanPosition.x && pelican.y === lastPelicanPosition.y && allObstaclesMotionless) {
noMovementText.visible = true;
} else {
noMovementText.visible = false;
}
lastPelicanPosition.x = pelican.x;
lastPelicanPosition.y = pelican.y;
// Add a gentle sway to the ocean layer
bottomLayer1.x -= oceanSwaySpeed * 0.2;
bottomLayer2.x -= oceanSwaySpeed * 0.2;
if (bottomLayer1.x < -2048 / 2) {
bottomLayer1.x = bottomLayer2.x + 2048;
}
if (bottomLayer2.x < -2048 / 2) {
bottomLayer2.x = bottomLayer1.x + 2048;
}
bottomLayer1.y += oceanSwaySpeed * oceanSwayDirection * 0.5;
bottomLayer2.y += oceanSwaySpeed * oceanSwayDirection * 0.5;
if (bottomLayer1.y > 2732 * 0.8 + 0.5 || bottomLayer1.y < 2732 * 0.8 - 0.5) {
oceanSwayDirection *= -1;
}
if (LK.ticks % 400 == 0 && !game.jetsAppear) {
var newObstacle = new Obstacle();
newObstacle.x = 2048;
var gapY = Math.random() * (2000 - 600); // Random gap position
var pelicanHeight = LK.getAsset('pelican', {}).height;
var maxGapHeight = pelicanHeight * 10;
var initialGapHeight = 2000 * 0.5; // Increase the initial gap height to create a very large gap
var minGapHeight = initialGapHeight / 2;
var gapHeight = Math.max(minGapHeight, Math.min(initialGapHeight, maxGapHeight) - LK.getScore() * 0.1); // Decrease gapHeight over time but not less than half its initial size
newObstacle.createPipe(gapY, gapHeight);
obstacles.push(newObstacle);
game.addChild(newObstacle);
game.pipesPassed++;
if (game.pipesPassed % 8 == 0 && !game.jetsAppear) {
game.jetsAppear = true;
game.jetsTimer = 0;
LK.getSound('alert').play();
}
}
for (var i = obstacles.length - 1; i >= 0; i--) {
if (obstacles[i].x < -50) {
obstacles[i].destroy();
obstacles.splice(i, 1);
LK.setScore(LK.getScore() + 1); // Add 1 point to the score
scoreTxt.setText(LK.getScore()); // Update the score text
}
if (obstacles[i] instanceof Obstacle && pelican.intersects(obstacles[i])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.stopMusic();
LK.getSound('arcadefail').play();
LK.showGameOver();
}
fish.update();
cloud1.update();
cloud2.update();
city1.update();
city2.update();
if (pelican.intersects(fish)) {
fish.destroy();
fish = game.addChild(new Fish());
fish.x = 1024; // Reset fish position
fish.y = 2732 * 0.9;
LK.setScore(LK.getScore() + 10); // Add 10 points to the score
scoreTxt.setText(LK.getScore()); // Update the score text
LK.getSound('specialscore1').play(); // Play the sound Special Score 1
// Create and display a new unique graphic when the fish is eaten
var yumGraphic = LK.getAsset('yumGraphic', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
yumGraphic.x = pelican.x;
yumGraphic.y = pelican.y;
yumGraphic.alpha = 1;
yumGraphic.update = function () {
this.y -= 2; // Move the graphic upwards
this.alpha -= 0.02; // Fade out the graphic
if (this.alpha <= 0) {
this.destroy();
}
};
game.addChild(yumGraphic);
// Create and display the "+10" text
var plusTenText = new Text2('+10', {
size: 150,
fill: "#000000",
stroke: "#ffffff",
strokeThickness: 8
});
plusTenText.anchor.set(0.5, 0);
plusTenText.x = pelican.x;
plusTenText.y = pelican.y - 300; // Position it higher above the "YUM" graphic
plusTenText.alpha = 1;
plusTenText.update = function () {
this.y -= 2; // Move the text upwards
this.alpha -= 0.02; // Fade out the text
if (this.alpha <= 0) {
this.destroy();
}
};
game.addChild(plusTenText);
}
// Add a boat every 30 seconds
if (LK.ticks % 1800 == 0) {
// 1800 ticks = 30 seconds at 60 FPS
var newBoat = new Boat();
newBoat.x = 2048 + newBoat.width; // Start from the right side of the screen
newBoat.y = 2732 * 0.8 - 30; // Move the boat up by another 10 pixels
game.addChild(newBoat);
}
// Add the jet to the game
if (game.jetsAppear) {
game.jetsTimer++;
if (game.jetsTimer >= 300) {
// 5 seconds have passed
game.jetsAppear = false;
} else if (LK.ticks % 60 == 0) {
// Every second
if (game.jetsTimer == 0) {
// When the first jet appears
// Play the alert sound
LK.getSound('alert').play();
var crowsText = new Text2('CROWS!', {
size: 200,
fill: "#ffffff"
});
crowsText.anchor.set(0.5, 0.5);
crowsText.x = 2048 / 2;
crowsText.y = 2732 / 2;
game.addChild(crowsText);
// Remove the "CROWS!" text after 2 seconds
LK.setTimeout(function () {
crowsText.destroy();
}, 2000);
}
for (var i = 0; i < 3; i++) {
var newJet = new Jet();
newJet.x = 2048 + i * 500; // Start from the right side of the screen and spread out the jets
newJet.y = Math.random() * 2732; // Random y position
game.addChild(newJet);
}
}
}
// Check for collision with the jet
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i] instanceof Jet && pelican.intersects(game.children[i])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
// Increment score for every two seconds the pelican stays alive
if (LK.ticks % 120 == 0) {
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
}
}
};
game.down = function (x, y, obj) {
pelican.fly();
LK.getSound('flap').play();
// Create and display the "FLAP" image
var flapImage = LK.getAsset('flapImage', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
flapImage.x = pelican.x;
flapImage.y = pelican.y;
flapImage.alpha = 1; // Ensure the flap image is fully opaque
flapImage.update = function () {
this.alpha -= 0.1; // Fade out the image more quickly to last about a quarter second
this.rotation = pelican.rotation; // Ensure the flap image rotates with the pelican
if (this.alpha <= 0) {
this.destroy();
pelican.visible = true; // Make the pelican visible again
}
};
pelican.flapImage = flapImage; // Store reference to flap image for rotation
game.addChild(flapImage);
pelican.visible = false; // Hide the pelican when the flap image is on screen
};
game.up = function (x, y, obj) {
// No action needed on mouse up
};
// Start the music when the game begins
LK.playMusic('soundtrack', {
volume: 0.3
});
8-bit profile of pelican flying straight. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit profile of fish for arcade game. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit profile of pelican flapping it's wings downward. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit silhouette of tugboat. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit "YUM" dialog bubble. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.