User prompt
This rotation should continue until they're pointing at 90 degrees downward, and then should go back to normal the moment they flap.
User prompt
The player's character and the flap image should have their right side dip towards the ground when they're falling slowly.
User prompt
The flap image should always be 100% transparent while it's visible. Sorry, 100% opaque while it's visible.
User prompt
Actually, that's too long. Make it about a quarter second.
User prompt
The flap image should display for about a half a second.
User prompt
The flap image should also be doubled in size.
User prompt
Let's double the size of the player's character.
User prompt
Add instructions when the game begins that tells the player how to play.
User prompt
Copy the game over state but not the pop-up when the game begins where everything is frozen and nothing is playing.
User prompt
Freeze all assets on screen until the player presses the Start button.
User prompt
The game is starting before the player clicks the start button. It needs to not start, and the pelican should not be flying. It should be motionless until the start button is pressed.
User prompt
Create a pop-up that includes instructions for the player and a start button. The game will not begin until the player has pressed the start button from this pop-up menu.
User prompt
When the game starts, gameplay should be frozen.
User prompt
The game should be in the Game Over state before the game begins and the player clicks the Start button.
User prompt
Let's prevent the game from starting until the user clicks the screen button that says OK, start.
User prompt
Let's change the color from orange to black for the plus 10 and increase the size of the stroke.
User prompt
Let's make the stroke thicker for the player score at the top of the screen.
User prompt
Let's add a 4-pixel stroke to the player's score at the top of the screen.
User prompt
Let's give the plus 10 text a white outline
User prompt
Let's double the size of the yum graphic and raise the plus 10 higher so it doesn't overlap.
User prompt
The Yum! graphic will have its own unique art.
User prompt
Let's create a new graphic that will appear when the fish is eaten to replace the yum text.
User prompt
The boat should actually appear randomly as the game goes on, and shouldn't appear more than twice every 60 seconds, and only ever one at a time.
User prompt
The boat's opacity should be 80%.
User prompt
Slow the boat by half its speed.
/**** * Classes ****/ // Boat class var Boat = Container.expand(function () { var self = Container.call(this); var boatGraphics = self.attachAsset('boat', { anchorX: 0.5, anchorY: 0.5 }); boatGraphics.alpha = 0.8; // Set opacity to 80% self.speed = -0.75; // Slow the boat by half its speed self.update = function () { self.x += self.speed; if (self.x < -boatGraphics.width) { self.destroy(); // Destroy the boat when it goes off screen } }; }); // City class var City = Container.expand(function () { var self = Container.call(this); var cityGraphics = self.attachAsset('cityTile', { anchorX: 0.5, anchorY: 0.5, scaleX: 5, scaleY: 5 }); cityGraphics.alpha = 0.2; // Set opacity to 20% self.speed = -0.1; // Move from right to left, half the ocean speed self.update = function () { self.x += self.speed; if (self.x < -cityGraphics.width) { self.x = 2048; // Reset position to the right } }; }); // Cloud class var Cloud = Container.expand(function () { var self = Container.call(this); var cloudGraphics = self.attachAsset('cloud', { anchorX: 0.5, anchorY: 0.5, scaleX: 5, scaleY: 5 }); cloudGraphics.alpha = 0.4; // Set opacity to 30% self.speed = -1; // Move from right to left self.update = function () { self.x += self.speed; if (self.x < -cloudGraphics.width) { self.x = 2048 + cloudGraphics.width; // Reset position to the right } }; }); // Fish class var Fish = Container.expand(function () { var self = Container.call(this); var fishGraphics = self.attachAsset('pelican', { anchorX: 0.5, anchorY: 0.5 }); fishGraphics.alpha = 0.8; // Set alpha to 80% opaque self.speed = 2; self.direction = 1; // 1 for right, -1 for left self.update = function () { self.x += self.speed * self.direction; if (self.x > 2048 || self.x < 0) { self.direction *= -1; // Change direction fishGraphics.scale.x *= -1; // Flip the direction of the image } }; }); // The assets will be automatically created and loaded by the LK engine // Jet class var Jet = Container.expand(function () { var self = Container.call(this); var jetGraphics = self.attachAsset('jet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.update = function () { self.x -= self.speed; if (self.x < -100) { self.destroy(); } }; }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self.update = function () { self.x += self.speed; self.children.forEach(function (child) { if (child instanceof Text2) { child.x = self.x; } }); if (self.x < -100) { self.destroy(); } }; self.createPipe = function (gapY, gapHeight) { var topPipe = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 1.0, height: gapY }); var bottomPipe = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 0.0, y: gapY + gapHeight, height: 2732 - (gapY + gapHeight) }); self.addChild(topPipe); self.addChild(bottomPipe); }; }); // Pelican class var Pelican = Container.expand(function () { var self = Container.call(this); var pelicanGraphics = self.attachAsset('pelicanSVG', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 0; self.update = function () { self.speed += 0.5; // Gravity effect self.y += self.speed; if (self.y < 0) { self.y = 0; } if (self.y > 2732) { LK.effects.flashScreen(0xff0000, 1000); LK.stopMusic(); LK.stopMusic(); LK.showGameOver(); } // Check if pelican is in the ocean layer if (self.y > 2732 * 0.8) { pelicanGraphics.alpha = 0.8; // Set to 80% opaque if (self.y < 2732 * 0.8 + 10) { // Check if pelican is at the top part of the ocean layer createSplashEffect(self.x, self.y); } } else { pelicanGraphics.alpha = 1; // Set to fully opaque } }; self.dive = function () { self.speed = 10; // Increase speed for diving }; self.fly = function () { self.speed = -15; // Increase upward speed for flying }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Add instructions text at the start of the game var instructionsText = new Text2('Tap to fly, avoid obstacles, and catch fish!', { size: 100, fill: "#ffffff", stroke: "#000000", strokeThickness: 6 }); instructionsText.anchor.set(0.5, 0.5); instructionsText.x = 2048 / 2; instructionsText.y = 2732 / 2; game.addChild(instructionsText); // Remove the instructions text after 5 seconds LK.setTimeout(function () { instructionsText.destroy(); }, 5000); // Initialize city layers to create a continuous loop similar to the ocean var city1 = game.addChild(new City()); city1.x = 0; city1.y = 2732 * 0.8 - city1.height / 2 + 155; // Consolidated vertical position adjustment var city2 = game.addChild(new City()); city2.y = 2732 * 0.8 - city2.height / 2 + 155; // Consolidated vertical position adjustment city2.x = 2048; // Offset the second city to create a continuous loop // Initialize cloud layers with random heights var cloud1 = game.addChild(new Cloud()); cloud1.x = 2048 / 2; cloud1.y = Math.random() * 2732 * 0.5; // Random height within the top half var cloud2 = game.addChild(new Cloud()); cloud2.x = 2048 / 2 + 1024; // Offset the second cloud cloud2.y = Math.random() * 2732 * 0.5; // Random height within the top half function createSplashEffect(x, y) { var splash = LK.getAsset('splash', { anchorX: 0.5, anchorY: 0.5 }); splash.x = x; splash.y = y; splash.alpha = 1; splash.update = function () { this.alpha -= 0.05; // Fade out the splash if (this.alpha <= 0) { this.destroy(); } }; LK.getSound('splash').play(); // Play splash sound game.addChild(splash); } game.pipesPassed = 0; game.jetsAppear = false; // Forest green color // No start screen, game begins immediately // Forest green color for pipes // Forest green color for pipes // Add a light blue layer at the bottom 20% of the screen var bottomLayer1 = LK.getAsset('ocean', { width: 2048, height: 2732 * 0.2, color: 0xADD8E6, anchorX: 0.5, anchorY: 0.0 }); bottomLayer1.x = 2048 / 2; bottomLayer1.y = 2732 * 0.8; game.addChild(city1); game.addChild(city2); game.addChild(bottomLayer1); var bottomLayer2 = LK.getAsset('ocean', { width: 2048, height: 2732 * 0.2, color: 0xADD8E6, anchorX: 0.5, anchorY: 0.0 }); bottomLayer2.x = 2048 / 2 + 2048; bottomLayer2.y = 2732 * 0.8; game.addChild(bottomLayer2); var scoreTxt = new Text2('0', { size: 150, fill: "#ffffff", stroke: "#000000", strokeThickness: 8 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var pelican = game.addChild(new Pelican()); var fish = game.addChild(new Fish()); fish.x = 1024; // Start in the middle of the screen fish.y = 2732 * 0.9; // Position in the bottom layer pelican.speed = 0; // Initial speed pelican.x = 500; pelican.y = 1366; var obstacles = []; var oceanSwayDirection = 1; var oceanSwaySpeed = 0.5; game.update = function () { // Add a gentle sway to the ocean layer bottomLayer1.x -= oceanSwaySpeed * 0.2; bottomLayer2.x -= oceanSwaySpeed * 0.2; if (bottomLayer1.x < -2048 / 2) { bottomLayer1.x = bottomLayer2.x + 2048; } if (bottomLayer2.x < -2048 / 2) { bottomLayer2.x = bottomLayer1.x + 2048; } bottomLayer1.y += oceanSwaySpeed * oceanSwayDirection * 0.5; bottomLayer2.y += oceanSwaySpeed * oceanSwayDirection * 0.5; if (bottomLayer1.y > 2732 * 0.8 + 0.5 || bottomLayer1.y < 2732 * 0.8 - 0.5) { oceanSwayDirection *= -1; } if (LK.ticks % 400 == 0 && !game.jetsAppear) { var newObstacle = new Obstacle(); newObstacle.x = 2048; var gapY = Math.random() * (2000 - 600); // Random gap position var pelicanHeight = LK.getAsset('pelican', {}).height; var maxGapHeight = pelicanHeight * 10; var initialGapHeight = 2000 * 0.2; var minGapHeight = initialGapHeight / 2; var gapHeight = Math.max(minGapHeight, Math.min(initialGapHeight, maxGapHeight) - LK.getScore() * 0.1); // Decrease gapHeight over time but not less than half its initial size newObstacle.createPipe(gapY, gapHeight); obstacles.push(newObstacle); game.addChild(newObstacle); game.pipesPassed++; if (game.pipesPassed % 8 == 0) { game.jetsAppear = true; game.jetsTimer = 0; LK.getSound('alert').play(); } } for (var i = obstacles.length - 1; i >= 0; i--) { if (obstacles[i].x < -50) { obstacles[i].destroy(); obstacles.splice(i, 1); LK.setScore(LK.getScore() + 1); // Add 1 point to the score scoreTxt.setText(LK.getScore()); // Update the score text } if (obstacles[i] instanceof Obstacle && pelican.intersects(obstacles[i])) { LK.effects.flashScreen(0xff0000, 1000); LK.stopMusic(); LK.getSound('arcadefail').play(); LK.showGameOver(); } fish.update(); cloud1.update(); cloud2.update(); city1.update(); city2.update(); if (pelican.intersects(fish)) { fish.destroy(); fish = game.addChild(new Fish()); fish.x = 1024; // Reset fish position fish.y = 2732 * 0.9; LK.setScore(LK.getScore() + 10); // Add 10 points to the score scoreTxt.setText(LK.getScore()); // Update the score text LK.getSound('specialscore1').play(); // Play the sound Special Score 1 // Create and display a new unique graphic when the fish is eaten var yumGraphic = LK.getAsset('yumGraphic', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); yumGraphic.x = pelican.x; yumGraphic.y = pelican.y; yumGraphic.alpha = 1; yumGraphic.update = function () { this.y -= 2; // Move the graphic upwards this.alpha -= 0.02; // Fade out the graphic if (this.alpha <= 0) { this.destroy(); } }; game.addChild(yumGraphic); // Create and display the "+10" text var plusTenText = new Text2('+10', { size: 150, fill: "#000000", stroke: "#ffffff", strokeThickness: 8 }); plusTenText.anchor.set(0.5, 0); plusTenText.x = pelican.x; plusTenText.y = pelican.y - 300; // Position it higher above the "YUM" graphic plusTenText.alpha = 1; plusTenText.update = function () { this.y -= 2; // Move the text upwards this.alpha -= 0.02; // Fade out the text if (this.alpha <= 0) { this.destroy(); } }; game.addChild(plusTenText); } // Add a boat every 30 seconds if (LK.ticks % 1800 == 0) { // 1800 ticks = 30 seconds at 60 FPS var newBoat = new Boat(); newBoat.x = 2048 + newBoat.width; // Start from the right side of the screen newBoat.y = 2732 * 0.8 - 30; // Move the boat up by another 10 pixels game.addChild(newBoat); } // Add the jet to the game if (game.jetsAppear) { game.jetsTimer++; if (game.jetsTimer >= 300) { // 5 seconds have passed game.jetsAppear = false; } else if (LK.ticks % 60 == 0) { // Every second if (game.jetsTimer == 0) { // When the first jet appears // Play the alert sound LK.getSound('alert').play(); var crowsText = new Text2('CROWS!', { size: 200, fill: "#ffffff" }); crowsText.anchor.set(0.5, 0.5); crowsText.x = 2048 / 2; crowsText.y = 2732 / 2; game.addChild(crowsText); // Remove the "CROWS!" text after 2 seconds LK.setTimeout(function () { crowsText.destroy(); }, 2000); } for (var i = 0; i < 3; i++) { var newJet = new Jet(); newJet.x = 2048 + i * 500; // Start from the right side of the screen and spread out the jets newJet.y = Math.random() * 2732; // Random y position game.addChild(newJet); } } } // Check for collision with the jet for (var i = game.children.length - 1; i >= 0; i--) { if (game.children[i] instanceof Jet && pelican.intersects(game.children[i])) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } // Increment score for every two seconds the pelican stays alive if (LK.ticks % 120 == 0) { LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); } } }; game.down = function (x, y, obj) { pelican.fly(); LK.getSound('flap').play(); // Create and display the "FLAP" image var flapImage = LK.getAsset('flapImage', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); flapImage.x = pelican.x; flapImage.y = pelican.y; flapImage.alpha = 1; flapImage.update = function () { this.alpha -= 0.05; // Fade out the image more slowly to last about half a second if (this.alpha <= 0) { this.destroy(); pelican.visible = true; // Make the pelican visible again } }; game.addChild(flapImage); pelican.visible = false; // Hide the pelican when the flap image is on screen }; game.up = function (x, y, obj) { // No action needed on mouse up }; // Start the music when the game begins LK.playMusic('soundtrack', { volume: 0.3 });
===================================================================
--- original.js
+++ change.js
@@ -432,9 +432,9 @@
flapImage.x = pelican.x;
flapImage.y = pelican.y;
flapImage.alpha = 1;
flapImage.update = function () {
- this.alpha -= 0.25; // Fade out the image
+ this.alpha -= 0.05; // Fade out the image more slowly to last about half a second
if (this.alpha <= 0) {
this.destroy();
pelican.visible = true; // Make the pelican visible again
}
8-bit profile of pelican flying straight. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit profile of fish for arcade game. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit profile of pelican flapping it's wings downward. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit silhouette of tugboat. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit "YUM" dialog bubble. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.