User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'lastIntersecting')' in or related to this line: 'if (!game.reticle.lastIntersecting && game.reticle.intersects(bird)) {' Line Number: 423
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'lastIntersecting')' in or related to this line: 'if (!game.reticle.lastIntersecting && game.reticle.intersects(bird)) {' Line Number: 421
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'lastIntersecting')' in or related to this line: 'if (!game.reticle.lastIntersecting && game.reticle.intersects(bird)) {' Line Number: 421
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'lastIntersecting')' in or related to this line: 'if (!game.reticle.lastIntersecting && game.reticle.intersects(bird)) {' Line Number: 420
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'lastIntersecting')' in or related to this line: 'if (!game.reticle.lastIntersecting && game.reticle.intersects(bird)) {' Line Number: 419
User prompt
when the reticle touches a bird, change the reticle color to green
User prompt
✅ Remove auto-targeting related variables
User prompt
✅ Remove auto-targeting update function
User prompt
✅ Remove auto-targeting activation function
User prompt
Remove auto-targeting timer and functionality
User prompt
only remove auto targeting, do not remove reticle code.
User prompt
remove branch asset code
User prompt
continue with remaining assets
User prompt
Please fix the bug: 'scoreTxt is not defined' in or related to this line: 'scoreTxt.x = 2048 / 2; // Center the score text horizontally' Line Number: 510
User prompt
continue with remaining assets
Code edit (1 edits merged)
Please save this source code
User prompt
continue with the other assets
User prompt
improve asset classes and event listeners.
User prompt
create variables at the top of the code for all sounds volume settings.
User prompt
refactor all grass code, i think it got overcomplicated.
User prompt
make the volume of all sounds 3
User prompt
✅ Play bgm1 once onload, then set a timer to replay it every 20-50 seconds
User prompt
bgm1 is looping, play it only once, then start a timer to play it again EVERY 20-50 seconds.
User prompt
bgm1 is looping, only play it once, the start a timer to play it again in 20-50 seconds.
User prompt
make sure all bird functions include all 3 birds.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Branch asset // Bird1 class to represent the first kind of bird var Bird1 = Container.expand(function () { var self = Container.call(this); var birdGraphics = self.attachAsset('bird1', { anchorX: 0.5, anchorY: 0.5 }); self.speed = Math.random() * 1.6 + 1; self.update = function () { if (self.lastY === undefined) { self.lastY = self.y; } // Initialize lastY for tracking changes on Y self.y += self.speed; self.lastY = self.y; // Update lastY after movement self.x += Math.sin(self.y / 100) * 6.5; // Increase the swooping motion of the bird's movement by 30% if (self.y > 2732) { self.y = -self.height; if (Math.random() < 0.33) { self.x = Math.random() * 2048; // Start from a random position along the top } else { self.x = Math.random() < 0.5 ? 0 : 2048; // Start from either the left or right side } } }; }); // Bird2 class to represent the second kind of bird var Bird2 = Container.expand(function () { var self = Container.call(this); var birdGraphics = self.attachAsset('bird2b', { anchorX: 0.5, anchorY: 0.5 }); self.speed = Math.random() * 1.6 + 1; self.update = function () { if (self.lastY === undefined) { self.lastY = self.y; } // Initialize lastY for tracking changes on Y self.y += self.speed; self.lastY = self.y; // Update lastY after movement self.x += Math.sin(self.y / 100) * 6.5; // Increase the swooping motion of the bird's movement by 30% if (self.y > 2732) { self.y = Math.random() * 2732; // Random initial y position within the screen height self.x = Math.random() < 0.5 ? 0 : 2048; // Start from either the left or right side } }; }); // Bird3 class to represent a third kind of bird var Bird3 = Container.expand(function () { var self = Container.call(this); var birdGraphics = self.attachAsset('bird2', { anchorX: 0.5, anchorY: 0.5 }); self.speed = Math.random() * 1.6 + 1; self.update = function () { if (self.lastY === undefined) { self.lastY = self.y; } // Initialize lastY for tracking changes on Y self.y += self.speed; self.lastY = self.y; // Update lastY after movement self.x += Math.sin(self.y / 100) * 6.5; // Increase the swooping motion of the bird's movement by 30% if (self.y > 2732) { self.y = -self.height; if (Math.random() < 0.33) { self.x = Math.random() * 2048; // Start from a random position along the top } else { self.x = Math.random() < 0.5 ? 0 : 2048; // Start from either the left or right side } } }; }); // Cloud class to represent clouds moving across the screen var Cloud = Container.expand(function () { var self = Container.call(this); var cloudGraphics = self.attachAsset('cloud', { anchorX: 0.5, anchorY: 0.5 }); self.speed = (Math.random() * 0.5 + 0.5) * 0.4; // Reduce speed by 60% (20% slower than before) self.hasAccelerated = false; // Track if the cloud has already accelerated self.direction = Math.random() < 0.5 ? 1 : -1; // Random direction: 1 for right, -1 for left self.update = function () { self.x += self.speed * self.direction; // If the cloud moves off-screen, reposition it to the opposite side if (self.x > 2048 + self.width / 2) { self.x = -self.width / 2; } else if (self.x < -self.width / 2) { self.x = 2048 + self.width / 2; } self.lastX = self.x; // Track last X position for future checks // Check for overlap with other clouds for (var i = 0; i < clouds.length; i++) { if (clouds[i] !== self && self.intersects(clouds[i])) { if (!self.hasAccelerated) { var slowestSpeed = Math.min(self.speed, clouds[i].speed); self.speed += slowestSpeed * 0.1; // Increase speed by 10% of the slowest cloud's speed self.hasAccelerated = true; // Mark as accelerated } break; } } // Check if the cloud intersects with the sun if (!self.lastIntersecting && self.intersects(sun)) { self.speed *= 1.5; // Increase speed by 50% tween(cloudGraphics, { alpha: 0.5 }, { duration: 3000, easing: tween.linear }); } else if (self.lastIntersecting && !self.intersects(sun)) { self.speed /= 1.5; // Reset speed to original tween(cloudGraphics, { alpha: 1.0 }, { duration: 3000, easing: tween.linear }); } self.lastIntersecting = self.intersects(sun); }; }); // Grass class to represent the grass image var Grass = Container.expand(function () { var self = Container.call(this); var grassGraphics = self.attachAsset('grass', { anchorX: 0.5, anchorY: 1 }); self.update = function () { // Add any specific update logic for the grass here }; }); // Sun class to represent a pulsating sun in the top right corner var Sun = Container.expand(function () { var self = Container.call(this); var sunGraphics = self.attachAsset('sun', { anchorX: 0.5, anchorY: 0.5 }); self.x = sunGraphics.width / 2; self.y = sunGraphics.height / 2; // Function to create a pulsating effect function pulsate() { tween(self, { scaleX: 1.1, scaleY: 1.1 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { scaleX: 1.0, scaleY: 1.0 }, { duration: 1000, easing: tween.easeInOut, onFinish: pulsate }); } }); } pulsate(); // Start the pulsating effect }); // Tree class to represent a tree with a 9:16 aspect ratio var Tree = Container.expand(function () { var self = Container.call(this); var treeGraphics = self.attachAsset('tree', { anchorX: 0.5, anchorY: 1 }); self.update = function () { // Add any specific update logic for the tree here }; }); // UFO class to represent a UFO flying across the screen var UFO = Container.expand(function () { var self = Container.call(this); var ufoGraphics = self.attachAsset('ufo', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3.2; // Decrease speed by 20% self.direction = Math.random() < 0.5 ? 1 : -1; // Random direction: 1 for right, -1 for left self.update = function () { self.x += self.speed * self.direction; self.y = 100 + Math.sin(self.x / 70) * 165; // Increase the wave pattern depth by 10% // If the UFO moves off-screen, destroy it and set to null if (self.x > 2048 + self.width / 2 || self.x < -self.width / 2) { self.destroy(); ufo = null; } }; }); /**** * Initialize Game ****/ /**** * Assets LK.init.shape('branch', {width:50, height:10, color:0x8b4513, shape:'box'}) ****/ // Initialize clouds array var game = new LK.Game({ backgroundColor: 0x87CEEB // Light blue background to simulate the sky }); /**** * Game Code ****/ // Function to spawn a smart bird function spawnSmartBird() { // Randomly choose a bird type var birdType; do { birdType = Math.floor(Math.random() * 3) + 1; } while (birdType === lastBirdType); lastBirdType = birdType; var bird; // Create a bird based on the chosen type if (birdType === 1) { bird = new Bird1(); } else if (birdType === 2) { bird = new Bird2(); } else { bird = new Bird3(); } // Set initial position and speed bird.x = Math.random() * 2048; bird.y = -bird.height; bird.speed = 1 + Math.random() * 0.6; bird.lastIntersecting = false; // Add the bird to the game and the birds array LK.setTimeout(function () { game.addChild(bird); birds.push(bird); }, 2000); } game.move = function (x, y, obj) { // Reset the auto-targeting timer when the mouse moves if (autoTargetingTimer) { LK.clearTimeout(autoTargetingTimer); } if (!game.reticle) { game.reticle = LK.getAsset('reticle1', { anchorX: 0.5, anchorY: 0.5 }); game.addChild(game.reticle); } game.reticle.x = x; game.reticle.y = y; // Start a new timer for auto-targeting autoTargetingTimer = LK.setTimeout(startAutoTargeting, 5000); }; // Function to start auto-targeting birds function startAutoTargeting() { autoTargetingActive = true; } // Function to update reticle position for auto-targeting function updateAutoTargeting() { if (autoTargetingActive) { // Find the closest bird to target var closestBird = null; var minDistance = Infinity; birds.forEach(function (bird) { var distance = Math.sqrt(Math.pow(bird.x - game.reticle.x, 2) + Math.pow(bird.y - game.reticle.y, 2)); if (distance < minDistance) { minDistance = distance; closestBird = bird; } }); // Move reticle towards the closest bird if (closestBird) { game.reticle.x += (closestBird.x - game.reticle.x) * 0.1; game.reticle.y += (closestBird.y - game.reticle.y) * 0.1; } } } var lastBirdType = null; // Track the last spawned bird type var autoTargetingTimer = null; var autoTargetingActive = true; // Update function to handle auto-targeting game.update = function () { updateAutoTargeting(); // Existing update logic... }; // Add a sun to the game in the top left corner var sun = game.addChild(new Sun()); sun.x = 1750; sun.y = 280; // Function to add a UFO to the game function addUFO() { var ufo = game.addChild(new UFO()); ufo.x = Math.random() < 0.5 ? 2048 + ufo.width / 2 : -ufo.width / 2; // Start from either the far right or left edge of the screen ufo.y = Math.random() * 500; // Random initial y position in the upper part of the screen ufo.customUpdate = function () { ufo.update(); }; LK.getSound('ufo1').play({ loop: true // Ensure the sound loops while the UFO is on screen }); return ufo; } // Initialize clouds array var clouds = []; for (var i = 0; i < 4; i++) { // Add 3 clouds for variety var cloud = new Cloud(); cloud.x = Math.random() * 2048; cloud.y = Math.random() * 500; // Position clouds in the upper part of the screen clouds.push(cloud); game.addChild(cloud); } // Initialize a timer to add a UFO at a random time between 30 and 50 seconds var ufo; // Define the ufo variable in the global scope var ufoTimer = LK.setTimeout(function () { addUFO(); // Reset the timer with a new random time ufoTimer = LK.setTimeout(arguments.callee, Math.random() * 20000 + 30000); }, Math.random() * 20000 + 30000); game.update = function () { for (var i = 0; i < clouds.length; i++) { clouds[i].update(); } if (ufo) { ufo.customUpdate(); // Check if the UFO has moved off-screen if (ufo.lastX <= 2048 + ufo.width / 2 && ufo.x > 2048 + ufo.width / 2 || ufo.lastX >= -ufo.width / 2 && ufo.x < -ufo.width / 2) { // Destroy the UFO and set it to null ufo.destroy(); ufo = null; // Stop the ufo1 sound LK.getSound('ufo1').stop(); // Start a timer for the UFO to reappear between 30-50 seconds ufoTimer = LK.setTimeout(function () { ufo = addUFO(); }, Math.random() * 20000 + 30000); } else { // Ensure the ufo1 sound is playing while the UFO is on screen if (!LK.getSound('ufo1').isPlaying() && ufo) { LK.getSound('ufo1').play({ loop: true }); } } ufo.lastX = ufo.x; // Update lastX for the UFO } // Handle collision and bouncing between all birds birds.forEach(function (birdA, indexA) { birds.forEach(function (birdB, indexB) { if (indexA !== indexB && !birdA.lastIntersecting && birdA.intersects(birdB)) { var dx = birdB.x - birdA.x; var dy = birdB.y - birdA.y; var distance = Math.sqrt(dx * dx + dy * dy); var minDist = (birdA.width + 10) / 2 + (birdB.width + 10) / 2; if (distance < minDist) { var angle = Math.atan2(dy, dx); var targetX = birdA.x + Math.cos(angle) * minDist; var targetY = birdA.y + Math.sin(angle) * minDist; var ax = (targetX - birdB.x) * 0.02; var ay = (targetY - birdB.y) * 0.02; birdA.x -= ax; birdA.y -= ay; birdB.x += ax; birdB.y += ay; } birdA.lastIntersecting = true; birdB.lastIntersecting = true; } else { birdA.lastIntersecting = false; birdB.lastIntersecting = false; } }); }); }; // Create an array to hold bird objects var birds = []; // bird1 // Function to add a bird to the game function addBird(type) { var bird; if (type === 1) { bird = new Bird1(); } else if (type === 2) { bird = new Bird2(); } else { bird = new Bird3(); } bird.x = Math.random() * 2048; bird.y = -bird.height; bird.speed = 1 + Math.random() * 0.6; bird.lastIntersecting = false; game.addChild(bird); birds.push(bird); } // Initialize with 3 birds addBird(1); // Ensure there are always at least 3 birds on screen game.update = function () { // Existing update logic... // Check the number of birds on screen if (birds.length < 3) { addBird(Math.floor(Math.random() * 3) + 1); } // Update each bird birds.forEach(function (bird) { bird.update(); }); }; // Add a tree to the game var tree = game.addChild(new Tree()); tree.x = 2048 / 2; // Center the tree to prevent it from being cut off on the right side tree.y = 2732 - 50; // Position the tree on the grass // No need to create branches here as they are created in the Tree class var score = 0; var scoreImage = LK.getAsset('scoreImage', { anchorX: 0.5, anchorY: 0.5, x: 20, // Move left by 80px y: 1750 // Move down by 80px }); LK.gui.top.addChild(scoreImage); var scoreTxt = new Text2('0', { x: 200, y: 200, size: 100, fill: 0x00FF00, // Monochrome green color font: "Courier New", // Monospace font for score text stroke: 0x000000, // Outline with a thin black line strokeThickness: 5, // Thickness of the outline dropShadow: true, // Enable drop shadow dropShadowColor: 0x000000, // Black shadow dropShadowBlur: 5, // Blur level of the shadow dropShadowAngle: Math.PI / 6, // Angle of the shadow dropShadowDistance: 6 // Distance of the shadow }); // Add the cat to the game // Add the grass floor to the game var grass = new Grass(); grass.x = 1020; grass.y = 2735; // Position grass at the bottom game.addChild(grass); scoreTxt.x = 2048 / 2; // Center the score text horizontally scoreTxt.y = 2732 / 2; // Center the score text vertically LK.gui.top.addChild(scoreTxt); // Function to handle bgm1 end event function onBgm1End() { // Set a timer to replay bgm1 after 50-80 seconds var bgmTimer = LK.setTimeout(function () { LK.playMusic('bgm1', { loop: true, fade: { start: 0, end: 1, duration: 4000 }, onEnd: onBgm1End }); }, Math.random() * 30000 + 50000); } ; var cat = game.addChild(LK.getAsset('cat', { anchorX: 0.5, anchorY: 1, x: 2048 - 200, // Position the cat to the far right y: 2732 // Position the cat at the bottom of the screen })); // Play bgm1 at the lowest volume continuously LK.playMusic('bgm1', { loop: true, fade: { start: 0, end: 0.02, // Set to the lowest volume duration: 4000 } }); // Initialize a timer to play the wings1 sound at a random time between 10 and 30 seconds var wingsTimer = LK.setTimeout(function () { LK.getSound('wings1').play(); wingsTimer = LK.setTimeout(arguments.callee, Math.random() * 20000 + 10000); }, Math.random() * 20000 + 10000); // Create an array for all sounds except ufo1, including all birdsong sounds var sounds = ['cricket1', 'frog1', 'wings1', 'songbird1']; // Initialize random timers for each sound to play between 30-50 seconds sounds.forEach(function (soundId) { var sound = LK.getSound(soundId); var ambientSoundTimer = LK.setTimeout(function () { sound.play(); // Reset the timer to play the sound again between 30-50 seconds ambientSoundTimer = LK.setTimeout(arguments.callee, Math.random() * 20000 + 30000); }, Math.random() * 20000 + 30000); });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Branch asset
// Bird1 class to represent the first kind of bird
var Bird1 = Container.expand(function () {
var self = Container.call(this);
var birdGraphics = self.attachAsset('bird1', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 1.6 + 1;
self.update = function () {
if (self.lastY === undefined) {
self.lastY = self.y;
} // Initialize lastY for tracking changes on Y
self.y += self.speed;
self.lastY = self.y; // Update lastY after movement
self.x += Math.sin(self.y / 100) * 6.5; // Increase the swooping motion of the bird's movement by 30%
if (self.y > 2732) {
self.y = -self.height;
if (Math.random() < 0.33) {
self.x = Math.random() * 2048; // Start from a random position along the top
} else {
self.x = Math.random() < 0.5 ? 0 : 2048; // Start from either the left or right side
}
}
};
});
// Bird2 class to represent the second kind of bird
var Bird2 = Container.expand(function () {
var self = Container.call(this);
var birdGraphics = self.attachAsset('bird2b', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 1.6 + 1;
self.update = function () {
if (self.lastY === undefined) {
self.lastY = self.y;
} // Initialize lastY for tracking changes on Y
self.y += self.speed;
self.lastY = self.y; // Update lastY after movement
self.x += Math.sin(self.y / 100) * 6.5; // Increase the swooping motion of the bird's movement by 30%
if (self.y > 2732) {
self.y = Math.random() * 2732; // Random initial y position within the screen height
self.x = Math.random() < 0.5 ? 0 : 2048; // Start from either the left or right side
}
};
});
// Bird3 class to represent a third kind of bird
var Bird3 = Container.expand(function () {
var self = Container.call(this);
var birdGraphics = self.attachAsset('bird2', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 1.6 + 1;
self.update = function () {
if (self.lastY === undefined) {
self.lastY = self.y;
} // Initialize lastY for tracking changes on Y
self.y += self.speed;
self.lastY = self.y; // Update lastY after movement
self.x += Math.sin(self.y / 100) * 6.5; // Increase the swooping motion of the bird's movement by 30%
if (self.y > 2732) {
self.y = -self.height;
if (Math.random() < 0.33) {
self.x = Math.random() * 2048; // Start from a random position along the top
} else {
self.x = Math.random() < 0.5 ? 0 : 2048; // Start from either the left or right side
}
}
};
});
// Cloud class to represent clouds moving across the screen
var Cloud = Container.expand(function () {
var self = Container.call(this);
var cloudGraphics = self.attachAsset('cloud', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = (Math.random() * 0.5 + 0.5) * 0.4; // Reduce speed by 60% (20% slower than before)
self.hasAccelerated = false; // Track if the cloud has already accelerated
self.direction = Math.random() < 0.5 ? 1 : -1; // Random direction: 1 for right, -1 for left
self.update = function () {
self.x += self.speed * self.direction;
// If the cloud moves off-screen, reposition it to the opposite side
if (self.x > 2048 + self.width / 2) {
self.x = -self.width / 2;
} else if (self.x < -self.width / 2) {
self.x = 2048 + self.width / 2;
}
self.lastX = self.x; // Track last X position for future checks
// Check for overlap with other clouds
for (var i = 0; i < clouds.length; i++) {
if (clouds[i] !== self && self.intersects(clouds[i])) {
if (!self.hasAccelerated) {
var slowestSpeed = Math.min(self.speed, clouds[i].speed);
self.speed += slowestSpeed * 0.1; // Increase speed by 10% of the slowest cloud's speed
self.hasAccelerated = true; // Mark as accelerated
}
break;
}
}
// Check if the cloud intersects with the sun
if (!self.lastIntersecting && self.intersects(sun)) {
self.speed *= 1.5; // Increase speed by 50%
tween(cloudGraphics, {
alpha: 0.5
}, {
duration: 3000,
easing: tween.linear
});
} else if (self.lastIntersecting && !self.intersects(sun)) {
self.speed /= 1.5; // Reset speed to original
tween(cloudGraphics, {
alpha: 1.0
}, {
duration: 3000,
easing: tween.linear
});
}
self.lastIntersecting = self.intersects(sun);
};
});
// Grass class to represent the grass image
var Grass = Container.expand(function () {
var self = Container.call(this);
var grassGraphics = self.attachAsset('grass', {
anchorX: 0.5,
anchorY: 1
});
self.update = function () {
// Add any specific update logic for the grass here
};
});
// Sun class to represent a pulsating sun in the top right corner
var Sun = Container.expand(function () {
var self = Container.call(this);
var sunGraphics = self.attachAsset('sun', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = sunGraphics.width / 2;
self.y = sunGraphics.height / 2;
// Function to create a pulsating effect
function pulsate() {
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: pulsate
});
}
});
}
pulsate(); // Start the pulsating effect
});
// Tree class to represent a tree with a 9:16 aspect ratio
var Tree = Container.expand(function () {
var self = Container.call(this);
var treeGraphics = self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 1
});
self.update = function () {
// Add any specific update logic for the tree here
};
});
// UFO class to represent a UFO flying across the screen
var UFO = Container.expand(function () {
var self = Container.call(this);
var ufoGraphics = self.attachAsset('ufo', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3.2; // Decrease speed by 20%
self.direction = Math.random() < 0.5 ? 1 : -1; // Random direction: 1 for right, -1 for left
self.update = function () {
self.x += self.speed * self.direction;
self.y = 100 + Math.sin(self.x / 70) * 165; // Increase the wave pattern depth by 10%
// If the UFO moves off-screen, destroy it and set to null
if (self.x > 2048 + self.width / 2 || self.x < -self.width / 2) {
self.destroy();
ufo = null;
}
};
});
/****
* Initialize Game
****/
/****
* Assets
LK.init.shape('branch', {width:50, height:10, color:0x8b4513, shape:'box'})
****/
// Initialize clouds array
var game = new LK.Game({
backgroundColor: 0x87CEEB // Light blue background to simulate the sky
});
/****
* Game Code
****/
// Function to spawn a smart bird
function spawnSmartBird() {
// Randomly choose a bird type
var birdType;
do {
birdType = Math.floor(Math.random() * 3) + 1;
} while (birdType === lastBirdType);
lastBirdType = birdType;
var bird;
// Create a bird based on the chosen type
if (birdType === 1) {
bird = new Bird1();
} else if (birdType === 2) {
bird = new Bird2();
} else {
bird = new Bird3();
}
// Set initial position and speed
bird.x = Math.random() * 2048;
bird.y = -bird.height;
bird.speed = 1 + Math.random() * 0.6;
bird.lastIntersecting = false;
// Add the bird to the game and the birds array
LK.setTimeout(function () {
game.addChild(bird);
birds.push(bird);
}, 2000);
}
game.move = function (x, y, obj) {
// Reset the auto-targeting timer when the mouse moves
if (autoTargetingTimer) {
LK.clearTimeout(autoTargetingTimer);
}
if (!game.reticle) {
game.reticle = LK.getAsset('reticle1', {
anchorX: 0.5,
anchorY: 0.5
});
game.addChild(game.reticle);
}
game.reticle.x = x;
game.reticle.y = y;
// Start a new timer for auto-targeting
autoTargetingTimer = LK.setTimeout(startAutoTargeting, 5000);
};
// Function to start auto-targeting birds
function startAutoTargeting() {
autoTargetingActive = true;
}
// Function to update reticle position for auto-targeting
function updateAutoTargeting() {
if (autoTargetingActive) {
// Find the closest bird to target
var closestBird = null;
var minDistance = Infinity;
birds.forEach(function (bird) {
var distance = Math.sqrt(Math.pow(bird.x - game.reticle.x, 2) + Math.pow(bird.y - game.reticle.y, 2));
if (distance < minDistance) {
minDistance = distance;
closestBird = bird;
}
});
// Move reticle towards the closest bird
if (closestBird) {
game.reticle.x += (closestBird.x - game.reticle.x) * 0.1;
game.reticle.y += (closestBird.y - game.reticle.y) * 0.1;
}
}
}
var lastBirdType = null; // Track the last spawned bird type
var autoTargetingTimer = null;
var autoTargetingActive = true;
// Update function to handle auto-targeting
game.update = function () {
updateAutoTargeting();
// Existing update logic...
};
// Add a sun to the game in the top left corner
var sun = game.addChild(new Sun());
sun.x = 1750;
sun.y = 280;
// Function to add a UFO to the game
function addUFO() {
var ufo = game.addChild(new UFO());
ufo.x = Math.random() < 0.5 ? 2048 + ufo.width / 2 : -ufo.width / 2; // Start from either the far right or left edge of the screen
ufo.y = Math.random() * 500; // Random initial y position in the upper part of the screen
ufo.customUpdate = function () {
ufo.update();
};
LK.getSound('ufo1').play({
loop: true // Ensure the sound loops while the UFO is on screen
});
return ufo;
}
// Initialize clouds array
var clouds = [];
for (var i = 0; i < 4; i++) {
// Add 3 clouds for variety
var cloud = new Cloud();
cloud.x = Math.random() * 2048;
cloud.y = Math.random() * 500; // Position clouds in the upper part of the screen
clouds.push(cloud);
game.addChild(cloud);
}
// Initialize a timer to add a UFO at a random time between 30 and 50 seconds
var ufo; // Define the ufo variable in the global scope
var ufoTimer = LK.setTimeout(function () {
addUFO();
// Reset the timer with a new random time
ufoTimer = LK.setTimeout(arguments.callee, Math.random() * 20000 + 30000);
}, Math.random() * 20000 + 30000);
game.update = function () {
for (var i = 0; i < clouds.length; i++) {
clouds[i].update();
}
if (ufo) {
ufo.customUpdate();
// Check if the UFO has moved off-screen
if (ufo.lastX <= 2048 + ufo.width / 2 && ufo.x > 2048 + ufo.width / 2 || ufo.lastX >= -ufo.width / 2 && ufo.x < -ufo.width / 2) {
// Destroy the UFO and set it to null
ufo.destroy();
ufo = null;
// Stop the ufo1 sound
LK.getSound('ufo1').stop();
// Start a timer for the UFO to reappear between 30-50 seconds
ufoTimer = LK.setTimeout(function () {
ufo = addUFO();
}, Math.random() * 20000 + 30000);
} else {
// Ensure the ufo1 sound is playing while the UFO is on screen
if (!LK.getSound('ufo1').isPlaying() && ufo) {
LK.getSound('ufo1').play({
loop: true
});
}
}
ufo.lastX = ufo.x; // Update lastX for the UFO
}
// Handle collision and bouncing between all birds
birds.forEach(function (birdA, indexA) {
birds.forEach(function (birdB, indexB) {
if (indexA !== indexB && !birdA.lastIntersecting && birdA.intersects(birdB)) {
var dx = birdB.x - birdA.x;
var dy = birdB.y - birdA.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var minDist = (birdA.width + 10) / 2 + (birdB.width + 10) / 2;
if (distance < minDist) {
var angle = Math.atan2(dy, dx);
var targetX = birdA.x + Math.cos(angle) * minDist;
var targetY = birdA.y + Math.sin(angle) * minDist;
var ax = (targetX - birdB.x) * 0.02;
var ay = (targetY - birdB.y) * 0.02;
birdA.x -= ax;
birdA.y -= ay;
birdB.x += ax;
birdB.y += ay;
}
birdA.lastIntersecting = true;
birdB.lastIntersecting = true;
} else {
birdA.lastIntersecting = false;
birdB.lastIntersecting = false;
}
});
});
};
// Create an array to hold bird objects
var birds = [];
// bird1
// Function to add a bird to the game
function addBird(type) {
var bird;
if (type === 1) {
bird = new Bird1();
} else if (type === 2) {
bird = new Bird2();
} else {
bird = new Bird3();
}
bird.x = Math.random() * 2048;
bird.y = -bird.height;
bird.speed = 1 + Math.random() * 0.6;
bird.lastIntersecting = false;
game.addChild(bird);
birds.push(bird);
}
// Initialize with 3 birds
addBird(1);
// Ensure there are always at least 3 birds on screen
game.update = function () {
// Existing update logic...
// Check the number of birds on screen
if (birds.length < 3) {
addBird(Math.floor(Math.random() * 3) + 1);
}
// Update each bird
birds.forEach(function (bird) {
bird.update();
});
};
// Add a tree to the game
var tree = game.addChild(new Tree());
tree.x = 2048 / 2; // Center the tree to prevent it from being cut off on the right side
tree.y = 2732 - 50; // Position the tree on the grass
// No need to create branches here as they are created in the Tree class
var score = 0;
var scoreImage = LK.getAsset('scoreImage', {
anchorX: 0.5,
anchorY: 0.5,
x: 20,
// Move left by 80px
y: 1750 // Move down by 80px
});
LK.gui.top.addChild(scoreImage);
var scoreTxt = new Text2('0', {
x: 200,
y: 200,
size: 100,
fill: 0x00FF00,
// Monochrome green color
font: "Courier New",
// Monospace font for score text
stroke: 0x000000,
// Outline with a thin black line
strokeThickness: 5,
// Thickness of the outline
dropShadow: true,
// Enable drop shadow
dropShadowColor: 0x000000,
// Black shadow
dropShadowBlur: 5,
// Blur level of the shadow
dropShadowAngle: Math.PI / 6,
// Angle of the shadow
dropShadowDistance: 6 // Distance of the shadow
});
// Add the cat to the game
// Add the grass floor to the game
var grass = new Grass();
grass.x = 1020;
grass.y = 2735; // Position grass at the bottom
game.addChild(grass);
scoreTxt.x = 2048 / 2; // Center the score text horizontally
scoreTxt.y = 2732 / 2; // Center the score text vertically
LK.gui.top.addChild(scoreTxt);
// Function to handle bgm1 end event
function onBgm1End() {
// Set a timer to replay bgm1 after 50-80 seconds
var bgmTimer = LK.setTimeout(function () {
LK.playMusic('bgm1', {
loop: true,
fade: {
start: 0,
end: 1,
duration: 4000
},
onEnd: onBgm1End
});
}, Math.random() * 30000 + 50000);
}
;
var cat = game.addChild(LK.getAsset('cat', {
anchorX: 0.5,
anchorY: 1,
x: 2048 - 200,
// Position the cat to the far right
y: 2732 // Position the cat at the bottom of the screen
}));
// Play bgm1 at the lowest volume continuously
LK.playMusic('bgm1', {
loop: true,
fade: {
start: 0,
end: 0.02,
// Set to the lowest volume
duration: 4000
}
});
// Initialize a timer to play the wings1 sound at a random time between 10 and 30 seconds
var wingsTimer = LK.setTimeout(function () {
LK.getSound('wings1').play();
wingsTimer = LK.setTimeout(arguments.callee, Math.random() * 20000 + 10000);
}, Math.random() * 20000 + 10000);
// Create an array for all sounds except ufo1, including all birdsong sounds
var sounds = ['cricket1', 'frog1', 'wings1', 'songbird1'];
// Initialize random timers for each sound to play between 30-50 seconds
sounds.forEach(function (soundId) {
var sound = LK.getSound(soundId);
var ambientSoundTimer = LK.setTimeout(function () {
sound.play();
// Reset the timer to play the sound again between 30-50 seconds
ambientSoundTimer = LK.setTimeout(arguments.callee, Math.random() * 20000 + 30000);
}, Math.random() * 20000 + 30000);
});
an orange and white cat facing away from the camera. the cat is sitting straight up and looking up, ready to pounce. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
remove black box
fluffy translucent cloud. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
bright sun with wincing cartoon face and a black eye. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
a goofy ufo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
red gaming reticle. Minimal. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
sunny day, hilly landscape. there is an alien invasion taking place in the distance. cities burning.
large AUTUMN SHADES tree with sparse bunches of leaves. branches are exposed, but the tree is tough and old.. true-color, realistic, Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
glowing orange sphere. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
sideway view of a fighter jet. . . In-Game 2d asset. transparent background. horizontal. No shadows.
shiny purple and black attack ufo.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows