Code edit (5 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Timeout.tick error: Can't find variable: xSpeed' in or related to this line: 'pitchLabel.setText('Speed boost! : ' + xSpeed);' Line Number: 722
Code edit (13 edits merged)
Please save this source code
User prompt
Add global backgroundContainer and foregroundContainer, Chicken and StartFlag are on forground, the rest in background
Code edit (1 edits merged)
Please save this source code
Code edit (15 edits merged)
Please save this source code
User prompt
update `platform1.addChild(speechBubble);` to use addChildAt to put speechBubble behind
Code edit (4 edits merged)
Please save this source code
User prompt
create a new class for start flag
Code edit (1 edits merged)
Please save this source code
User prompt
in platform manager, ensure that distance between 2 platforms A and B (platformA.x +platformA.width vs platformB.x) is always = 450
User prompt
Keep current platforms, don't touch them, but add a Platform manager that will handle new platforms after the platform3
Code edit (1 edits merged)
Please save this source code
User prompt
play cat failing sound when failes
User prompt
play jump sound when jumps
Code edit (17 edits merged)
Please save this source code
User prompt
add another flag for mouth Closed Detection in order to apply this behaviour: - Default mouth closed flag = true - Player open mouth + mouth closed flag => jump once + set mouth closed flag = false - Wait until mouth closed => set mouth closed flag this will prevent infinite jump if player keeps mouth open ↪💡 Consider importing and using the following plugins: @upit/facekit.v1
Code edit (1 edits merged)
Please save this source code
Code edit (10 edits merged)
Please save this source code
User prompt
if chicken y > targetPlatform.y show headOh
Code edit (3 edits merged)
Please save this source code
User prompt
animate walk with a looping move of the paws back and forth ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (4 edits merged)
Please save this source code
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'headIdle.x = 0')' in or related to this line: 'headIdle.x = 0;' Line Number: 44
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var facekit = LK.import("@upit/facekit.v1"); var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ //<Write imports for supported plugins here> var Chicken = Container.expand(function () { var self = Container.call(this); self.failed = false; self.mouthClosedFlag = true; var paws = self.attachAsset('nyanCatPaws', { anchorX: 0.5, anchorY: 1, scaleX: 0.9 }); paws.x = 30; paws.y = 20; var chickenGraphics = self.attachAsset('nyanCatBody', { anchorX: 0.5, anchorY: 1, alpha: 1 }); // var chickenGraphics = self.attachAsset('nyanCatBodySmartphone', { // anchorX: 0.5, // anchorY: 1 // }); var headIdle = self.attachAsset('nyanCatHeadIdle', { anchorX: 0.5, anchorY: 1, alpha: 1 }); var headOh = self.attachAsset('nyanCatHeadOh', { anchorX: 0.5, anchorY: 1, alpha: 0 }); var headSmile = self.attachAsset('nyanCatHeadSmile', { anchorX: 0.5, anchorY: 1, alpha: 0 }); var collisionElement = self.attachAsset('collisionElement', { anchorX: 0.5, anchorY: 0.5, width: chickenGraphics.width * 0.4, height: chickenGraphics.height * 0.2 }); headIdle.x = 180; headIdle.y = -100; headOh.x = 180; headOh.y = -100; headSmile.x = 180; headSmile.y = -100; collisionElement.alpha = 0; collisionElement.y = -30; chickenGraphics.y = 40; self.speed = 8; self.jumpHeight = 400; self.isJumping = true; self.jumpVelocity = 0; self.isOnPlatform = true; self.update = function () { self.y += self.jumpVelocity; if (self.failed) { return; } self.jumpVelocity += 1; if (self.jumpVelocity > 30) { self.jumpVelocity = 30; } // Show nyanCatHeadSmile during initial jump phase (negative velocity = going up) if (self.isJumping && self.jumpVelocity < 0) { headIdle.alpha = 0; headOh.alpha = 0; headSmile.alpha = 1; } else if (targetPlatform && self.y > targetPlatform.y) { headIdle.alpha = 0; headOh.alpha = 1; headSmile.alpha = 0; } else { headIdle.alpha = 1; headOh.alpha = 0; headSmile.alpha = 0; } var targetPlatform = undefined; self.isOnPlatform = platforms.some(function (platform) { if (collisionElement.intersects(platform)) { if (self.y - platform.y < 100) { targetPlatform = platform; return true; } } }); if (!self.failed && self.y > 2400) { self.failed = true; xspeed = 0; LK.effects.flashScreen(0xff00FF, 100); headIdle.alpha = 0; headOh.alpha = 1; headSmile.alpha = 0; self.jumpVelocity = 0; // Play cat failing sound when fails LK.getSound('failed').play(); tween(headOh, { scaleY: 3, scaleX: 3 }, { duration: 500, easing: tween.easeOut }); tween(self, { y: 3000 }, { duration: 1600, easing: tween.easeOut, onFinish: function onFinish() { self.jumpVelocity = 20; } }); } if (self.isOnPlatform && self.jumpVelocity > 0) { self.y = targetPlatform.y + 70; if (self.isJumping) { // for (var a = 0; a < 30; a++) { // particles.addDirtParticle(chicken.x, chicken.y); // } chickenGraphics.scale.y = .8; chickenGraphics.scale.x = 1.2; tween(chickenGraphics, { scaleY: 1, scaleX: 1 }, { duration: 1000, easing: tween.elasticOut }); // Reset paw position and restart animation when landing tween.stop(paws, { x: true }); paws.x = 0; animatePaws(); } self.isJumping = false; self.jumpVelocity = 0; } self.x = 2048 / 2; }; function groove() { tween(self, { scaleX: 1.03, scaleY: 1.03 }, { duration: 300, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { onFinish: groove, duration: 300 }); } }); } groove(); self.jump = function (strength) { if (platforms[0].x > -1500) { return; } // self.isOnPlatform = platforms.some(function (platform) { // if (collisionElement.intersects(platform)) { // return self.y - platform.y < 100; // } // }); if (!self.isJumping && self.isOnPlatform && self.mouthClosedFlag) { self.isJumping = true; self.mouthClosedFlag = false; // Play jump sound LK.getSound('jump').play(); // for (var a = 0; a < 30; a++) { // particles.addDirtParticle(chicken.x, chicken.y); // } chicken.jumpVelocity = -40; // Stop paw animation during jump with a quick tween back to center tween.stop(paws, { x: true }); tween(paws, { x: 0 }, { duration: 100 }); self.update(); } }; // Function to animate paws with alternating movements function animatePaws() { if (!self.isOnPlatform) { return; } tween(paws, { x: -10 }, { duration: 160, easing: tween.linear, onFinish: function onFinish() { tween(paws, { x: 30 }, { duration: 160, easing: tween.linear, onFinish: animatePaws }); } }); } return self; }); var Countdown = Container.expand(function () { var self = Container.call(this); var currentNumber = 16; var countdownTextShadow = new Text2("GO!", { size: 500, fill: 0x000000, weight: 800 }); var countdownText = new Text2("GO!", { size: 500, fill: 0xFFFFFF, weight: 800 }); countdownText.anchor.set(0.5, 0.5); countdownTextShadow.anchor.set(0.5, 0.5); self.addChild(countdownTextShadow); self.addChild(countdownText); self.x = 2048 / 2; self.y = 400; countdownTextShadow.x = 15; countdownTextShadow.y = 15; function tweenIt() { self.scale.set(1, 1); tween(self, { scaleX: .8, scaleY: .8 }, { duration: 400, easing: tween.bounceOut }); } var countdownInterval = LK.setInterval(function () { currentNumber--; if (currentNumber > 0) { countdownText.setText(currentNumber.toString()); countdownTextShadow.setText(currentNumber.toString()); } else { self.destroy(); LK.clearInterval(countdownInterval); LK.effects.flashScreen(0xff0000, 3000); LK.showGameOver(); } tweenIt(); }, 1000); tweenIt(); }); var DebugMarker = Container.expand(function () { var self = Container.call(this); var debugGraphics = self.attachAsset('debugMark', { anchorX: 0, anchorY: 0.5 }); debugGraphics.width = 1; self.update = function () { debugGraphics.width = facekit.mouthOpen ? 1000 : 100; debugGraphics.tint = facekit.mouthOpen ? 0x00ff00 : 0xff0000; }; return self; }); var DirtParticle = Container.expand(function () { var self = Container.call(this); var dirtGraphics = self.attachAsset('trail', { anchorX: 0.5, anchorY: 1 }); var speed = 2; //Math.random() * 3; var angle = 0; //-Math.random() * Math.PI; var scale = 1; self.livetime = 110; self.update = function () { self.livetime--; if (self.livetime < 0) { self.destroy(); return; } if (chicken.failed) { return; } if (self.x < -50) { self.destroy(); return; } self.x += Math.cos(angle) * speed; self.y += Math.sin(angle) * speed; }; }); var LargeBork = Container.expand(function () { var self = Container.call(this); self.moveMultiplier = 0; self.moveSpeed = -5; var largeBorkGraphicsChicken = self.attachAsset('NyanCat', { anchorX: 0.5, anchorY: 1, y: -300 }); largeBorkGraphicsChicken.y = -50; var largeBorkGraphics = self.attachAsset('large_bork', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.moveMultiplier = xspeed * 6; self.x += self.moveSpeed * self.moveMultiplier; }; self.bork = function () { var speechBubbleLarge = new SpeechBubbleLarge(); var offset = Math.PI / 4 * Math.random() - Math.PI / 2 - Math.PI / 4; speechBubbleLarge.x = -50 + Math.cos(offset) * 350; speechBubbleLarge.y = -100 + Math.sin(offset) * 350; speechBubbleLarge.rotation = offset + Math.PI * 0.5 + .3; self.addChild(speechBubbleLarge); largeBorkGraphicsChicken.scale.y = 1.05; largeBorkGraphicsChicken.scale.x = 1.05; largeBorkGraphicsChicken.rotation = .2; tween(largeBorkGraphicsChicken, { scaleY: 1, scaleX: 1, rotation: 0 }, { duration: 1000, easing: tween.elasticOut }); }; }); var Particles = Container.expand(function () { var self = Container.call(this); self.moveMultiplier = 0; self.moveSpeed = -5; self.addDirtParticle = function (x, y) { var dirtParticle = new DirtParticle(); dirtParticle.x = x - self.x + 100; // + Math.random() * 130 - 40; dirtParticle.y = y - 100; self.addChild(dirtParticle); }; self.update = function () { if (chicken.failed) { return; } self.moveMultiplier = xspeed * 6; self.x += self.moveSpeed * self.moveMultiplier; }; }); var Platform = Container.expand(function () { var self = Container.call(this); self.moveSpeed = -5; self.moveMultiplier = 1; var groundGraphics = self.attachAsset('ground', { anchorX: 0, anchorY: 0 }); self.width = groundGraphics.width; self.update = function () { if (chicken.failed) { return; } self.moveMultiplier = xspeed * 6; self.x += self.moveSpeed * self.moveMultiplier; /*if (self.x < -self.width) { self.x += self.width + 2048 + Math.random() * 1000; }*/ }; }); var PlatformManager = Container.expand(function () { var self = Container.call(this); self.lastX = 0; self.platformGap = 1500; self.platformCount = 0; self.maxPlatforms = 10; self.activePlatforms = []; // Track the last platform x position self.trackLastPlatform = function () { var lastX = 0; platforms.forEach(function (platform) { if (platform.x + platform.width > lastX) { lastX = platform.x + platform.width; } }); self.lastX = lastX; }; // Generate a platform at the given coordinates self.generatePlatform = function (x, y) { var platform = new Platform(); platform.x = x; platform.y = y; game.addChild(platform); platforms.push(platform); self.activePlatforms.push(platform); return platform; }; // Create random platform heights self.getRandomHeight = function () { var heights = [1600, 1800, 2000, 2200]; return heights[Math.floor(Math.random() * heights.length)]; }; // Check if we need to add more platforms self.update = function () { if (chicken.failed) { return; } // Calculate the rightmost platform edge self.trackLastPlatform(); // Generate new platforms if we're below our maximum if (self.activePlatforms.length < self.maxPlatforms) { // Ensure distance between platforms is exactly 450 units var newX = self.lastX + 450; var newY = self.getRandomHeight(); var newPlatform = self.generatePlatform(newX, newY); self.platformCount++; // Add spikes to some platforms for challenge if (self.platformCount % 3 == 0) { var newSpikes = new Spikes(); newSpikes.x = newPlatform.x; newSpikes.y = newPlatform.y - Math.random() * 500 - 1000; game.addChild(newSpikes); } } // Clean up platforms that are far behind for (var i = self.activePlatforms.length - 1; i >= 0; i--) { var platform = self.activePlatforms[i]; if (platform.x + platform.width < -2000) { // Don't remove the original platforms (the first 5) if (platforms.indexOf(platform) >= 5) { platforms.splice(platforms.indexOf(platform), 1); self.activePlatforms.splice(i, 1); platform.destroy(); } } } }; return self; }); var SpeechBubble = Container.expand(function () { var self = Container.call(this); var bubbleGraphics = self.attachAsset('small_bork_speach', { anchorX: 0.8, anchorY: 1 }); self.y -= 50; self.alpha = 1; self.update = function () { self.y -= 1; self.alpha -= 0.01; if (self.alpha <= 0) { self.destroy(); } }; tween(self, { alpha: 0 }, { duration: 2000, easing: tween.linear, onFinish: function onFinish() { self.destroy(); } }); }); var SpeechBubbleLarge = Container.expand(function () { var self = Container.call(this); var bubbleGraphics = self.attachAsset('large_bork_speach', { anchorX: 0.2, anchorY: 1 }); self.y -= 50; self.alpha = 1; self.scale.set(0, 0); tween(self, { scaleX: 1, scaleY: 1 }, { duration: 800, easing: tween.elasticOut }); LK.setTimeout(function () { tween(self, { alpha: 0, y: self.y - 100 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }, 800); }); var Spikes = Container.expand(function () { var self = Container.call(this); self.moveMultiplier = 0; self.moveSpeed = -5; var spikesGraphics = self.attachAsset('spikes', { anchorX: 0, anchorY: 0 }); self.update = function () { self.moveMultiplier = xspeed * 6; self.x += self.moveSpeed * self.moveMultiplier; }; }); var StartFlag = Container.expand(function () { var self = Container.call(this); self.moveMultiplier = 0; self.moveSpeed = -5; var flagGraphics = self.attachAsset('start', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.moveMultiplier = xspeed * 6; self.x += self.moveSpeed * self.moveMultiplier; if (self.x < -500) { self.destroy(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var volumeLabel = new Text2('Volume: 0', { size: 50, fill: 0xFFFFFF }); volumeLabel.anchor.set(1, 1); volumeLabel.alpha = .3; LK.gui.bottomRight.addChild(volumeLabel); var pitchLabel = new Text2('Mouth: closed', { size: 50, fill: 0xFFFFFF }); pitchLabel.anchor.set(0, 1); pitchLabel.alpha = .3; LK.gui.bottomLeft.addChild(pitchLabel); function addPlatformAt(x, y) { var platform = game.addChild(new Platform()); platform.x = x; //i * 1900 + i * Math.random() * 1000; platform.y = y; //2200; platforms.push(platform); return platform; } var xspeed = 0; var platforms = []; addPlatformAt(1000, 2200); addPlatformAt(2450, 2200); addPlatformAt(3000 + 1500, 2200); var platform3 = addPlatformAt(5000 + 1500, 1800); var spikes = game.addChild(new Spikes()); spikes.x = platform3.x; spikes.y = platform3.y - 1500; addPlatformAt(7000 + 1500, 2200); var platform1 = platforms[0]; var chickenBork = platform1.attachAsset('NyanCat', { anchorX: 0.5, anchorY: 1, x: platform1.width / 2, y: -1300 }); var smallBork = platform1.attachAsset('small_bork', { anchorX: 0.5, anchorY: 0.5, x: platform1.width / 2, y: -1024 }); var platform2 = platforms[1]; var largeBork = game.addChild(new LargeBork()); largeBork.x = platform2.x + platform2.width + 250; largeBork.y = platform2.y - 1024; var lastPlatform = addPlatformAt(9000 + 1500, 1600); var trophy = lastPlatform.attachAsset('trophy', { anchorX: 0.5, anchorY: 0.5, x: lastPlatform.width / 2, y: -100 }); trophy.visible = false; // TEMP DEBUG var boffset = 0; var trailStarted = false; var trailWave = false; function doSmallBork() { var speechBubble = new SpeechBubble(); var offset = Math.PI / 2 * Math.random() - Math.PI / 2 - Math.PI / 4; speechBubble.x = smallBork.x + 400 + Math.cos(offset) * 300; speechBubble.y = smallBork.y - 400 + Math.sin(offset) * 300; speechBubble.rotation = offset + Math.PI * 0.5 - .1; platform1.addChildAt(speechBubble, 0); LK.setTimeout(doSmallBork, 600 + Math.random() * 300); chickenBork.scale.y = 1.05; chickenBork.scale.x = 1.05; tween(chickenBork, { scaleY: 1, scaleX: 1 }, { duration: 800, easing: tween.elasticOut }); if (boffset++ % 3 == 0) { largeBork.bork(); } } doSmallBork(); //<Write imports for supported plugins here> var particles = game.addChild(new Particles()); var chicken = game.addChild(new Chicken()); Platform.prototype.chicken = chicken; chicken.x = 2048 / 2; chicken.y = 2200; var startFlag = game.addChild(new StartFlag()); startFlag.x = platform2.x + 130; startFlag.y = platform2.y - 140; // Initialize platform manager var platformManager = game.addChild(new PlatformManager()); var pitchDebugMarker = game.addChild(new DebugMarker()); pitchDebugMarker.x = 50; pitchDebugMarker.y = 2600; pitchDebugMarker.alpha = 0.7; var countdown; game.update = function () { if (chicken.y > 5000) { LK.effects.flashScreen(0xff0000, 3000); LK.showGameOver(); } if (chicken.failed) { return; } if (!chicken.isJumping) { xspeed += .5; xspeed *= .4; if (facekit.mouthOpen) { chicken.jump(1.0); } else if (!facekit.mouthOpen && !chicken.mouthClosedFlag) { chicken.mouthClosedFlag = true; } } if (chicken.intersects(spikes)) { LK.effects.flashScreen(0xff0000, 3000); LK.showGameOver(); } // Update platform manager to handle creating new platforms platformManager.update(); if (trailStarted) { particles.addDirtParticle(chicken.x - chicken.width / 2 + 20, chicken.y + (trailWave ? -10 : 0)); } //pitchLabel.setText('Mouth: ' + (facekit.mouthOpen ? 'OPEN' : 'closed')); if (startFlag) { pitchLabel.setText('Start: ' + startFlag.x + ' / ' + startFlag.y); } }; LK.playMusic('nyanLikeMusic'); LK.setTimeout(function () { trailStarted = true; }, 300); LK.setInterval(function () { trailWave = !trailWave; }, 300);
===================================================================
--- original.js
+++ change.js
@@ -311,9 +311,10 @@
self.moveMultiplier = 0;
self.moveSpeed = -5;
var largeBorkGraphicsChicken = self.attachAsset('NyanCat', {
anchorX: 0.5,
- anchorY: 1
+ anchorY: 1,
+ y: -300
});
largeBorkGraphicsChicken.y = -50;
var largeBorkGraphics = self.attachAsset('large_bork', {
anchorX: 0.5,
@@ -591,9 +592,9 @@
});
var platform2 = platforms[1];
var largeBork = game.addChild(new LargeBork());
largeBork.x = platform2.x + platform2.width + 250;
-largeBork.y = platform2.y - 500;
+largeBork.y = platform2.y - 1024;
var lastPlatform = addPlatformAt(9000 + 1500, 1600);
var trophy = lastPlatform.attachAsset('trophy', {
anchorX: 0.5,
anchorY: 0.5,
@@ -606,13 +607,13 @@
var trailWave = false;
function doSmallBork() {
var speechBubble = new SpeechBubble();
var offset = Math.PI / 2 * Math.random() - Math.PI / 2 - Math.PI / 4;
- speechBubble.x = smallBork.x + 400 + Math.cos(offset) * 200;
- speechBubble.y = smallBork.y - 400 + Math.sin(offset) * 200;
+ speechBubble.x = smallBork.x + 400 + Math.cos(offset) * 300;
+ speechBubble.y = smallBork.y - 400 + Math.sin(offset) * 300;
speechBubble.rotation = offset + Math.PI * 0.5 - .1;
platform1.addChildAt(speechBubble, 0);
- LK.setTimeout(doSmallBork, 300 + Math.random() * 200);
+ LK.setTimeout(doSmallBork, 600 + Math.random() * 300);
chickenBork.scale.y = 1.05;
chickenBork.scale.x = 1.05;
tween(chickenBork, {
scaleY: 1,
Row of Spikes. Computer Game Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
photo-realistic
a smartphone (black screen)
A simple wide hand-drawn symmetrical ribbon banners. The banner text reads “Open WIDE to jump!” in playful, cartoonish black lettering. The ribbon is warm beige parchment. Each side ends with simple curved, scroll-like ribbon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A simple wide hand-drawn symmetrical ribbon banners. The banner text reads “Keep mouth closed” in playful, cartoonish black lettering. The ribbon is warm beige parchment. Each side ends with simple curved, scroll-like ribbon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Simple cartoon speech bubble with closed lips icon and lowercase lettering 'mmm...'. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Simple cartoon speech bubble with big open mouth icon and uppercase lettering 'MIAW!'. Bubble tail on the right. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
lateral view of a flat cake in rectangular platform shape for a platformer game. In-Game asset. 2d. High contrast. No shadows
lateral view of a flat cake in rectangular platform shape for a platformer game. In-Game asset. 2d. High contrast. No shadows
lateral view of a flat rainbow cake in rectangular platform shape for a platformer game. In-Game asset. 2d. High contrast. No shadows
photo of a cucumber meme
open cardboard box. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows