User prompt
birazdaha detay derinligi eklermisin rica etsem
User prompt
kuşlar biraz dağınık uçsun beraber degil
User prompt
kuşları bikaçtane yaparmısın
User prompt
kuşları çok azıcık indirmisn
User prompt
kuşlar birazdaha lütfen yüksekten uçsun
User prompt
kuşlar birazdaha yüksekten uçsun lütfen
User prompt
kuşlar birazdaha yüksekten uçsun lütfen
User prompt
oyuna kuş eklermisin
User prompt
arka plana güneş eklermisin
User prompt
extra bir dızın acara k gunes olusturabilirmisin
User prompt
güneş ekerlmisin rica etsem ekstra olarak
User prompt
güneş için ayrı bir dizin oluştur lütfen
User prompt
bulut ve güneş detayı eklermisin
User prompt
çöl iklimine bir kaç detay daha eklermisin piramit vs gibi
User prompt
öl ilkimine bir kaç detay daha eklermisin rica etsem
User prompt
siyah olan arka planı birazdaha çöl iklimi olarak degiştirmisin
User prompt
altını alması için kedinin ona değmesi yetsin
User prompt
ektra bir scor tablosu olusturup kedinin alabilcegi altın da oyuna eksra olarak eklermisn rica etsem
User prompt
çift zıplama eklermisin rica etsem
User prompt
üzerine glen birde hayalet eklermisn rica etsem extradan
User prompt
kaktüs sıklıgını zıplama imkanı verecek şekilde yeniden düzenlermisin
User prompt
zıpladıktan sonra 100 msn havada kalsın
User prompt
zıpladıktan sonra 30msn havada
User prompt
birazdaha çok az daha kısa zıplasın
User prompt
oyun ilerledikçe hızlansın
/**** * Classes ****/ // Bird class: flies from right to left, above ground, destroys itself off screen var Bird = Container.expand(function () { var self = Container.call(this); // Use 'gunes' asset for bird (placeholder, should be replaced with a bird asset if available) var birdSprite = self.attachAsset('gunes', { anchorX: 0.5, anchorY: 0.5 }); birdSprite.width = 120; birdSprite.height = 90; birdSprite.tint = 0x888888; birdSprite.alpha = 0.92; self.speed = 10 + Math.random() * 4; self.update = function () { self.x -= self.speed; // Destroy if off screen if (self.lastX >= -200 && self.x < -200) { self.destroy(); } self.lastX = self.x; }; return self; }); // Cactus class: moves left, destroys itself off screen var Cactus = Container.expand(function () { var self = Container.call(this); // Attach cactus asset, anchor bottom left var cactusSprite = self.attachAsset('cactus', { anchorX: 0.5, anchorY: 1 }); self.speed = 7 + Math.random() * 2; // even slower speed for easier gameplay self.update = function () { self.x -= self.speed; // Destroy if off screen if (self.lastX >= -200 && self.x < -200) { self.destroy(); } self.lastX = self.x; }; return self; }); // Cat class: handles jump, gravity, and collision var Cat = Container.expand(function () { var self = Container.call(this); // Attach cat asset, anchor bottom left for ground logic var catSprite = self.attachAsset('cat', { anchorX: 0.5, anchorY: 1 }); // Cat physics self.y = 0; self.x = 0; self.vy = 0; self.isJumping = false; self.groundY = 0; // will be set after creation // Double jump state self.jumpCount = 0; self.maxJumps = 2; // Jump parameters self.jumpVelocity = -65; self.gravity = 4; // Update method for physics self.update = function () { if (self.isJumping) { // If we are hovering, do not apply gravity or move if (self.isHovering) { // Check if hover time is over if (LK.ticks - self.hoverStartTick >= 6) { // 100ms at 60 FPS self.isHovering = false; // Resume falling, keep vy as 0 so gravity starts pulling down self.vy = 0; } // While hovering, do nothing else return; } // Normal jump/fall self.vy += self.gravity; self.y += self.vy; // At apex: vy just turned positive (was going up, now going down) if (!self.isHovering && self.vy > 0 && !self.hasHovered) { self.isHovering = true; self.hasHovered = true; self.hoverStartTick = LK.ticks; self.vy = 0; // Stop vertical movement during hover return; } // Land on ground if (self.y >= self.groundY) { self.y = self.groundY; self.vy = 0; self.isJumping = false; self.isHovering = false; self.hasHovered = false; self.jumpCount = 0; // Reset jump count on landing } } }; // Jump method self.jump = function () { if (self.jumpCount < self.maxJumps) { self.isJumping = true; self.vy = self.jumpVelocity; self.isHovering = false; self.hasHovered = false; self.hoverStartTick = 0; self.jumpCount++; } }; return self; }); // Cloud class: moves left, destroys itself off screen var Cloud = Container.expand(function () { var self = Container.call(this); // Use a white ellipse for the cloud var cloudSprite = self.attachAsset('centerCircle', { anchorX: 0.5, anchorY: 0.5 }); // Randomize cloud size var scale = 1.2 + Math.random() * 1.2; cloudSprite.width = 320 * scale; cloudSprite.height = 120 * scale; cloudSprite.tint = 0xFFFFFF; cloudSprite.alpha = 0.7 + Math.random() * 0.2; self.speed = 1.5 + Math.random() * 1.2; self.update = function () { self.x -= self.speed; if (self.lastX >= -400 && self.x < -400) { self.destroy(); } self.lastX = self.x; }; return self; }); // Gold class: moves left, destroys itself off screen, collectible by cat var Gold = Container.expand(function () { var self = Container.call(this); // Attach gold asset, anchor center var goldSprite = self.attachAsset('ghost', { anchorX: 0.5, anchorY: 0.5 }); goldSprite.width = 80; goldSprite.height = 80; self.speed = 7 + Math.random() * 2; self.collected = false; self.update = function () { self.x -= self.speed; // Destroy if off screen if (self.lastX >= -200 && self.x < -200) { self.destroy(); } self.lastX = self.x; }; return self; }); // ParallaxLayer class: moves left, destroys itself off screen, for background depth var ParallaxLayer = Container.expand(function () { var self = Container.call(this); // Use a colored ellipse for background hills/mountains var layerSprite = self.attachAsset('centerCircle', { anchorX: 0.5, anchorY: 0.5 }); // Randomize size and color for variety var scale = 6 + Math.random() * 4; layerSprite.width = 600 * scale; layerSprite.height = 180 * scale; // Pick a color for the layer (distant blue, purple, or brownish) var colors = [0xB0B8D1, 0xA68BBE, 0xC2B280, 0xE0CDA9]; layerSprite.tint = colors[Math.floor(Math.random() * colors.length)]; layerSprite.alpha = 0.22 + Math.random() * 0.13; self.speed = 0.3 + Math.random() * 0.5; // slower than clouds self.update = function () { self.x -= self.speed; if (self.lastX >= -800 && self.x < -800) { self.destroy(); } self.lastX = self.x; }; return self; }); // Sun class: static, top right var Sun = Container.expand(function () { var self = Container.call(this); // Use a yellow ellipse for the sun var sunSprite = self.attachAsset('centerCircle', { anchorX: 0.5, anchorY: 0.5 }); sunSprite.width = 260; sunSprite.height = 260; sunSprite.tint = 0xFFF700; sunSprite.alpha = 0.95; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xF7E9A0 // light sand yellow, desert-like }); /**** * Game Code ****/ ; // --- GAME CODE --- // Parallax background layers var parallaxLayers = []; var nextParallaxTick = 0; // Sun and clouds var sun; var clouds = []; var nextCloudTick = 0; // Birds var birds = []; var nextBirdTick = 0; // Game constants var GROUND_Y = 2200; // y position of ground (bottom of screen minus margin) var CAT_START_X = 400; var CAT_START_Y = GROUND_Y; var CACTUS_SPAWN_MIN = 40; // min frames between cacti (more frequent) var CACTUS_SPAWN_MAX = 80; // max frames between cacti (more frequent) // Game state var cat; var cacti = []; var golds = []; var score = 0; var goldScore = 0; var scoreTxt; var goldScoreTxt; var nextCactusTick = 0; var nextGoldTick = 0; var gameOver = false; // Speed multiplier for game progression var speedMultiplier = 1; var SPEED_MULTIPLIER_INCREMENT = 0.08; // how much to increase per score var SPEED_MULTIPLIER_MAX = 3; // cap the speed increase // Add score text to GUI scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Gold score text (smaller, right of score) goldScoreTxt = new Text2('0', { size: 90, fill: 0xFFD700 // gold color }); goldScoreTxt.anchor.set(0, 0); goldScoreTxt.x = 120; // right of main score goldScoreTxt.y = 20; LK.gui.top.addChild(goldScoreTxt); // Add parallax background layers (hills/mountains) at different depths for (var i = 0; i < 4; i++) { var layer = new ParallaxLayer(); layer.x = 300 + Math.random() * 1800; // Place layers at different vertical positions for depth layer.y = 1700 + i * 180 + Math.random() * 80; layer.lastX = layer.x; game.addChild(layer); parallaxLayers.push(layer); } nextParallaxTick = 80 + Math.floor(Math.random() * 120); // Add sun (top right, margin from edge) sun = new Sun(); sun.x = 2048 - 220; sun.y = 220; game.addChild(sun); // Spawn a few initial clouds for (var i = 0; i < 3; i++) { var cloud = new Cloud(); cloud.x = 400 + Math.random() * 1400; cloud.y = 200 + Math.random() * 400; cloud.lastX = cloud.x; game.addChild(cloud); clouds.push(cloud); } nextCloudTick = 60 + Math.floor(Math.random() * 120); // Create cat cat = new Cat(); cat.x = CAT_START_X; cat.y = CAT_START_Y; cat.groundY = CAT_START_Y; game.addChild(cat); // Touch/click to jump game.down = function (x, y, obj) { if (!gameOver) { cat.jump(); } ; // Update golds, check for collection for (var j = golds.length - 1; j >= 0; j--) { var gold = golds[j]; gold.update(); // Remove if off screen if (gold.x < -200) { gold.destroy(); golds.splice(j, 1); continue; } // Collect gold: only trigger on first intersect and not already collected if (!gold.collected && cat.intersects(gold)) { gold.collected = true; goldScore++; goldScoreTxt.setText(goldScore); gold.destroy(); golds.splice(j, 1); continue; } } }; // Main update loop game.update = function () { if (gameOver) return; // Update parallax background layers and spawn new ones for (var i = parallaxLayers.length - 1; i >= 0; i--) { var layer = parallaxLayers[i]; layer.update(); if (layer.x < -800) { layer.destroy(); parallaxLayers.splice(i, 1); } } if (nextParallaxTick <= 0) { var layer = new ParallaxLayer(); layer.x = 2048 + 400; // Randomize vertical position for depth var baseY = 1700 + Math.floor(Math.random() * 4) * 180; layer.y = baseY + Math.random() * 80; layer.lastX = layer.x; game.addChild(layer); parallaxLayers.push(layer); nextParallaxTick = 80 + Math.floor(Math.random() * 120); } else { nextParallaxTick--; } // Update clouds and spawn new ones for (var i = clouds.length - 1; i >= 0; i--) { var cloud = clouds[i]; cloud.update(); if (cloud.x < -400) { cloud.destroy(); clouds.splice(i, 1); } } if (nextCloudTick <= 0) { var cloud = new Cloud(); cloud.x = 2048 + 200; cloud.y = 120 + Math.random() * 600; cloud.lastX = cloud.x; game.addChild(cloud); clouds.push(cloud); nextCloudTick = 60 + Math.floor(Math.random() * 120); } else { nextCloudTick--; } // Update birds and spawn new ones for (var i = birds.length - 1; i >= 0; i--) { var bird = birds[i]; bird.update(); if (bird.x < -200) { bird.destroy(); birds.splice(i, 1); } } if (nextBirdTick <= 0) { // Spawn 2-3 birds at once, with more scattered (random) vertical and horizontal spacing var birdCount = 2 + Math.floor(Math.random() * 2); // 2 or 3 birds var minBirdY = GROUND_Y - 1850; var maxBirdY = GROUND_Y - 1350; if (minBirdY < 0) minBirdY = 0; if (maxBirdY < 0) maxBirdY = 0; var yRange = maxBirdY - minBirdY; var usedYs = []; for (var b = 0; b < birdCount; b++) { var bird = new Bird(); // Scatter birds horizontally more bird.x = 2048 + 100 + Math.random() * 200 + b * 60 + Math.random() * 60; // Scatter birds vertically, allow overlap and more randomness var baseY = minBirdY + Math.random() * yRange; // Add more jitter, and avoid birds being too close vertically var jitterY = (Math.random() - 0.5) * 180; var finalY = baseY + jitterY; // Optionally, keep birds at least 120px apart vertically var minDist = 120; var attempts = 0; while (usedYs.some(function (y) { return Math.abs(y - finalY) < minDist; }) && attempts < 10) { finalY = minBirdY + Math.random() * yRange + (Math.random() - 0.5) * 180; attempts++; } usedYs.push(finalY); bird.y = finalY; bird.lastX = bird.x; // Apply speed multiplier to bird bird.speed = bird.speed * (0.8 + 0.4 * Math.random()) * speedMultiplier; game.addChild(bird); birds.push(bird); } // Bird group appears every 120-240 ticks nextBirdTick = 120 + Math.floor(Math.random() * 120); } else { nextBirdTick--; } // Update cat cat.update(); // Spawn cactus if (nextCactusTick <= 0) { var cactus = new Cactus(); cactus.x = 2048 + 100; // spawn just off right edge cactus.y = GROUND_Y; cactus.lastX = cactus.x; // Apply speed multiplier to cactus cactus.speed = cactus.speed * speedMultiplier; game.addChild(cactus); cacti.push(cactus); // Calculate minimum jump window: time to complete a jump (up, hover, down) // Estimate: jump up (abs(cat.jumpVelocity)/cat.gravity), hover (6 ticks), fall (same as up) // Total jump time in ticks var jumpUpTicks = Math.ceil(Math.abs(cat.jumpVelocity) / cat.gravity); var hoverTicks = 6; var jumpTotalTicks = jumpUpTicks + hoverTicks + jumpUpTicks; // Calculate cactus travel time from spawn to cat.x var cactusTravelDistance = 2048 + 100 - CAT_START_X; var avgCactusSpeed = (7 + 8.5) / 2 * speedMultiplier; // average speed, adjusted by multiplier if (avgCactusSpeed < 1) avgCactusSpeed = 1; // avoid divide by zero var cactusTravelTicks = cactusTravelDistance / avgCactusSpeed; // Minimum interval: enough time for cat to land and jump again before next cactus arrives // Add a small buffer (e.g. 10 ticks) var minInterval = Math.max(jumpTotalTicks + 10, 20); // Randomize interval, but always >= minInterval var spawnInterval = minInterval + Math.floor(Math.random() * 30); // Clamp to a minimum of 10 ticks for extreme speeds if (spawnInterval < 10) spawnInterval = 10; nextCactusTick = Math.floor(spawnInterval); } else { nextCactusTick--; } // Spawn gold if (nextGoldTick <= 0) { var gold = new Gold(); gold.x = 2048 + 100; // Random Y: between ground and a bit above cat's jump apex var jumpApex = GROUND_Y + cat.jumpVelocity * (Math.abs(cat.jumpVelocity) / (2 * cat.gravity)); var minY = GROUND_Y - 400; var maxY = GROUND_Y - 1000; if (maxY < 0) maxY = 0; gold.y = minY - Math.random() * (minY - maxY); gold.lastX = gold.x; gold.collected = false; gold.speed = gold.speed * speedMultiplier; game.addChild(gold); golds.push(gold); // Gold appears less frequently than cacti nextGoldTick = 80 + Math.floor(Math.random() * 120); } else { nextGoldTick--; } // Update golds, check for collection for (var j = golds.length - 1; j >= 0; j--) { var gold = golds[j]; gold.update(); // Remove if off screen if (gold.x < -200) { gold.destroy(); golds.splice(j, 1); continue; } // Collect gold: only trigger on first intersect and not already collected if (!gold.collected && cat.intersects(gold)) { gold.collected = true; goldScore++; goldScoreTxt.setText(goldScore); gold.destroy(); golds.splice(j, 1); continue; } } // Update cacti, check for collision and scoring for (var i = cacti.length - 1; i >= 0; i--) { var cactus = cacti[i]; cactus.update(); // Remove if off screen if (cactus.x < -200) { cactus.destroy(); cacti.splice(i, 1); continue; } // Collision detection (only trigger on first intersect) if (!cactus.lastWasIntersecting && cat.intersects(cactus)) { // Game over LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); gameOver = true; return; } // Scoring: passed cactus (cat.x > cactus.x + cactus.width/2) and not already scored if (!cactus.scored && cat.x > cactus.x + cactus.width / 2) { score++; scoreTxt.setText(score); cactus.scored = true; // Increase speed multiplier, capped at max speedMultiplier += SPEED_MULTIPLIER_INCREMENT; if (speedMultiplier > SPEED_MULTIPLIER_MAX) speedMultiplier = SPEED_MULTIPLIER_MAX; } cactus.lastWasIntersecting = cat.intersects(cactus); } };
===================================================================
--- original.js
+++ change.js
@@ -158,8 +158,34 @@
self.lastX = self.x;
};
return self;
});
+// ParallaxLayer class: moves left, destroys itself off screen, for background depth
+var ParallaxLayer = Container.expand(function () {
+ var self = Container.call(this);
+ // Use a colored ellipse for background hills/mountains
+ var layerSprite = self.attachAsset('centerCircle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Randomize size and color for variety
+ var scale = 6 + Math.random() * 4;
+ layerSprite.width = 600 * scale;
+ layerSprite.height = 180 * scale;
+ // Pick a color for the layer (distant blue, purple, or brownish)
+ var colors = [0xB0B8D1, 0xA68BBE, 0xC2B280, 0xE0CDA9];
+ layerSprite.tint = colors[Math.floor(Math.random() * colors.length)];
+ layerSprite.alpha = 0.22 + Math.random() * 0.13;
+ self.speed = 0.3 + Math.random() * 0.5; // slower than clouds
+ self.update = function () {
+ self.x -= self.speed;
+ if (self.lastX >= -800 && self.x < -800) {
+ self.destroy();
+ }
+ self.lastX = self.x;
+ };
+ return self;
+});
// Sun class: static, top right
var Sun = Container.expand(function () {
var self = Container.call(this);
// Use a yellow ellipse for the sun
@@ -185,8 +211,11 @@
* Game Code
****/
;
// --- GAME CODE ---
+// Parallax background layers
+var parallaxLayers = [];
+var nextParallaxTick = 0;
// Sun and clouds
var sun;
var clouds = [];
var nextCloudTick = 0;
@@ -229,8 +258,19 @@
goldScoreTxt.anchor.set(0, 0);
goldScoreTxt.x = 120; // right of main score
goldScoreTxt.y = 20;
LK.gui.top.addChild(goldScoreTxt);
+// Add parallax background layers (hills/mountains) at different depths
+for (var i = 0; i < 4; i++) {
+ var layer = new ParallaxLayer();
+ layer.x = 300 + Math.random() * 1800;
+ // Place layers at different vertical positions for depth
+ layer.y = 1700 + i * 180 + Math.random() * 80;
+ layer.lastX = layer.x;
+ game.addChild(layer);
+ parallaxLayers.push(layer);
+}
+nextParallaxTick = 80 + Math.floor(Math.random() * 120);
// Add sun (top right, margin from edge)
sun = new Sun();
sun.x = 2048 - 220;
sun.y = 220;
@@ -280,8 +320,30 @@
};
// Main update loop
game.update = function () {
if (gameOver) return;
+ // Update parallax background layers and spawn new ones
+ for (var i = parallaxLayers.length - 1; i >= 0; i--) {
+ var layer = parallaxLayers[i];
+ layer.update();
+ if (layer.x < -800) {
+ layer.destroy();
+ parallaxLayers.splice(i, 1);
+ }
+ }
+ if (nextParallaxTick <= 0) {
+ var layer = new ParallaxLayer();
+ layer.x = 2048 + 400;
+ // Randomize vertical position for depth
+ var baseY = 1700 + Math.floor(Math.random() * 4) * 180;
+ layer.y = baseY + Math.random() * 80;
+ layer.lastX = layer.x;
+ game.addChild(layer);
+ parallaxLayers.push(layer);
+ nextParallaxTick = 80 + Math.floor(Math.random() * 120);
+ } else {
+ nextParallaxTick--;
+ }
// Update clouds and spawn new ones
for (var i = clouds.length - 1; i >= 0; i--) {
var cloud = clouds[i];
cloud.update();