Code edit (10 edits merged)
Please save this source code
User prompt
Add black stroke to all Text2
User prompt
The bigger the score, the quicker the cars the palms and the roadlines go. Like if level 1 is at it is, if level 2 is 2* ... ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (10 edits merged)
Please save this source code
User prompt
Level is equal to score / 10, starting from 1. That is, score 1 = level 1, score 2 = level1, score 10 = level 2, score 20 = level3, etc
User prompt
The score should start with 0 and has nothing to do with the time. It has to do with so many trafficCars have not hit you before being destroyed.
Code edit (1 edits merged)
Please save this source code
Code edit (2 edits merged)
Please save this source code
User prompt
Remove the gameSpeed
User prompt
The speed of the trafficCars is the opposite of what i want: they start super quick coming down and then they decelerate as they come down. It should be the other way around, the more smaller the slowier, and then as they come down and get bigger and bigger, they get quicker and quicker
User prompt
When spawining a palm, calculate an additional scale that you will add to initial scaleY and scaleX and target scaleX and scaleX of the palm. That value should be between -25% and +50% ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Apply the same factor to the scaleX ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
When spawining a palm, calculate an additional scaleY that you will add to initial scaleY and target scaleY of the palm. That value should be between -25% and +50%
Code edit (1 edits merged)
Please save this source code
User prompt
Add a little +-25% of scaley randomy to the palms when generating them
Code edit (4 edits merged)
Please save this source code
User prompt
Create double the palms that you are creating right now
Code edit (2 edits merged)
Please save this source code
User prompt
The starting scaleX of the road lines should be 0.1
Code edit (8 edits merged)
Please save this source code
User prompt
Reduce the scaleX of the roadLines the smaller the progress
User prompt
I want the roadlines to be already painted when starting the game as it had passed 10 seconds
User prompt
Ok I want the roadlines to be already on the road when I start the game covering from top to bottom
Code edit (1 edits merged)
Please save this source code
User prompt
Copy the logic of the Palms to create the same but for roadLines. The starting position is centerY, the trajectory goes down to border down of the screen.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Palm = Container.expand(function () { var self = Container.call(this); var palmGraphics = self.attachAsset('palm', { anchorX: 0.5, anchorY: 0.5 }); self.width = palmGraphics.width; self.height = palmGraphics.height; self.isMoving = false; self.direction = "left"; // Default direction self.lastY = 0; self.update = function () { // Animation will be handled by tweens // This just ensures we have an update method for tracking }; return self; }); var PlayerCar = Container.expand(function () { var self = Container.call(this); var carGraphics = self.attachAsset('playerCar', { anchorX: 0.5, anchorY: 0.5 }); self.width = carGraphics.width; self.height = carGraphics.height; self.speed = 0; self.maxSpeed = 15; self.steering = 0; self.crashed = false; self.crash = function () { if (!self.crashed) { self.crashed = true; LK.getSound('crash').play(); LK.effects.flashObject(self, 0xFF0000, 1000); self.speed = Math.max(0, self.speed - 5); // Reset crash state after 1 second LK.setTimeout(function () { self.crashed = false; }, 1000); } }; self.update = function () { // Handle car physics if (!self.crashed) { self.speed = Math.min(self.maxSpeed, self.speed + 0.1); } // Apply steering if not crashed if (!self.crashed) { self.x += self.steering; } // Keep car within bounds if (self.x < self.width / 2) { self.x = self.width / 2; } if (self.x > 2048 - self.width / 2) { self.x = 2048 - self.width / 2; } }; return self; }); var RoadLine = Container.expand(function () { var self = Container.call(this); var lineGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.width = lineGraphics.width; self.height = lineGraphics.height; self.isMoving = false; self.lastY = 0; self.update = function () { // Animation will be handled by tweens // This just ensures we have an update method for tracking }; return self; }); // RoadLine class removed as requested var TrafficCar = Container.expand(function () { var self = Container.call(this); // Randomly select one of the available traffic car assets var carAssets = ['trafficCar', 'trafficCar2', 'trafficCar3', 'trafficCar4']; var selectedCarAsset = carAssets[Math.floor(Math.random() * carAssets.length)]; var carGraphics = self.attachAsset(selectedCarAsset, { anchorX: 0.5, anchorY: 0.5 }); self.width = carGraphics.width; self.height = carGraphics.height; self.speed = 5; self.direction = Math.random() > 0.5 ? 1 : -1; // Random direction: -1 = left, 1 = right self.startY = 1300; // Starting Y position (further up the screen) self.targetY = 2732 + self.height; // Y position when fully off-screen (bottom) self.initialScale = 0.1; self.targetScale = 2.0; // Set target X position in one of the specified ranges self.targetX = Math.random() > 0.5 ? Math.random() * 500 + 2000 : Math.random() * 100; // Set initial scale self.scale.set(self.initialScale); self.update = function () { // Calculate progress towards target Y var progress = (self.y - self.startY) / (self.targetY - self.startY); progress = Math.max(0, Math.min(1, progress)); // Clamp between 0 and 1 // Interpolate scale based on progress var currentScale = self.initialScale + (self.targetScale - self.initialScale) * progress; self.scale.set(currentScale); // Calculate X position based on progress (linear interpolation) var startX = 2048 / 2; // Center of screen self.x = startX + (self.targetX - startX) * progress; // Increase speed as car progresses - starting slow and getting faster var speedMultiplier = 1 + progress * 4; // Starts at 0.5 when progress=0, ends at 3.0 when progress=1 // Update Y position with increasing speed self.y += (gameSpeed - self.speed) * speedMultiplier; // Destroy if off screen if (self.y > self.targetY) { // Check against targetY // Find and remove self from trafficCars array var index = trafficCars.indexOf(self); if (index > -1) { trafficCars.splice(index, 1); } self.destroy(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game state variables var gameSpeed = 10; var gameStarted = false; var gameTime = 30; // Initial time in seconds var distance = 0; var level = 1; var checkpointDistance = 500; // Distance between checkpoints var nextCheckpointAt = checkpointDistance; var trafficCars = []; var obstacles = []; var checkpoints = []; var timeBonuses = []; var difficultyTimer; // Create container groups var palmGroup = new Container(); var roadLinesGroup = new Container(); // Create road lines var ROAD_LINE_COUNT = 15; var roadLines = []; var roadLineSpawnCooldown = 20; // Spawn a road line every 0.33 seconds if needed var roadLineSpawnTimer = 0; // Timer to track cooldown // Create palm trees var PALM_COUNT = 40; var palms = []; var centerX = 2048 / 2; // Center of screen X var centerY = 2732 / 2; // Center of screen Y var palmSpawnCooldown = 10; // Spawn a palm every 0.5 seconds if needed var palmSpawnTimer = 0; // Timer to track cooldown var lastSpawnSide = "right"; // Track the last side a palm was spawned on // Sway parameters var swayCounter = 0; // Create road var road = LK.getAsset('road', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, //y: 2732 / 2 y: 1000 }); game.addChild(road); game.addChild(palmGroup); game.addChild(roadLinesGroup); // Road lines removed as requested // Create player car var player = new PlayerCar(); player.x = 2048 / 2; player.y = 2732 - 300; game.addChild(player); // Create UI elements var timeText = new Text2('Time: 30', { size: 80, fill: 0xFFFFFF }); timeText.anchor.set(0, 0); LK.gui.topRight.addChild(timeText); timeText.x = -250; // Offset from right edge var scoreText = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.top.addChild(scoreText); var levelText = new Text2('Level: 1', { size: 80, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); LK.gui.topRight.addChild(levelText); levelText.y = 100; // Offset below time levelText.x = -250; // Offset from right edge var startText = new Text2('TAP TO START', { size: 120, fill: 0xFFFFFF }); startText.anchor.set(0.5, 0.5); LK.gui.center.addChild(startText); // Functions to spawn game elements function spawnTrafficCar() { // Only spawn a new car if there are no cars on screen if (trafficCars.length === 0) { var car = new TrafficCar(); car.x = 2048 / 2; // Start in the middle of the screen car.y = car.startY; // Start at the defined startY car.speed = 3 + Math.random() * 5; // Random speed trafficCars.push(car); game.addChild(car); } // Schedule next check for spawning var nextSpawnTime = 1000; // Check every second LK.setTimeout(spawnTrafficCar, nextSpawnTime); } // Start game function function startGame() { gameStarted = true; gameTime = 30; distance = 0; level = 1; gameSpeed = 10; nextCheckpointAt = checkpointDistance; LK.setScore(0); // Initialize road lines with pre-animated positions as if they had already been running for 10 seconds roadLines = []; for (var i = 0; i < roadLinesGroup.children.length; i++) { roadLinesGroup.children[i].destroy(); } roadLinesGroup.removeChildren(); roadLineSpawnTimer = 0; // Create pre-existing road lines as if they were already running for 10 seconds for (var i = 0; i < ROAD_LINE_COUNT; i++) { var newRoadLine = new RoadLine(); // Calculate a position along the animation path as if it had been running // Progress ranges from 0 (just started) to 1 (almost finished) var progress = i / ROAD_LINE_COUNT; // Start at center X and interpolate Y based on progress newRoadLine.x = centerX + 15; // Calculate Y position - from center-50 to beyond bottom of screen var startY = centerY - 50; var targetY = 2732 + 100; newRoadLine.y = startY + (targetY - startY) * progress; // Calculate scale based on progress (0.1 to 1.0) var startScale = 0.1; var endScale = 1.0; var currentScale = startScale + (endScale - startScale) * progress; newRoadLine.scale.set(currentScale); newRoadLine.lastY = newRoadLine.y; newRoadLine.isMoving = true; // Only add the road line and start animation if it's still on screen if (newRoadLine.y < 2732) { // Create tween animation with perspective effect - already in progress var remainingDuration = 4000 * (1 - progress); tween(newRoadLine, { y: targetY, scaleX: endScale, scaleY: endScale }, { duration: remainingDuration, easing: tween.easeIn }); roadLines.push(newRoadLine); roadLinesGroup.addChild(newRoadLine); } else { newRoadLine.destroy(); } } // Update UI scoreText.setText('Score: 0'); timeText.setText('Time: ' + Math.ceil(gameTime)); levelText.setText('Level: ' + level); // Remove start text LK.gui.center.removeChild(startText); // Start spawning game elements spawnTrafficCar(); // Set timer to increase difficulty difficultyTimer = LK.setInterval(function () { if (gameStarted) { level++; gameSpeed += 1; levelText.setText('Level: ' + level); } }, 30000); // Increase difficulty every 30 seconds // Play background music LK.playMusic('bgmusic'); // Palm spawning is handled in the update function } // Handle touch input game.down = function (x, y) { if (!gameStarted) { startGame(); return; } }; game.move = function (x, y) { if (!gameStarted) { return; } // Move player car directly to mouse X position var targetX = x; // Apply smooth movement by calculating the difference var deltaX = targetX - player.x; player.steering = deltaX * 0.1; // Smooth movement factor }; game.up = function () { if (gameStarted) { // No need to reset steering as we'll continue to follow mouse } }; // Main game update function game.update = function () { if (!gameStarted) { return; } // Update road lines if (gameStarted) { // Update road line animations for (var r = roadLines.length - 1; r >= 0; r--) { var roadLine = roadLines[r]; // Check if roadLine exists before accessing its properties if (roadLine) { roadLine.lastY = roadLine.y; // Start a new roadLine animation if roadLine is not already moving if (roadLine.isMoving === false) { roadLine.isMoving = true; // Set target position - straight down the screen var targetY = 2732 + 100; // Below bottom of screen var targetScale = 1.0; // End larger // Create tween animation with perspective effect tween(roadLine, { y: targetY, scaleX: targetScale, scaleY: targetScale }, { duration: 4000, easing: tween.easeIn }); } // Check if roadLine has moved significantly past the bottom of the screen and destroy it var destroyYPosition = 2732 - 300; // Check if center is below the bottom edge if (roadLine.isMoving && roadLine.y > destroyYPosition) { // RoadLine is off-screen, destroy it var index = roadLines.indexOf(roadLine); if (index > -1) { roadLinesGroup.removeChild(roadLine); roadLines.splice(index, 1); roadLine.destroy(); } // Skip to next roadLine as this one is destroyed continue; } } } // End of loop processing existing road lines // Update road line spawn timer and generate new road lines if needed roadLineSpawnTimer -= 1; if (roadLineSpawnTimer <= 0 && roadLines.length < ROAD_LINE_COUNT) { roadLineSpawnTimer = roadLineSpawnCooldown; // Reset timer var newRoadLine = new RoadLine(); // Start at center X and at center Y newRoadLine.x = centerX + 15; newRoadLine.y = centerY - 50; newRoadLine.scale.set(0.1); // Start small newRoadLine.lastY = newRoadLine.y; newRoadLine.isMoving = false; // Flag to track if road line is currently animating roadLines.push(newRoadLine); roadLinesGroup.addChild(newRoadLine); } } // Road lines removed as requested // Update game time gameTime -= 1 / 60; // Assuming 60 FPS timeText.setText('Time: ' + Math.ceil(gameTime)); // Update distance if (gameStarted) { distance += gameSpeed; LK.setScore(Math.floor(distance / 10)); scoreText.setText('Score: ' + LK.getScore()); // Update palm animations for (var p = palms.length - 1; p >= 0; p--) { var palm = palms[p]; // Check if palm exists before accessing its properties if (palm) { palm.lastY = palm.y; // Start a new palm animation if palm is not already moving if (palm.isMoving === false) { palm.isMoving = true; // Set target position based on direction (left or right corner) var targetX = palm.direction === "left" ? -12000 : 14500; // Left or right edge var targetY = 2732 + 100; // Below bottom of screen var targetScale = 2.0; // End larger // Create tween animation with perspective effect - use same duration for all palms tween(palm, { x: targetX, y: targetY, scaleX: targetScale * (lastSpawnSide === "right" ? 1 : -1), scaleY: targetScale }, { duration: 7000, // Same fixed duration for all palms: 6 seconds (half speed) easing: tween.easeIn // Removed onFinish callback }); } // Check if palm has moved significantly past the bottom of the screen and destroy it var destroyYPosition = 2500; // Check if center is 150px below the bottom edge if (palm.isMoving && palm.y > destroyYPosition) { // Palm is off-screen, destroy it var index = palms.indexOf(palm); if (index > -1) { palmGroup.removeChild(palm); palms.splice(index, 1); palm.destroy(); } // Skip to next palm as this one is destroyed continue; } } } // End of loop processing existing palms // Update palm spawn timer and generate new palms if needed palmSpawnTimer -= 1; if (palmSpawnTimer <= 0 && palms.length < PALM_COUNT) { palmSpawnTimer = palmSpawnCooldown; // Reset timer var newPalm = new Palm(); // Alternate spawn side based on the last spawned side lastSpawnSide = lastSpawnSide === "right" ? "left" : "right"; // Start from exact center point newPalm.x = centerX + (lastSpawnSide === "right" ? 50 : -50); newPalm.y = centerY - 100; // Start at center newPalm.scale.set(0.005); // Start small newPalm.scaleX *= lastSpawnSide === "right" ? 1 : -1; newPalm.lastY = newPalm.y; newPalm.direction = lastSpawnSide; // Use the determined side newPalm.isMoving = false; // Flag to track if palm is currently animating palms.push(newPalm); palmGroup.addChild(newPalm); } } // Game will continue indefinitely - removed game over condition gameTime = Math.max(gameTime, 0.1); // Keep time from reaching zero // Check collisions with traffic cars but just trigger visual effect without ending game for (var i = trafficCars.length - 1; i >= 0; i--) { var car = trafficCars[i]; if (player.intersects(car) && !player.crashed) { player.crash(); trafficCars.splice(i, 1); car.destroy(); // Add small time bonus on collision instead of ending game gameTime += 1; } } }; function endGame() { if (!gameStarted) { return; } // Just save high score without ending the game if (LK.getScore() > storage.highScore) { storage.highScore = LK.getScore(); } // Game continues - no game over screen }
===================================================================
--- original.js
+++ change.js
@@ -166,13 +166,13 @@
var roadLines = [];
var roadLineSpawnCooldown = 20; // Spawn a road line every 0.33 seconds if needed
var roadLineSpawnTimer = 0; // Timer to track cooldown
// Create palm trees
-var PALM_COUNT = 80;
+var PALM_COUNT = 40;
var palms = [];
var centerX = 2048 / 2; // Center of screen X
var centerY = 2732 / 2; // Center of screen Y
-var palmSpawnCooldown = 15; // Spawn a palm every 0.25 seconds if needed
+var palmSpawnCooldown = 10; // Spawn a palm every 0.5 seconds if needed
var palmSpawnTimer = 0; // Timer to track cooldown
var lastSpawnSide = "right"; // Track the last side a palm was spawned on
// Sway parameters
var swayCounter = 0;
@@ -306,51 +306,8 @@
}
}, 30000); // Increase difficulty every 30 seconds
// Play background music
LK.playMusic('bgmusic');
- // Pre-initialize palms on both sides when starting
- palms = [];
- for (var i = 0; i < palmGroup.children.length; i++) {
- palmGroup.children[i].destroy();
- }
- palmGroup.removeChildren();
- palmSpawnTimer = 0;
- // Create pre-existing palms as if they were already running for 10 seconds
- for (var i = 0; i < PALM_COUNT / 2; i++) {
- // Create two palms - one for each side
- var rightPalm = new Palm();
- var leftPalm = new Palm();
- // Calculate a position along the animation path as if they had been running
- var progress = i / (PALM_COUNT / 2);
- // Right palm
- rightPalm.x = centerX + 50 + progress * 3000; // Gradually move away from center
- rightPalm.y = centerY - 100 + progress * 2900; // Move down the screen
- rightPalm.scale.set(0.005 + progress * 1.995); // Scale from 0.005 to 2.0
- rightPalm.lastY = rightPalm.y;
- rightPalm.direction = "right";
- rightPalm.isMoving = true;
- // Left palm
- leftPalm.x = centerX - 50 - progress * 3000; // Gradually move away from center
- leftPalm.y = centerY - 100 + progress * 2900; // Move down the screen
- leftPalm.scale.set(0.005 + progress * 1.995); // Scale from 0.005 to 2.0
- leftPalm.scaleX *= -1; // Flip for left side
- leftPalm.lastY = leftPalm.y;
- leftPalm.direction = "left";
- leftPalm.isMoving = true;
- // Only add palms that are still on screen
- if (rightPalm.y < 2732) {
- palms.push(rightPalm);
- palmGroup.addChild(rightPalm);
- } else {
- rightPalm.destroy();
- }
- if (leftPalm.y < 2732) {
- palms.push(leftPalm);
- palmGroup.addChild(leftPalm);
- } else {
- leftPalm.destroy();
- }
- }
// Palm spawning is handled in the update function
}
// Handle touch input
game.down = function (x, y) {
@@ -485,31 +442,21 @@
// Update palm spawn timer and generate new palms if needed
palmSpawnTimer -= 1;
if (palmSpawnTimer <= 0 && palms.length < PALM_COUNT) {
palmSpawnTimer = palmSpawnCooldown; // Reset timer
- // Create two palms simultaneously - one on each side
- var rightPalm = new Palm();
- var leftPalm = new Palm();
- // Right side palm
- rightPalm.x = centerX + 50;
- rightPalm.y = centerY - 100; // Start at center
- rightPalm.scale.set(0.005); // Start small
- rightPalm.lastY = rightPalm.y;
- rightPalm.direction = "right";
- rightPalm.isMoving = false;
- // Left side palm
- leftPalm.x = centerX - 50;
- leftPalm.y = centerY - 100; // Start at center
- leftPalm.scale.set(0.005); // Start small
- leftPalm.scaleX *= -1; // Flip for left side
- leftPalm.lastY = leftPalm.y;
- leftPalm.direction = "left";
- leftPalm.isMoving = false;
- // Add both palms to game
- palms.push(rightPalm);
- palms.push(leftPalm);
- palmGroup.addChild(rightPalm);
- palmGroup.addChild(leftPalm);
+ var newPalm = new Palm();
+ // Alternate spawn side based on the last spawned side
+ lastSpawnSide = lastSpawnSide === "right" ? "left" : "right";
+ // Start from exact center point
+ newPalm.x = centerX + (lastSpawnSide === "right" ? 50 : -50);
+ newPalm.y = centerY - 100; // Start at center
+ newPalm.scale.set(0.005); // Start small
+ newPalm.scaleX *= lastSpawnSide === "right" ? 1 : -1;
+ newPalm.lastY = newPalm.y;
+ newPalm.direction = lastSpawnSide; // Use the determined side
+ newPalm.isMoving = false; // Flag to track if palm is currently animating
+ palms.push(newPalm);
+ palmGroup.addChild(newPalm);
}
}
// Game will continue indefinitely - removed game over condition
gameTime = Math.max(gameTime, 0.1); // Keep time from reaching zero