User prompt
Add the first part of Fish behavior to the update function: else if (type === 'Fish') { self.x += self.speedX; if (self.x <= coot.x && !self.isJumping) { self.speedX = 0; // Stop moving graphics.alpha = 0; // Disappear } if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
User prompt
Add the initial Fish setup right after the graphics initialization but before the update function: var Obstacle = Container.expand(function (type) { var self = Container.call(this); var graphics; var collisionBlock = self.addChild(new CollisionBlock()); collisionBlock.x = 0; collisionBlock.y = 0; graphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.speedX = -6; if (type === 'Eagle') { self.targetY = coot.isDiving || coot.isReturning ? coot.originalY : coot.y; self.speedY = (self.targetY - self.y) / 100; } else if (type === 'Fish') { self.isJumping = false; self.pauseTime = 0; graphics.tint = 0x4444ff; graphics.alpha = 0.7; }
User prompt
Fix the obstacle type definitions: 1. Remove the unused getRandomObstacleType() function since it's duplicating logic 2. Keep the spawn code with all types: ['Duck', 'Duck', 'Duck', 'Eagle', 'Fish'] 3. Make sure Fish has its initial Y position defined: 2732 * 0.90 Then we'll add the Fish behavior to the Obstacle class update function.
User prompt
Add this basic pause behavior to the Fish section: else if (type === 'Fish') { self.x += self.speedX; if (self.x <= coot.x && !self.isJumping) { graphics.alpha = 0; self.isPausing = true; } if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
User prompt
Add these initial states for the Fish type in the constructor: if (type === 'Fish') { self.speedX = -6; self.isJumping = false; self.isPausing = false; self.pauseTime = 0; graphics.tint = 0x4444ff; graphics.alpha = 0.7; }
User prompt
It changed the speed of other obstacles. The change should only be for the fish
User prompt
The fish is too fast
User prompt
The Fish needs underwater visuals from the start. Add these initialization settings in the Obstacle constructor when type is Fish: if (type === 'Fish') { self.speedX = -6; self.isJumping = false; graphics.tint = 0x4444ff; // Set underwater blue tint initially graphics.alpha = 0.7; // Set underwater opacity initially } And make sure the jumping section's tint transition stays: if (self.isJumping) { self.jumpTime += 0.1; var jumpHeight = -Math.sin(self.jumpTime) * 300; self.y = self.jumpStartY + jumpHeight; // Change appearance based on height graphics.tint = self.y < self.jumpStartY - 50 ? 0xffffff : 0x4444ff; graphics.alpha = self.y < self.jumpStartY - 50 ? 1.0 : 0.7; if (self.jumpTime > Math.PI) { self.destroy(); } }
User prompt
That didn’t work. Now I can see it refreshing. Needs to refresh sooner.
User prompt
The foreground is getting a gap between instances. Please fix
User prompt
Update the Fish section to include both trigger and jumping motion: else if (type === 'Fish') { // Move horizontally self.x += self.speedX; // Check if crossing under Coot if (self.x <= coot.x && !self.isJumping) { console.log('Fish aligned with Coot!'); self.isJumping = true; self.jumpStartY = self.y; self.jumpTime = 0; } // Handle jumping motion if (self.isJumping) { self.jumpTime += 0.1; // Create arc motion: rise fast, fall slower var jumpHeight = -Math.sin(self.jumpTime) * 300; // Adjust 300 to change jump height self.y = self.jumpStartY + jumpHeight; // Change appearance based on position graphics.tint = self.y < self.jumpStartY - 50 ? 0xffffff : 0x4444ff; graphics.alpha = self.y < self.jumpStartY - 50 ? 1.0 : 0.7; // Destroy after completing arc if (self.jumpTime > Math.PI) { self.destroy(); } } // Normal destroy check if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
User prompt
Update the Fish section to check distance from Coot: else if (type === 'Fish') { console.log('Fish update running'); if (Math.abs(self.x - coot.x) < 100) { // Trigger when within 100 pixels console.log('Fish near Coot!'); self.isJumping = true; self.jumpStartY = self.y; } if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
User prompt
Add this basic Fish check to the Obstacle class update function: else if (type === 'Fish') { console.log('Fish update running'); if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
User prompt
Now add the jumping motion for the Fish: - Increment jumpTime in small steps - Use sine function for smooth up/down arc - Change tint/alpha based on height - Destroy after completing the arc Show me just the jumping calculation part of the update function.
User prompt
Add these variables at the start of the Fish type initialization: - isJumping flag - jumpStartY to store original position - jumpTime counter Then add a simple position check in the Fish update to start the jump when near the Coot.
User prompt
When fish reaches coot Y position. Have it turn clockwise 90 degrees and jump into the air. Set a isjumping state for the fish. Max height should be the same as the Coots jump max height. At the top of the jump it should fall
User prompt
Move fish spawn Y position up 10%
User prompt
Add a new obstacle called Fish to the obstacle class. It’s starting position will be off the right of the screen on the same Y position as the bottom of the Coots dive
User prompt
Increase game speed
User prompt
Add a global variable for game speed that can be decreased or increased to affect all classes speed.
User prompt
Slow down the spawn rate of the eagle feathers, but spawn them 2-3 at a time
User prompt
Give the eagle feathers more of an upward trajectory on spawn as if the wind is blowing them upwards.
User prompt
Slow down eagle feather generation as the eagle slows down
User prompt
Let's create an EagleFeather class that creates drifting feathers from the Eagle: 1. Create a new EagleFeather class similar to the Ripple pattern: ```javascript var EagleFeather = Container.expand(function() { // Initialize with: - Random rotation - Downward and sideways drift speeds - Gradual rotation as it falls - Fade out over time before destroying - Starting position relative to eagle's position ``` 2. In the Obstacle class, for Eagle type: - Add feather spawn timing like we did with ripples - Spawn feathers periodically during flight - More frequent spawning during swooping/diving - Position feathers at eagle's trailing edge 3. Feather behavior should include: - Swaying motion as it falls (sine wave) - Gradual decrease in speed - Random initial trajectory - Rotation that matches the drift direction Please show both the EagleFeather class and the Eagle spawn code with these effects.
User prompt
Make an Eaglefeather class. Generate them like particles, occasionally drifting off of the back of the Eagle as it swoops before fading away.
/**** * Classes ****/ var CollisionBlock = Container.expand(function () { var self = Container.call(this); var collisionBlockGraphics = self.attachAsset('Collisionblock', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); }); // Assets will be automatically created and loaded by the LK engine based on their usage in the code. // Example assets: 'coot', 'obstacle', 'background' // Class for the main character, the American coot var Coot = Container.expand(function () { var self = Container.call(this); var cootGraphics = self.attachAsset('coot', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6.5; self.jumpVelocity = 40; // Increased initial upward velocity for jump self.gravity = 1.0; // Gravity to apply during jump self.jumpHeight = 105; self.isJumping = false; self.isReturning = false; // New state to handle returning to top after diving self.update = function () { if (self.isJumping) { self.x += self.speed * 0.1; // Apply forward movement while in the air self.y -= self.jumpVelocity; // Move upwards with initial velocity self.jumpVelocity -= self.gravity; // Apply gravity to slow down ascent if (self.jumpVelocity <= 0) { self.isJumping = false; // Stop jumping when upward velocity is zero self.isFalling = true; // Start falling } } else if (self.isFalling) { self.y += self.gravity * 5; // Apply even more increased gravity to fall down faster if (self.y >= self.originalY) { self.y = self.originalY; // Ensure Coot doesn't go below original position self.isFalling = false; // Stop falling self.x = self.originalX; // Reset X position when jump completes self.jumpVelocity = 40; // Reset jump velocity for next jump self.isJumping = false; // Ensure jumping state is reset // Removed unnecessary isReturning reset in the falling state } // Remove wobble and water particles during falling cootGraphics.rotation = 0; // Reset rotation to remove wobble } else if (self.isDiving) { self.y += self.speed * 1.5; cootGraphics.alpha = Math.max(0.5, cootGraphics.alpha - 0.05); // Gradually decrease opacity cootGraphics.tint = 0x0000ff; // Change tint to blue if (self.y >= 2732 * 0.90) { self.y = 2732 * 0.90; // Ensure Coot doesn't go below this point self.isDiving = false; // Stop diving self.returnDelay = Date.now() + 1000; // 1 second delay using time } } else if (self.returnDelay > 0) { if (Date.now() >= self.returnDelay) { self.returnDelay = 0; // Reset returnDelay after it is used if (self.y >= 2732 * 0.90) { self.isReturning = true; // Start returning after delay } } } else if (self.isReturning) { self.y -= self.speed * 1.5; // Match surfacing speed with descent speed var transitionFactor = 1 - (self.y - self.originalY) / (2732 * 0.90 - self.originalY); cootGraphics.alpha = 0.5 + 0.5 * transitionFactor; // Smoothly increase opacity // Convert tint colors to RGB and interpolate var startTint = self.underwaterTint; var endTint = 0xffffff; var r = (startTint >> 16 & 0xff) + ((endTint >> 16 & 0xff) - (startTint >> 16 & 0xff)) * transitionFactor; var g = (startTint >> 8 & 0xff) + ((endTint >> 8 & 0xff) - (startTint >> 8 & 0xff)) * transitionFactor; var b = (startTint & 0xff) + ((endTint & 0xff) - (startTint & 0xff)) * transitionFactor; cootGraphics.tint = (r << 16) + (g << 8) + b; // Apply interpolated tint if (self.y <= self.originalY) { self.y = self.originalY; self.isReturning = false; // Reset returning state cootGraphics.alpha = 1.0; // Ensure opacity is fully reset cootGraphics.tint = 0xffffff; // Reset tint to normal color when fully surfaced } // Removed redundant isReturning block to ensure visual effects are not reset prematurely if (self.isReturning) { self.x += (self.originalX - self.x) * 0.1; // Gradually slide back to original X position } } // Add wobble effect to the coot while running if (!self.isJumping && !self.isDiving && !self.isReturning && !self.isFalling) { cootGraphics.rotation = Math.sin(LK.ticks / 10) * 0.1; // Add wobble effect when not jumping, diving, or returning // Generate 1-2 water splash particles every 60 ticks (1 second) only when not jumping, diving, or falling if (!self.isJumping && !self.isDiving && !self.isFalling && LK.ticks % 60 == 0) { var numParticles = Math.floor(Math.random() * 2) + 1; for (var i = 0; i < numParticles; i++) { var splashLeft = new Splash(); splashLeft.x = self.x - cootGraphics.width / 2; splashLeft.y = self.y + cootGraphics.height / 2; game.addChildAt(splashLeft, game.getChildIndex(foreground1) - 1); var splashRight = new Splash(); splashRight.x = self.x + cootGraphics.width / 2; splashRight.y = self.y + cootGraphics.height / 2; game.addChildAt(splashRight, game.getChildIndex(foreground1) - 1); } } } }; self.isDiving = false; self.jump = function () { if (!self.isJumping && !self.isDiving && !self.isReturning) { self.isJumping = true; self.originalX = self.x; // Removed X position update from jump function self.isReturning = false; // Ensure returning state is reset when jumping self.originalY = self.y; } }; self.dive = function () { if (!self.isJumping && !self.isDiving) { self.isDiving = true; self.returnDelay = Date.now() + 5000; // Set return delay to 5 seconds using time self.isReturning = false; // Ensure returning state is reset when diving self.underwaterTint = 0x4444ff; // Set initial underwater tint color // Removed duplicate isReturning = false line self.originalX = self.x; self.originalY = self.y; self.y += self.speed * 2; // Start diving downwards immediately with increased speed // Generate water splash particles var numParticles = Math.floor(Math.random() * 3) + 2; // Generate 2-4 particles for (var i = 0; i < numParticles; i++) { var splash = new Splash(); splash.x = self.x; splash.y = self.y + cootGraphics.height / 2; game.addChildAt(splash, game.getChildIndex(foreground1) - 1); } } }; }); var EagleFeather = Container.expand(function () { var self = Container.call(this); var featherGraphics = self.attachAsset('Eaglefeather', { anchorX: 0.5, anchorY: 0.5 }); // Initialize feather properties self.rotationSpeed = Math.random() * 0.02 - 0.01; // Random rotation speed self.driftX = Math.random() * 2 - 1; // Random sideways drift self.driftY = Math.random() * 1 + 1; // Downward drift self.fadeRate = 0.005; // Fade out rate self.update = function () { self.x += self.driftX; self.y += self.driftY; featherGraphics.rotation += self.rotationSpeed; featherGraphics.alpha -= self.fadeRate; // Destroy feather when fully faded if (featherGraphics.alpha <= 0) { self.destroy(); } }; }); // Class for the foreground var Foreground = Container.expand(function () { var self = Container.call(this); var foregroundGraphics = self.attachAsset('Foreground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.update = function () { self.x -= self.speed; if (self.x <= -self.width / 2) { self.x += self.width * 2; } }; }); // Class for the midgroundtrees var Midgroundtrees = Container.expand(function () { var self = Container.call(this); var midgroundtreesGraphics = self.attachAsset('Midgroundtrees', { anchorX: 0.5, anchorY: 0.7 }); self.speed = 3; self.update = function () { self.x -= self.speed; // self.y = coot.y; if (self.x <= -self.width / 2) { self.x += self.width * 2; } }; }); // Class for the Obstacle (Duck and Eagle combined) var Obstacle = Container.expand(function (type) { var self = Container.call(this); var graphics; var collisionBlock = self.addChild(new CollisionBlock()); collisionBlock.x = 0; collisionBlock.y = 0; graphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); // Add a Ripple instance to the Duck obstacle if (type === 'Duck') { self.lastRippleTime = Date.now(); var ripple = new Ripple(); ripple.x = 0; // Center the ripple on the Duck ripple.y = graphics.height / 2; // Position the ripple at the bottom of the Duck self.addChildAt(ripple, 0); // Add ripple below the Duck but above the water layer } self.speedX = -6; if (type === 'Eagle') { self.lastFeatherTime = Date.now(); self.targetY = coot.isDiving || coot.isReturning ? coot.originalY : coot.y; self.speedY = (self.targetY - self.y) / 100; } self.update = function () { self.x += self.speedX; if (type === 'Eagle') { self.y += self.speedY; if (Date.now() - self.lastFeatherTime >= 300) { // Feather spawn every 300ms var feather = new EagleFeather(); feather.x = self.x; feather.y = self.y + graphics.height / 2; game.addChildAt(feather, game.getChildIndex(self) - 1); self.lastFeatherTime = Date.now(); } if (self.x <= -self.width / 2) { console.log("Checking for destruction: Eagle at " + self.x); self.destroy(); // Destroy the obstacle when it moves off-screen Obstacle.lastDestroyTime = Date.now(); // Set lastDestroyTime when destroyed console.log("Obstacle destroyed at " + Obstacle.lastDestroyTime); } if (self.y < self.targetY) { self.speedY = (self.targetY - self.y) / 100; } else { self.speedY = 0; } } else if (type === 'Duck') { // Add wobble effect to Duck graphics.rotation = Math.sin(LK.ticks / 20) * 0.05; // Ripple spawn logic if (Date.now() - self.lastRippleTime >= 500) { var ripple = new Ripple(); ripple.x = self.x; ripple.y = self.y + graphics.height / 2; game.addChildAt(ripple, game.getChildIndex(self) - 1); self.lastRippleTime = Date.now(); } // Existing destroy logic if (self.x <= -self.width / 2) { console.log("Checking for destruction: Duck at " + self.x); self.destroy(); Obstacle.lastDestroyTime = Date.now(); console.log("Obstacle destroyed at " + Obstacle.lastDestroyTime); } } collisionBlock.x = 0; collisionBlock.y = 0; }; }); var Ripple = Container.expand(function () { var self = Container.call(this); var rippleGraphics = self.attachAsset('Ripple', { anchorX: 0.5, anchorY: 0.5 }); self.initialScale = 0.05; self.growthRate = 0.02; self.fadeRate = 0.01; self.maxScale = 2.0; rippleGraphics.scaleX = self.initialScale; rippleGraphics.scaleY = self.initialScale; self.update = function () { console.log("Ripple update called"); rippleGraphics.scaleX += self.growthRate; rippleGraphics.scaleY += self.growthRate; rippleGraphics.alpha -= self.fadeRate; console.log("Ripple scale:", rippleGraphics.scaleX, "Ripple alpha:", rippleGraphics.alpha); if (rippleGraphics.scaleX >= self.maxScale || rippleGraphics.alpha <= 0) { console.log("Ripple destroyed"); self.destroy(); } }; }); // Static respawn delay property // Class for the water splash particles var Splash = Container.expand(function () { var self = Container.call(this); var scale = Math.random() * 0.75 + 0.25; var splashGraphics = self.attachAsset('Watersplash', { anchorX: 0.5, anchorY: 0.5, scaleX: scale, scaleY: scale }); self.speedX = Math.random() * 2 - 1; // Random speed in X direction self.speedY = -Math.random() * 5; // Random upward speed in Y direction self.gravity = 0.1; // Gravity to pull the particle down self.update = function () { self.x += self.speedX; self.y += self.speedY; self.speedY += self.gravity; // Apply gravity // Add rotation based on the speed of the particle self.rotation += self.speedX / 10; if (self.y > 2732) { // If the particle is below the screen self.destroy(); // Destroy the particle } }; }); // Class for the water var Water = Container.expand(function () { var self = Container.call(this); var waterGraphics = self.attachAsset('Water', { anchorX: 0.5, anchorY: 0.7 }); self.speed = 2; self.update = function () { self.x -= self.speed; // self.y = midgroundtrees1.y + midgroundtrees1.height / 2; if (self.x <= -self.width / 2) { self.x += self.width * 2; } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ Obstacle.getRandomDelay = function (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }; Obstacle.spawnDelay = 2500; // Default fallback Obstacle.respawnDelay = { Eagle: Obstacle.getRandomDelay(2000, 3000), Duck: Obstacle.getRandomDelay(2000, 3000) }; Obstacle.lastDestroyTime = Date.now() - 5000; // Initialize to ensure first spawn check passes console.log("Initial lastDestroyTime: " + Obstacle.lastDestroyTime); var background = game.addChild(LK.getAsset('Background', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, scaleX: 2048 / 2500, scaleY: 2732 / 2500 })); // Initialize the midgroundtrees var midgroundtrees1 = game.addChild(new Midgroundtrees()); midgroundtrees1.x = 2048 / 2; midgroundtrees1.y = 2732 * 0.7; var midgroundtrees2 = game.addChild(new Midgroundtrees()); midgroundtrees2.x = 2048 / 2 + midgroundtrees2.width; midgroundtrees2.y = 2732 * 0.7; // Initialize the water var water1 = game.addChild(new Water()); water1.x = 2048 / 2; water1.y = midgroundtrees1.y + midgroundtrees1.height / 2; var water2 = game.addChild(new Water()); water2.x = 2048 / 2 + water2.width; water2.y = midgroundtrees2.y + midgroundtrees2.height / 2; // Initialize game variables var coot = game.addChild(new Coot()); coot.x = 2048 * 0.20; coot.y = 2732 * 0.75; coot.originalY = coot.y; // Initialize originalY position var score = 0; var currentObstacle = null; // Initialize the foreground var foreground1 = game.addChild(new Foreground()); foreground1.x = 2048 / 2; foreground1.y = 2732 * 0.9; var foreground2 = game.addChild(new Foreground()); foreground2.x = 2048 / 2 + foreground2.width; foreground2.y = 2732 * 0.9; var scoreTxt = new Text2('0', { size: 100, fill: "#ffffff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Handle game updates game.update = function () { coot.update(); if (LK.ticks % 60 == 0) { score++; scoreTxt.setText(score); } // Check for collision between the Coot and the Collision Block of the current obstacle if (currentObstacle && coot.intersects(currentObstacle.children[0])) { LK.showGameOver(); } // Update the midgroundtrees midgroundtrees1.update(); midgroundtrees2.update(); // Update the water water1.update(); water2.update(); // Update the current obstacle // Check if the current obstacle needs destruction if (currentObstacle && currentObstacle.x < -currentObstacle.width / 2) { currentObstacle.destroy(); Obstacle.lastDestroyTime = Date.now(); console.log("Obstacle destroyed at " + Obstacle.lastDestroyTime); currentObstacle = null; } // Check if it's time to spawn a new obstacle function getRandomObstacleType() { var obstacleTypes = ['Duck', 'Duck', 'Duck', 'Eagle']; // Further increase Duck probability console.log("Obstacle types array: ", obstacleTypes); console.log("Obstacle types array: ", obstacleTypes); var randomIndex = Math.floor(Math.random() * obstacleTypes.length); console.log("Random index generated: ", randomIndex); console.log("Random index generated: ", randomIndex); var obstacleType = obstacleTypes[randomIndex]; console.log("Selected obstacle type: ", obstacleType); return obstacleType; } if (!currentObstacle && Date.now() - Obstacle.lastDestroyTime >= Obstacle.spawnDelay) { var obstacleTypes = ['Duck', 'Duck', 'Duck', 'Eagle']; var randomIndex = Math.floor(Math.random() * obstacleTypes.length); var obstacleType = obstacleTypes[randomIndex]; console.log("Selected obstacle type: ", obstacleType); currentObstacle = game.addChild(new Obstacle(obstacleType)); currentObstacle.x = 2048 + currentObstacle.width / 2; // Ensure it starts off-screen currentObstacle.y = obstacleType === 'Duck' ? 2732 * 0.75 : 2732 * 0.25; // Adjust Eagle's initial Y position console.log("Spawned " + obstacleType + " at " + Date.now()); } if (currentObstacle) { currentObstacle.update(); } // Update the foreground foreground1.update(); foreground2.update(); }; // Handle touch events for jumping and diving game.down = function (x, y, obj) { dragStartY = y; // Record the initial y position when touch starts }; game.move = function (x, y, obj) { if (dragStartY !== null) { if (y - dragStartY > 50 && coot.y === coot.originalY) { // Check if the drag is downward and significant coot.dive(); dragStartY = null; // Reset dragStartY to prevent repeated dives } else if (dragStartY - y > 50 && coot.y === coot.originalY) { // Check if the drag is upward and significant coot.jump(); dragStartY = null; // Reset dragStartY to prevent repeated jumps } } }; game.up = function (x, y, obj) { dragStartY = null; // Reset dragStartY when touch ends };
===================================================================
--- original.js
+++ change.js
@@ -132,21 +132,25 @@
}
}
};
});
-var Eaglefeather = Container.expand(function () {
+var EagleFeather = Container.expand(function () {
var self = Container.call(this);
var featherGraphics = self.attachAsset('Eaglefeather', {
anchorX: 0.5,
anchorY: 0.5
});
- self.speedX = -2;
- self.speedY = Math.random() * 2 - 1; // Random drift
- self.fadeRate = 0.01;
+ // Initialize feather properties
+ self.rotationSpeed = Math.random() * 0.02 - 0.01; // Random rotation speed
+ self.driftX = Math.random() * 2 - 1; // Random sideways drift
+ self.driftY = Math.random() * 1 + 1; // Downward drift
+ self.fadeRate = 0.005; // Fade out rate
self.update = function () {
- self.x += self.speedX;
- self.y += self.speedY;
+ self.x += self.driftX;
+ self.y += self.driftY;
+ featherGraphics.rotation += self.rotationSpeed;
featherGraphics.alpha -= self.fadeRate;
+ // Destroy feather when fully faded
if (featherGraphics.alpha <= 0) {
self.destroy();
}
};
@@ -202,15 +206,24 @@
self.addChildAt(ripple, 0); // Add ripple below the Duck but above the water layer
}
self.speedX = -6;
if (type === 'Eagle') {
+ self.lastFeatherTime = Date.now();
self.targetY = coot.isDiving || coot.isReturning ? coot.originalY : coot.y;
self.speedY = (self.targetY - self.y) / 100;
}
self.update = function () {
self.x += self.speedX;
if (type === 'Eagle') {
self.y += self.speedY;
+ if (Date.now() - self.lastFeatherTime >= 300) {
+ // Feather spawn every 300ms
+ var feather = new EagleFeather();
+ feather.x = self.x;
+ feather.y = self.y + graphics.height / 2;
+ game.addChildAt(feather, game.getChildIndex(self) - 1);
+ self.lastFeatherTime = Date.now();
+ }
if (self.x <= -self.width / 2) {
console.log("Checking for destruction: Eagle at " + self.x);
self.destroy(); // Destroy the obstacle when it moves off-screen
Obstacle.lastDestroyTime = Date.now(); // Set lastDestroyTime when destroyed
@@ -220,16 +233,8 @@
self.speedY = (self.targetY - self.y) / 100;
} else {
self.speedY = 0;
}
- // Generate Eaglefeather particles
- if (Math.random() < 0.1) {
- // 10% chance to generate a feather each frame
- var feather = new Eaglefeather();
- feather.x = self.x - graphics.width / 2;
- feather.y = self.y;
- game.addChildAt(feather, game.getChildIndex(self) - 1);
- }
} else if (type === 'Duck') {
// Add wobble effect to Duck
graphics.rotation = Math.sin(LK.ticks / 20) * 0.05;
// Ripple spawn logic
American Coot sprite sheet. Running with wings up.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A beautiful blue sky background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Grass and reeds foreground layer for endless runner. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
White water bubble. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A mallard floating on the water. Looking left. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A swimming salmon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A single golden coin with the head of an American Coot on it.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
The sun. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Game icon for a video game called “Coot Run”. Show an American Coot with its wings up and its foot big in the foreground. Show the name of the game big in the center with the coots foot underneath.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A moon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A starry sky background image. High resolution. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A fiery Phoenix with wings outspread.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A dark blue rectangle background with rounded edges to place text on top of for a menu.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
An owl with talons extended downwards and wings up. Looking down. Color Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A captain’s hat. Side profile. Cartoon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A rainbow hat with a propeller on the top. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A striped beanie. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A white SVG with big bold letters, that says “Start”. A couple black feathers flying off the edge of the word. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A white SVG with big bold letters, that says “How to play”. A couple black feathers flying off the edge of the word. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A sombrero. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A knights helmet. Side view. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A horned Viking cap. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
An astronauts helmet. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A cowboy hat. Full side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
duck
Sound effect
eagle
Sound effect
fishsplash
Sound effect
jumpsound
Sound effect
dashsound
Sound effect
backgroundmusic
Music
coin
Sound effect
powerup
Sound effect
coothurt
Sound effect
owl
Sound effect
phoenix
Sound effect
alert
Sound effect
cootdive
Sound effect
whistle
Sound effect