/****
* Classes
****/
// Class for Bird
var Bird = Container.expand(function () {
var self = Container.call(this);
var birdGraphics = self.attachAsset('bird', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
self.x += self.speed;
self.y += Math.sin(self.x / 100) * 2; // Add vertical movement based on sine wave
if (self.x > 2048 + birdGraphics.width / 2) {
self.x = -birdGraphics.width / 2;
}
};
});
// Class for Crane
var Crane = Container.expand(function () {
var self = Container.call(this);
var craneGraphics = self.attachAsset('crane', {
anchorX: 0.5,
anchorY: 0.0
});
});
// Class for Dove
var Dove = Container.expand(function () {
var self = Container.call(this);
var doveGraphics = self.attachAsset('bird', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.x += self.speed;
self.y += Math.sin(self.x / 100) * 2; // Add vertical movement based on sine wave
if (self.x > 2048 + doveGraphics.width / 2) {
self.x = -doveGraphics.width / 2;
}
};
});
var DoveBird = Container.expand(function () {
var self = Container.call(this);
var doveBirdGraphics = self.attachAsset('dovebird', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.update = function () {
self.x -= self.speed;
self.y += Math.sin(self.x / 100) * 2; // Add vertical movement based on sine wave
if (self.x < -doveBirdGraphics.width / 2) {
self.x = 2048 + doveBirdGraphics.width / 2;
}
};
});
// Class for TowerBlock
var TowerBlock = Container.expand(function () {
var self = Container.call(this);
var blockGraphics = self.attachAsset('towerBlock', {
anchorX: 0.5,
anchorY: 0.5
});
self.swayDirection = 1;
self.swaySpeed = 1;
self.update = function () {
self.x += self.swaySpeed * self.swayDirection * 1.5;
if (self.x > 2048 - blockGraphics.width / 2 || self.x < blockGraphics.width / 2) {
self.swayDirection *= -1; // Reverse direction when reaching the edge
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Light blue background
});
/****
* Game Code
****/
var sky = game.addChild(LK.getAsset('sky', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
var crane = new Crane();
crane.x = currentBlock ? currentBlock.x : 2048 / 2;
crane.y = 0;
game.addChild(crane);
var grass = game.addChild(LK.getAsset('grass', {
anchorX: 0,
anchorY: 1,
x: 0,
y: 2732
}));
// Initialize variables
var towerBlocks = [];
var baseY = 2500; // Base row position
var currentBlock = null;
var counter = 20; // Initialize counter
var counterTxt = new Text2('Remaining Building Blocks: ' + counter.toString(), {
size: 37.5,
fill: 0xFFFFFF
}); // Create counter text
counterTxt.anchor.set(0, 0); // Set anchor to top left
LK.gui.topLeft.addChild(counterTxt); // Add counter text to top left corner of the map
// Function to drop the current block
function dropBlock() {
if (currentBlock) {
currentBlock.swaySpeed = 0; // Stop swaying
towerBlocks.push(currentBlock);
currentBlock = null;
}
}
// Create a new block at the top of the screen
function createNewBlock() {
// Create a new block at the top of the screen
function createNewBlock() {
if (counter > 0) {
currentBlock = new TowerBlock();
currentBlock.x = 2048 / 2;
currentBlock.y = 100;
game.addChild(currentBlock);
counter--; // Decrease counter by one
counterTxt.setText('Remaining Building Blocks: ' + counter.toString()); // Update counter text
}
}
currentBlock = new TowerBlock();
currentBlock.x = 2048 / 2;
currentBlock.y = 100;
game.addChild(currentBlock);
}
// Handle screen tap to drop the block
game.down = function (x, y, obj) {
if (!currentBlock && counter > 0) {
currentBlock = new TowerBlock();
currentBlock.x = 2048 / 2;
currentBlock.y = 100;
game.addChild(currentBlock);
counter--; // Decrease counter by one
counterTxt.setText('Remaining Building Blocks: ' + counter.toString()); // Update counter text
}
if (!currentBlock && counter > 0) {
currentBlock = new TowerBlock();
currentBlock.x = 2048 / 2;
currentBlock.y = 100;
game.addChild(currentBlock);
}
var lastSwayDirection = currentBlock ? currentBlock.swayDirection : 1; // Save the sway direction of the current block, default to 1 if null
dropBlock();
if (counter > 0) {
// Check if counter is greater than zero
createNewBlock();
currentBlock.x = towerBlocks[towerBlocks.length - 1].x; // Set the x position of the new block to the x position of the last block in the towerBlocks array
currentBlock.swayDirection = lastSwayDirection; // Set the sway direction of the new block to the saved sway direction
counter--; // Decrease counter by one
counterTxt.setText('Remaining Building Blocks: ' + counter.toString()); // Update counter text
}
};
// Initialize the first block
if (counter > 0) {
createNewBlock();
} else {
currentBlock = null; // Ensure no new block is created if counter is zero
}
// Add birds to the game
for (var i = 0; i < 2; i++) {
var bird = new Bird();
bird.x = Math.random() * 2048;
bird.y = Math.random() * (2732 / 2);
game.addChild(bird);
}
// Add doves to the game
for (var i = 0; i < 3; i++) {
var dove = new Dove();
dove.x = Math.random() * 2048;
dove.y = Math.random() * (2732 / 2);
game.addChild(dove);
}
// Add dovebirds to the game
for (var i = 0; i < 2; i++) {
var doveBird = new DoveBird();
doveBird.x = Math.random() * 2048;
doveBird.y = Math.random() * (2732 / 2);
game.addChild(doveBird);
}
// Update function for the game
game.update = function () {
if (currentBlock) {
currentBlock.update();
crane.x = currentBlock ? currentBlock.x : towerBlocks.length > 0 ? towerBlocks[towerBlocks.length - 1].x : crane.x;
}
// Update positions of all blocks
for (var i = 0; i < towerBlocks.length; i++) {
towerBlocks[i].y += 10; // Increase the falling speed of blocks
// Check if the block has collided with the grass
if (towerBlocks[i].intersects(grass)) {
towerBlocks[i].y = grass.y - towerBlocks[i].height / 2; // Position the block on top of the grass
towerBlocks[i].swaySpeed = 0; // Stop the block from moving
}
// Check if the block has collided with another block
for (var j = 0; j < towerBlocks.length; j++) {
if (i != j && towerBlocks[i].intersects(towerBlocks[j])) {
towerBlocks[i].y = towerBlocks[j].y - towerBlocks[i].height; // Position the block on top of the other block
towerBlocks[i].swaySpeed = 0; // Stop the block from moving
towerBlocks[i].swayDirection = 0; // Ensure no further movement occurs
// Initialize lastX for tracking changes on X
if (towerBlocks[i].lastX === undefined) {
towerBlocks[i].lastX = towerBlocks[i].x;
towerBlocks[i].lastX = towerBlocks[i].x;
}
// Check if at least 90% of the tower block fits on the underlying one
if (towerBlocks[j] && Math.abs(towerBlocks[i].x - towerBlocks[j].x) > towerBlocks[i].width * 0.1) {
// If not, slide it off animatedly
towerBlocks[i].x += towerBlocks[i].x < towerBlocks[j].x ? -5 : 5;
// If not, slide it off animatedly
towerBlocks[i].x += towerBlocks[i].x < towerBlocks[j].x ? -5 : 5;
// Check if the block has fallen off completely
if (towerBlocks[i].lastX <= 0 && towerBlocks[i].x > 0) {
towerBlocks[i].destroy(); // Remove the block from the game
towerBlocks.splice(i, 1); // Remove the block from the array
i--; // Adjust the index after removal
} else if (towerBlocks[i].y > 2732) {
towerBlocks[i].destroy(); // Remove the block from the game
towerBlocks.splice(i, 1); // Remove the block from the array
i--; // Adjust the index after removal
// Check if the block has fallen off the map
towerBlocks[i].destroy(); // Remove the block from the game
towerBlocks.splice(i, 1); // Remove the block from the array
i--; // Adjust the index after removal
}
}
// Update last known states
towerBlocks[i].lastX = towerBlocks[i].x;
break; // Prevent block from bouncing by breaking the loop once a collision is detected
}
}
}
// Play dove sound in loop
if (LK.ticks % 420 == 0) {
LK.getSound('Dove').play();
LK.playMusic('Birds');
}
};