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