/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bird = Container.expand(function () { var self = Container.call(this); var birdGraphics = self.attachAsset('bird', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.isLaunched = false; self.isActive = true; self.gravity = 0.5; self.hasUsedAbility = false; self.update = function () { if (self.isLaunched && self.isActive) { self.velocityY += self.gravity; self.x += self.velocityX; self.y += self.velocityY; // Check ground collision if (self.y >= groundY - 60) { self.y = groundY - 60; self.velocityX *= 0.5; self.velocityY = -self.velocityY * 0.6; // Bounce with 60% of velocity if (Math.abs(self.velocityX) < 0.5 && Math.abs(self.velocityY) < 0.5) { self.explode(); self.isActive = false; checkLevelComplete(); } } // Check screen boundaries if (self.x > 2048 + 100) { self.explode(); self.isActive = false; checkLevelComplete(); } } }; self.launch = function (velX, velY) { self.velocityX = velX; self.velocityY = velY; self.isLaunched = true; LK.getSound('launch').play(); }; self.useAbility = function () { if (!self.hasUsedAbility && self.isLaunched) { self.hasUsedAbility = true; // Simple ability: speed boost self.velocityX *= 2.5; self.velocityY *= 2.5; } }; self.explode = function () { // Create red feather particles for (var i = 0; i < 8; i++) { var feather = game.addChild(LK.getAsset('feather', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y, rotation: Math.random() * Math.PI * 2 })); // Random velocity for each feather var angle = Math.PI * 2 * i / 8 + Math.random() * 0.5; var speed = 100 + Math.random() * 100; var targetX = self.x + Math.cos(angle) * speed; var targetY = self.y + Math.sin(angle) * speed; // Animate feather flying out and fading tween(feather, { x: targetX, y: targetY, alpha: 0, rotation: feather.rotation + Math.PI * 2, scaleX: 0.1, scaleY: 0.1 }, { duration: 1000 + Math.random() * 500, easing: tween.easeOut, onFinish: function onFinish() { if (feather.parent) { feather.parent.removeChild(feather); } } }); } // Make the bird disappear if (self.parent) { self.parent.removeChild(self); } }; return self; }); var Block = Container.expand(function (type) { var self = Container.call(this); var blockGraphics = self.attachAsset(type === 'wood' ? 'woodBlock' : 'stoneBlock', { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.health = type === 'wood' ? 1 : 2; self.velocityX = 0; self.velocityY = 0; self.isActive = false; self.gravity = 0.3; self.update = function () { if (self.isActive) { self.velocityY += self.gravity; self.x += self.velocityX; self.y += self.velocityY; // Ground collision if (self.y >= groundY - 50) { self.y = groundY - 50; self.velocityX *= 0.3; self.velocityY = 0; if (Math.abs(self.velocityX) < 0.2) { self.isActive = false; } } } }; self.takeDamage = function (damage, impactX, impactY) { self.health -= damage * 2; LK.getSound('hit').play(); if (self.health <= 0) { self.destroy(); } else { // Add some physics impact self.velocityX = (impactX - self.x) * 0.15; self.velocityY = (impactY - self.y) * 0.15; self.isActive = true; } }; self.destroy = function () { LK.effects.flashObject(self, 0xffff00, 300); tween(self, { alpha: 0, rotation: Math.PI }, { duration: 1000, onFinish: function onFinish() { if (self.parent) { self.parent.removeChild(self); } var blockIndex = blocks.indexOf(self); if (blockIndex !== -1) { blocks.splice(blockIndex, 1); } } }); }; return self; }); var Pig = Container.expand(function () { var self = Container.call(this); var pigGraphics = self.attachAsset('pig', { anchorX: 0.5, anchorY: 0.5 }); self.isDestroyed = false; self.health = 1; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.destroy(); } }; self.destroy = function () { if (!self.isDestroyed) { self.isDestroyed = true; LK.effects.flashObject(self, 0xff0000, 500); LK.getSound('destroy').play(); tween(self, { alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 500, onFinish: function onFinish() { if (self.parent) { self.parent.removeChild(self); } var pigIndex = pigs.indexOf(self); if (pigIndex !== -1) { pigs.splice(pigIndex, 1); } checkLevelComplete(); } }); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var groundY = 2732 - 100; var slingshotX = 400; var slingshotY = groundY - 150; var birds = []; var pigs = []; var blocks = []; var currentBird = null; var trajectoryDots = []; var isDragging = false; var dragStartX = 0; var dragStartY = 0; var gameState = 'aiming'; // 'aiming', 'flying', 'waiting' var levelComplete = false; // Create ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0, anchorY: 0, x: 0, y: groundY })); // Create slingshot var slingshot = game.addChild(LK.getAsset('slingshot', { anchorX: 0.5, anchorY: 1, x: slingshotX, y: slingshotY })); // Create trajectory dots for (var i = 0; i < 20; i++) { var dot = game.addChild(LK.getAsset('trajectory', { anchorX: 0.5, anchorY: 0.5, alpha: 0 })); trajectoryDots.push(dot); } // Create level structure function createLevel() { // Clear existing level while (birds.length > 0) { if (birds[0].parent) { birds[0].parent.removeChild(birds[0]); } birds.splice(0, 1); } while (pigs.length > 0) { if (pigs[0].parent) { pigs[0].parent.removeChild(pigs[0]); } pigs.splice(0, 1); } while (blocks.length > 0) { if (blocks[0].parent) { blocks[0].parent.removeChild(blocks[0]); } blocks.splice(0, 1); } // Create birds for (var i = 0; i < 3; i++) { var bird = new Bird(); bird.x = slingshotX - 100 - i * 80; bird.y = slingshotY - 60; birds.push(bird); game.addChild(bird); } // Create main pig structures with towers around them var pigPositions = [1200, 1500, 1800]; var structureY = groundY; for (var structureIndex = 0; structureIndex < pigPositions.length; structureIndex++) { var structureX = pigPositions[structureIndex]; // Create central pig structure (tower of pigs) // Bottom pig var pigBottom = new Pig(); pigBottom.x = structureX + 60; pigBottom.y = structureY - 100; pigs.push(pigBottom); game.addChild(pigBottom); // Middle pig var pigMiddle = new Pig(); pigMiddle.x = structureX + 60; pigMiddle.y = structureY - 200; pigs.push(pigMiddle); game.addChild(pigMiddle); // Top pig var pigTop = new Pig(); pigTop.x = structureX + 60; pigTop.y = structureY - 300; pigs.push(pigTop); game.addChild(pigTop); // Additional pigs around the center var pigLeft = new Pig(); pigLeft.x = structureX - 40; pigLeft.y = structureY - 150; pigs.push(pigLeft); game.addChild(pigLeft); var pigRight = new Pig(); pigRight.x = structureX + 160; pigRight.y = structureY - 150; pigs.push(pigRight); game.addChild(pigRight); // Create smaller tower structures around the pig formation // Left tower for (var i = 0; i < 2; i++) { var block = new Block('wood'); block.x = structureX - 100; block.y = structureY - 50 - i * 100; blocks.push(block); game.addChild(block); } // Right tower for (var i = 0; i < 2; i++) { var block = new Block('wood'); block.x = structureX + 220; block.y = structureY - 50 - i * 100; blocks.push(block); game.addChild(block); } // Front tower for (var i = 0; i < 3; i++) { var block = new Block('wood'); block.x = structureX + 60; block.y = structureY - 50 - i * 100; blocks.push(block); game.addChild(block); } // Back towers (stone blocks for variety) var backBlock1 = new Block('stone'); backBlock1.x = structureX - 20; backBlock1.y = structureY - 50; blocks.push(backBlock1); game.addChild(backBlock1); var backBlock2 = new Block('stone'); backBlock2.x = structureX + 140; backBlock2.y = structureY - 50; blocks.push(backBlock2); game.addChild(backBlock2); } // Set current bird currentBird = birds[0]; currentBird.x = slingshotX; currentBird.y = slingshotY - 60; gameState = 'aiming'; levelComplete = false; } function updateTrajectory(mouseX, mouseY) { var deltaX = mouseX - slingshotX; var deltaY = mouseY - slingshotY; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); if (distance > 150) { deltaX = deltaX / distance * 150; deltaY = deltaY / distance * 150; } var velocityX = -deltaX * 0.2; var velocityY = -deltaY * 0.2; for (var i = 0; i < trajectoryDots.length; i++) { var t = i * 3; var x = slingshotX + velocityX * t; var y = slingshotY - 60 + velocityY * t + 0.5 * 0.5 * t * t; trajectoryDots[i].x = x; trajectoryDots[i].y = y; trajectoryDots[i].alpha = Math.max(0, 1 - i * 0.05); } } function hideTrajectory() { for (var i = 0; i < trajectoryDots.length; i++) { trajectoryDots[i].alpha = 0; } } function checkCollisions() { if (!currentBird || !currentBird.isLaunched) return; // Check bird-pig collisions for (var i = 0; i < pigs.length; i++) { var pig = pigs[i]; if (!pig.isDestroyed && currentBird.intersects(pig)) { pig.takeDamage(1); currentBird.explode(); currentBird.isActive = false; checkLevelComplete(); return; } } // Check bird-block collisions for (var i = 0; i < blocks.length; i++) { var block = blocks[i]; if (currentBird.intersects(block)) { block.takeDamage(1, currentBird.x, currentBird.y); currentBird.explode(); currentBird.isActive = false; checkLevelComplete(); return; } } } function checkLevelComplete() { if (levelComplete) return; // Check if all blocks are destroyed var activeBlocks = 0; for (var i = 0; i < blocks.length; i++) { activeBlocks++; } if (activeBlocks === 0) { levelComplete = true; LK.setTimeout(function () { LK.showYouWin(); }, 1000); return; } // Check if current bird is inactive and we need next bird if (currentBird && !currentBird.isActive && gameState === 'flying') { gameState = 'waiting'; hideTrajectory(); LK.setTimeout(function () { // Find next bird var nextBirdIndex = birds.indexOf(currentBird) + 1; if (nextBirdIndex < birds.length) { currentBird = birds[nextBirdIndex]; currentBird.x = slingshotX; currentBird.y = slingshotY - 60; gameState = 'aiming'; } else { // No more birds, game over LK.showGameOver(); } }, 1000); } } // Game event handlers game.down = function (x, y, obj) { if (gameState === 'aiming' && currentBird) { isDragging = true; dragStartX = x; dragStartY = y; updateTrajectory(x, y); } }; game.move = function (x, y, obj) { if (isDragging && gameState === 'aiming' && currentBird) { var deltaX = x - slingshotX; var deltaY = y - slingshotY; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); if (distance > 150) { deltaX = deltaX / distance * 150; deltaY = deltaY / distance * 150; } currentBird.x = slingshotX + deltaX; currentBird.y = slingshotY - 60 + deltaY; updateTrajectory(x, y); } }; game.up = function (x, y, obj) { if (isDragging && gameState === 'aiming' && currentBird) { isDragging = false; var deltaX = currentBird.x - slingshotX; var deltaY = currentBird.y - (slingshotY - 60); var velocityX = -deltaX * 0.2; var velocityY = -deltaY * 0.2; if (Math.abs(velocityX) > 1 || Math.abs(velocityY) > 1) { currentBird.launch(velocityX, velocityY); gameState = 'flying'; hideTrajectory(); } else { currentBird.x = slingshotX; currentBird.y = slingshotY - 60; hideTrajectory(); } } else if (gameState === 'flying' && currentBird) { // Use bird ability currentBird.useAbility(); } }; game.update = function () { checkCollisions(); // Update blocks physics for (var i = 0; i < blocks.length; i++) { var block = blocks[i]; // Check block-pig collisions for (var j = 0; j < pigs.length; j++) { var pig = pigs[j]; if (!pig.isDestroyed && block.intersects(pig)) { pig.takeDamage(1); } } } }; // Create restart button in top right corner var restartButton = game.addChild(LK.getAsset('restartButton', { anchorX: 0.5, anchorY: 0.5, x: 2048 - 100, y: 100 })); // Create upward arrow on the button var arrowUp = restartButton.addChild(LK.getAsset('arrowUp', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -10, rotation: 0 })); // Add click handler for restart button restartButton.down = function (x, y, obj) { // Reset game state gameState = 'aiming'; levelComplete = false; isDragging = false; currentBird = null; // Recreate the level createLevel(); // Visual feedback tween(restartButton, { scaleX: 0.8, scaleY: 0.8 }, { duration: 100, onFinish: function onFinish() { tween(restartButton, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100 }); } }); }; // Initialize level createLevel(); ;
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bird = Container.expand(function () {
var self = Container.call(this);
var birdGraphics = self.attachAsset('bird', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.isLaunched = false;
self.isActive = true;
self.gravity = 0.5;
self.hasUsedAbility = false;
self.update = function () {
if (self.isLaunched && self.isActive) {
self.velocityY += self.gravity;
self.x += self.velocityX;
self.y += self.velocityY;
// Check ground collision
if (self.y >= groundY - 60) {
self.y = groundY - 60;
self.velocityX *= 0.5;
self.velocityY = -self.velocityY * 0.6; // Bounce with 60% of velocity
if (Math.abs(self.velocityX) < 0.5 && Math.abs(self.velocityY) < 0.5) {
self.explode();
self.isActive = false;
checkLevelComplete();
}
}
// Check screen boundaries
if (self.x > 2048 + 100) {
self.explode();
self.isActive = false;
checkLevelComplete();
}
}
};
self.launch = function (velX, velY) {
self.velocityX = velX;
self.velocityY = velY;
self.isLaunched = true;
LK.getSound('launch').play();
};
self.useAbility = function () {
if (!self.hasUsedAbility && self.isLaunched) {
self.hasUsedAbility = true;
// Simple ability: speed boost
self.velocityX *= 2.5;
self.velocityY *= 2.5;
}
};
self.explode = function () {
// Create red feather particles
for (var i = 0; i < 8; i++) {
var feather = game.addChild(LK.getAsset('feather', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
rotation: Math.random() * Math.PI * 2
}));
// Random velocity for each feather
var angle = Math.PI * 2 * i / 8 + Math.random() * 0.5;
var speed = 100 + Math.random() * 100;
var targetX = self.x + Math.cos(angle) * speed;
var targetY = self.y + Math.sin(angle) * speed;
// Animate feather flying out and fading
tween(feather, {
x: targetX,
y: targetY,
alpha: 0,
rotation: feather.rotation + Math.PI * 2,
scaleX: 0.1,
scaleY: 0.1
}, {
duration: 1000 + Math.random() * 500,
easing: tween.easeOut,
onFinish: function onFinish() {
if (feather.parent) {
feather.parent.removeChild(feather);
}
}
});
}
// Make the bird disappear
if (self.parent) {
self.parent.removeChild(self);
}
};
return self;
});
var Block = Container.expand(function (type) {
var self = Container.call(this);
var blockGraphics = self.attachAsset(type === 'wood' ? 'woodBlock' : 'stoneBlock', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.health = type === 'wood' ? 1 : 2;
self.velocityX = 0;
self.velocityY = 0;
self.isActive = false;
self.gravity = 0.3;
self.update = function () {
if (self.isActive) {
self.velocityY += self.gravity;
self.x += self.velocityX;
self.y += self.velocityY;
// Ground collision
if (self.y >= groundY - 50) {
self.y = groundY - 50;
self.velocityX *= 0.3;
self.velocityY = 0;
if (Math.abs(self.velocityX) < 0.2) {
self.isActive = false;
}
}
}
};
self.takeDamage = function (damage, impactX, impactY) {
self.health -= damage * 2;
LK.getSound('hit').play();
if (self.health <= 0) {
self.destroy();
} else {
// Add some physics impact
self.velocityX = (impactX - self.x) * 0.15;
self.velocityY = (impactY - self.y) * 0.15;
self.isActive = true;
}
};
self.destroy = function () {
LK.effects.flashObject(self, 0xffff00, 300);
tween(self, {
alpha: 0,
rotation: Math.PI
}, {
duration: 1000,
onFinish: function onFinish() {
if (self.parent) {
self.parent.removeChild(self);
}
var blockIndex = blocks.indexOf(self);
if (blockIndex !== -1) {
blocks.splice(blockIndex, 1);
}
}
});
};
return self;
});
var Pig = Container.expand(function () {
var self = Container.call(this);
var pigGraphics = self.attachAsset('pig', {
anchorX: 0.5,
anchorY: 0.5
});
self.isDestroyed = false;
self.health = 1;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.destroy();
}
};
self.destroy = function () {
if (!self.isDestroyed) {
self.isDestroyed = true;
LK.effects.flashObject(self, 0xff0000, 500);
LK.getSound('destroy').play();
tween(self, {
alpha: 0,
scaleX: 0.1,
scaleY: 0.1
}, {
duration: 500,
onFinish: function onFinish() {
if (self.parent) {
self.parent.removeChild(self);
}
var pigIndex = pigs.indexOf(self);
if (pigIndex !== -1) {
pigs.splice(pigIndex, 1);
}
checkLevelComplete();
}
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var groundY = 2732 - 100;
var slingshotX = 400;
var slingshotY = groundY - 150;
var birds = [];
var pigs = [];
var blocks = [];
var currentBird = null;
var trajectoryDots = [];
var isDragging = false;
var dragStartX = 0;
var dragStartY = 0;
var gameState = 'aiming'; // 'aiming', 'flying', 'waiting'
var levelComplete = false;
// Create ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: groundY
}));
// Create slingshot
var slingshot = game.addChild(LK.getAsset('slingshot', {
anchorX: 0.5,
anchorY: 1,
x: slingshotX,
y: slingshotY
}));
// Create trajectory dots
for (var i = 0; i < 20; i++) {
var dot = game.addChild(LK.getAsset('trajectory', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
}));
trajectoryDots.push(dot);
}
// Create level structure
function createLevel() {
// Clear existing level
while (birds.length > 0) {
if (birds[0].parent) {
birds[0].parent.removeChild(birds[0]);
}
birds.splice(0, 1);
}
while (pigs.length > 0) {
if (pigs[0].parent) {
pigs[0].parent.removeChild(pigs[0]);
}
pigs.splice(0, 1);
}
while (blocks.length > 0) {
if (blocks[0].parent) {
blocks[0].parent.removeChild(blocks[0]);
}
blocks.splice(0, 1);
}
// Create birds
for (var i = 0; i < 3; i++) {
var bird = new Bird();
bird.x = slingshotX - 100 - i * 80;
bird.y = slingshotY - 60;
birds.push(bird);
game.addChild(bird);
}
// Create main pig structures with towers around them
var pigPositions = [1200, 1500, 1800];
var structureY = groundY;
for (var structureIndex = 0; structureIndex < pigPositions.length; structureIndex++) {
var structureX = pigPositions[structureIndex];
// Create central pig structure (tower of pigs)
// Bottom pig
var pigBottom = new Pig();
pigBottom.x = structureX + 60;
pigBottom.y = structureY - 100;
pigs.push(pigBottom);
game.addChild(pigBottom);
// Middle pig
var pigMiddle = new Pig();
pigMiddle.x = structureX + 60;
pigMiddle.y = structureY - 200;
pigs.push(pigMiddle);
game.addChild(pigMiddle);
// Top pig
var pigTop = new Pig();
pigTop.x = structureX + 60;
pigTop.y = structureY - 300;
pigs.push(pigTop);
game.addChild(pigTop);
// Additional pigs around the center
var pigLeft = new Pig();
pigLeft.x = structureX - 40;
pigLeft.y = structureY - 150;
pigs.push(pigLeft);
game.addChild(pigLeft);
var pigRight = new Pig();
pigRight.x = structureX + 160;
pigRight.y = structureY - 150;
pigs.push(pigRight);
game.addChild(pigRight);
// Create smaller tower structures around the pig formation
// Left tower
for (var i = 0; i < 2; i++) {
var block = new Block('wood');
block.x = structureX - 100;
block.y = structureY - 50 - i * 100;
blocks.push(block);
game.addChild(block);
}
// Right tower
for (var i = 0; i < 2; i++) {
var block = new Block('wood');
block.x = structureX + 220;
block.y = structureY - 50 - i * 100;
blocks.push(block);
game.addChild(block);
}
// Front tower
for (var i = 0; i < 3; i++) {
var block = new Block('wood');
block.x = structureX + 60;
block.y = structureY - 50 - i * 100;
blocks.push(block);
game.addChild(block);
}
// Back towers (stone blocks for variety)
var backBlock1 = new Block('stone');
backBlock1.x = structureX - 20;
backBlock1.y = structureY - 50;
blocks.push(backBlock1);
game.addChild(backBlock1);
var backBlock2 = new Block('stone');
backBlock2.x = structureX + 140;
backBlock2.y = structureY - 50;
blocks.push(backBlock2);
game.addChild(backBlock2);
}
// Set current bird
currentBird = birds[0];
currentBird.x = slingshotX;
currentBird.y = slingshotY - 60;
gameState = 'aiming';
levelComplete = false;
}
function updateTrajectory(mouseX, mouseY) {
var deltaX = mouseX - slingshotX;
var deltaY = mouseY - slingshotY;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if (distance > 150) {
deltaX = deltaX / distance * 150;
deltaY = deltaY / distance * 150;
}
var velocityX = -deltaX * 0.2;
var velocityY = -deltaY * 0.2;
for (var i = 0; i < trajectoryDots.length; i++) {
var t = i * 3;
var x = slingshotX + velocityX * t;
var y = slingshotY - 60 + velocityY * t + 0.5 * 0.5 * t * t;
trajectoryDots[i].x = x;
trajectoryDots[i].y = y;
trajectoryDots[i].alpha = Math.max(0, 1 - i * 0.05);
}
}
function hideTrajectory() {
for (var i = 0; i < trajectoryDots.length; i++) {
trajectoryDots[i].alpha = 0;
}
}
function checkCollisions() {
if (!currentBird || !currentBird.isLaunched) return;
// Check bird-pig collisions
for (var i = 0; i < pigs.length; i++) {
var pig = pigs[i];
if (!pig.isDestroyed && currentBird.intersects(pig)) {
pig.takeDamage(1);
currentBird.explode();
currentBird.isActive = false;
checkLevelComplete();
return;
}
}
// Check bird-block collisions
for (var i = 0; i < blocks.length; i++) {
var block = blocks[i];
if (currentBird.intersects(block)) {
block.takeDamage(1, currentBird.x, currentBird.y);
currentBird.explode();
currentBird.isActive = false;
checkLevelComplete();
return;
}
}
}
function checkLevelComplete() {
if (levelComplete) return;
// Check if all blocks are destroyed
var activeBlocks = 0;
for (var i = 0; i < blocks.length; i++) {
activeBlocks++;
}
if (activeBlocks === 0) {
levelComplete = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
return;
}
// Check if current bird is inactive and we need next bird
if (currentBird && !currentBird.isActive && gameState === 'flying') {
gameState = 'waiting';
hideTrajectory();
LK.setTimeout(function () {
// Find next bird
var nextBirdIndex = birds.indexOf(currentBird) + 1;
if (nextBirdIndex < birds.length) {
currentBird = birds[nextBirdIndex];
currentBird.x = slingshotX;
currentBird.y = slingshotY - 60;
gameState = 'aiming';
} else {
// No more birds, game over
LK.showGameOver();
}
}, 1000);
}
}
// Game event handlers
game.down = function (x, y, obj) {
if (gameState === 'aiming' && currentBird) {
isDragging = true;
dragStartX = x;
dragStartY = y;
updateTrajectory(x, y);
}
};
game.move = function (x, y, obj) {
if (isDragging && gameState === 'aiming' && currentBird) {
var deltaX = x - slingshotX;
var deltaY = y - slingshotY;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if (distance > 150) {
deltaX = deltaX / distance * 150;
deltaY = deltaY / distance * 150;
}
currentBird.x = slingshotX + deltaX;
currentBird.y = slingshotY - 60 + deltaY;
updateTrajectory(x, y);
}
};
game.up = function (x, y, obj) {
if (isDragging && gameState === 'aiming' && currentBird) {
isDragging = false;
var deltaX = currentBird.x - slingshotX;
var deltaY = currentBird.y - (slingshotY - 60);
var velocityX = -deltaX * 0.2;
var velocityY = -deltaY * 0.2;
if (Math.abs(velocityX) > 1 || Math.abs(velocityY) > 1) {
currentBird.launch(velocityX, velocityY);
gameState = 'flying';
hideTrajectory();
} else {
currentBird.x = slingshotX;
currentBird.y = slingshotY - 60;
hideTrajectory();
}
} else if (gameState === 'flying' && currentBird) {
// Use bird ability
currentBird.useAbility();
}
};
game.update = function () {
checkCollisions();
// Update blocks physics
for (var i = 0; i < blocks.length; i++) {
var block = blocks[i];
// Check block-pig collisions
for (var j = 0; j < pigs.length; j++) {
var pig = pigs[j];
if (!pig.isDestroyed && block.intersects(pig)) {
pig.takeDamage(1);
}
}
}
};
// Create restart button in top right corner
var restartButton = game.addChild(LK.getAsset('restartButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 - 100,
y: 100
}));
// Create upward arrow on the button
var arrowUp = restartButton.addChild(LK.getAsset('arrowUp', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -10,
rotation: 0
}));
// Add click handler for restart button
restartButton.down = function (x, y, obj) {
// Reset game state
gameState = 'aiming';
levelComplete = false;
isDragging = false;
currentBird = null;
// Recreate the level
createLevel();
// Visual feedback
tween(restartButton, {
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 100,
onFinish: function onFinish() {
tween(restartButton, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100
});
}
});
};
// Initialize level
createLevel();
;