User prompt
que la extructura sean cerdos y alrededor las toirres
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'removeChild')' in or related to this line: 'birds[0].parent.removeChild(birds[0]);' Line Number: 267
User prompt
pon un boton en la esquina que aya una flecha para arriba que si le das se reinicie ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
que sean grandes los puercos
User prompt
arriba
User prompt
que los cerdos esten arriba de las torres y alrededor
User prompt
y que desaparezca el pajaro
User prompt
que los pajaros exploten y dejen una textura al principio como d eplumas rojas ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
que sean mas grande los pajaros
User prompt
pon muchas ma storres y que encima ayan cerdos
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'removeChild')' in or related to this line: 'self.parent.removeChild(self);' Line Number: 121
User prompt
que dispare mas largo
User prompt
que cuando toque el suelo rebote
User prompt
que la catapulta este ams alante
User prompt
que tengan ams fuerza
User prompt
pero que solo gane si derribo todas ls torres
Code edit (1 edits merged)
Please save this source code
User prompt
Slingshot Birds
Initial prompt
un juego estilo angry birds
/**** * 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();
;