User prompt
Lessen the wobble on the duck
User prompt
Add a wobble to the Duck obstacle.
User prompt
Let's modify the ripples to create a concentric water ring effect: 1. In the Obstacle class (Duck section), make ripples spawn much more frequently: ```javascript // Spawn every 100ms or even faster if (Date.now() - self.lastRippleTime >= 100) { ``` 2. For the Ripple class, adjust for concentric circle effect: ```javascript self.initialScale = 0.005; // Start very tiny self.growthRate = 0.01; // Grow slower self.fadeRate = 0.008; // Fade slower self.maxScale = 0.5; // Smaller max size self.update = function () { // Smooth, constant expansion rippleGraphics.scaleX += self.growthRate; rippleGraphics.scaleY += self.growthRate; rippleGraphics.alpha = 1.0 - (rippleGraphics.scaleX / self.maxScale); // Fade based on size } ``` This should create multiple small rings expanding outward simultaneously, creating a rippling water effect under the duck.
User prompt
The Ripple needs tuning to create a better expansion effect. Modify the Ripple class to: 1. Start much smaller and expand more dramatically: ```javascript self.initialScale = 0.01; // Start extremely small self.growthRate = 0.03; // Grow faster self.fadeRate = 0.015; // Fade a bit faster self.maxScale = 1.0; // Smaller max size for more frequent ripples ``` 2. Add acceleration to the growth: ```javascript self.currentGrowth = self.growthRate; // Track current growth rate self.update = function () { // Accelerate growth slightly each frame self.currentGrowth *= 1.05; // Apply accelerating growth rippleGraphics.scaleX += self.currentGrowth; rippleGraphics.scaleY += self.currentGrowth; rippleGraphics.alpha -= self.fadeRate; // Destroy check remains the same } ``` Please show the complete updated Ripple class with these modifications.
User prompt
The Ripples should start very small and expand
User prompt
Add a spin on the X axis for Ripples
User prompt
Add a spin on the Y axis to ripples
User prompt
Add a anti clockwise rotation to ripples
User prompt
The Duck's ripple spawning needs two specific fixes: 1. Move these lines to the Duck initialization in the Obstacle constructor: ```javascript if (type === 'Duck') { self.lastRippleTime = Date.now(); } ``` 2. Then modify the Duck section of the update function to: ```javascript else if (type === 'Duck') { // 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); } } ``` Please show the updated Obstacle class with these changes.
User prompt
The Ripple class exists but isn't working as intended. Let's fix two things: 1. In the Obstacle class for Duck type: - Add a ripple spawn timer - Create new ripples at regular intervals - Add something like: ```javascript if (type === 'Duck') { self.lastRippleTime = 0; // In update function: if (Date.now() - self.lastRippleTime >= 500) { // Spawn every 500ms var ripple = new Ripple(); ripple.x = self.x; ripple.y = self.y + self.height/2; game.addChildAt(ripple, game.getChildIndex(self) - 1); self.lastRippleTime = Date.now(); } } ``` 2. For the Ripple class: - Make sure ripple.update() is being called each frame - Adjust the growth and fade rates (current values might be too small) - Add console.log to track ripple lifecycle Please show both the Duck obstacle spawn code and the Ripple update changes.
User prompt
Now the Ripple isn’t moving at all
User prompt
The ripple just looks like it’s blinking. Multiple rings have to be spawned and slowly grow and expand outwards.
User prompt
I want to create a water ripple effect under the duck obstacles using expanding rings. Here's what I'm looking for: 1. Using the Ripple class to: - Starts very small (nearly invisible) - Gradually expands in size - Fades in opacity as it expands - Disappears when reaching maximum size - Uses a simple circle or ring shape 2. For the spawning system: - Continuously spawn new rings while duck exists - Each ring starts at the duck's position - Maybe spawn a new ring every X milliseconds - Multiple rings should be visible simultaneously at different sizes - Rings should be visually underneath the duck 3. Properties needed: - Initial size/scale - Growth rate - Fade rate - Maximum size before disappearing - Spawn interval Please show how to implement this ripple effect that creates a continuous animation of expanding rings under the duck obstacles.
User prompt
I want to add a water ring animation using the Ripple class. Ripples should start very small from under the center of the duck and grow quickly before fading away.
User prompt
Ripple should be on the layer below Duck obstacle, but above water layer
User prompt
Remove the movement update code from the ripple class
User prompt
Add a ripple to the Duck obstacle and pin it there.
User prompt
Ripple should be on a layer above water, but below duck
User prompt
Attach a ripple to duck and pin it there.
User prompt
Add a Ripple class
User prompt
Let's fix the obstacle spawn timing and selection order: 1. First, create a function for random delay generation: ```javascript Obstacle.getRandomDelay = function(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }; ``` 2. Set base delays with ranges: ```javascript Obstacle.spawnDelay = 2500; // Default fallback Obstacle.respawnDelay = { Eagle: Obstacle.getRandomDelay(2000, 3000), Duck: Obstacle.getRandomDelay(2000, 3000) }; ``` 3. Importantly, restructure the spawn logic to: - FIRST check if enough time has passed since last destroy - THEN select the obstacle type - This way the type selection isn't biased by delay times The spawn code should look like: ```javascript if (!currentObstacle && Date.now() - Obstacle.lastDestroyTime >= Obstacle.spawnDelay) { // Only choose obstacle type AFTER we know we can spawn var obstacleTypes = ['Duck', 'Duck', 'Duck', 'Eagle']; var randomIndex = Math.floor(Math.random() * obstacleTypes.length); var obstacleType = obstacleTypes[randomIndex]; // Then create the obstacle } ``` Please show the complete implementation with this ordering.
User prompt
The initial spawn timing needs fixing: 1. For the first obstacle: - Set `Obstacle.lastDestroyTime = 0` or `Obstacle.lastDestroyTime = Date.now() - 5000` at game start - This ensures the first spawn check will pass regardless of type 2. Keep the delay settings: ```javascript Obstacle.spawnDelay = 2000; Obstacle.respawnDelay = { Eagle: 2000, Duck: 3000 }; ``` Please show the corrected initialization code.
User prompt
In the Obstacle class's update function, the Duck type isn't setting lastDestroyTime when destroyed. Please modify the two destroy sections to be identical: 1. Change the Duck's destroy code to match Eagle's: ```javascript 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); } ``` 2. Keep all other code exactly the same. Show me the complete update function with this single change.
User prompt
The obstacle spawning is favoring Eagles despite having more Ducks in the array. Let's debug this: 1. Add logging to track the random selection: - Log the randomIndex value when generated - Log the full obstacleTypes array - Log each attempt at type selection 2. Move the type selection into its own function: - Create a getRandomObstacleType() function - Add weights or probabilities for each type - Verify the selection is working before spawn check 3. Add console logging: - Log both before and after type selection - Track if the spawn conditions are being met differently for each type - Verify the respawnDelay values for each type Please show how to track the obstacle type selection and verify it's working as intended.
User prompt
Only eagles are being generated. Debug
/**** * 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); } } }; }); // 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.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 (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') { // 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); rippleGraphics.rotation += 0.1; // Add Y-axis spin effect 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
@@ -240,10 +240,10 @@
console.log("Ripple update called");
rippleGraphics.scaleX += self.growthRate;
rippleGraphics.scaleY += self.growthRate;
rippleGraphics.alpha -= self.fadeRate;
- rippleGraphics.rotation -= 0.05; // Add anti-clockwise rotation
- console.log("Ripple scale:", rippleGraphics.scaleX, "Ripple alpha:", rippleGraphics.alpha, "Ripple rotation:", rippleGraphics.rotation);
+ console.log("Ripple scale:", rippleGraphics.scaleX, "Ripple alpha:", rippleGraphics.alpha);
+ rippleGraphics.rotation += 0.1; // Add Y-axis spin effect
if (rippleGraphics.scaleX >= self.maxScale || rippleGraphics.alpha <= 0) {
console.log("Ripple destroyed");
self.destroy();
}
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