User prompt
Make the baterangs go the other way
User prompt
Make the stuff come from the other direction
User prompt
Make the most obstacles and coins come from the other direction
User prompt
Fix error[L598]
User prompt
Fix it
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'if (obj.event.type === "touchstart") {' Line Number: 598
Code edit (1 edits merged)
Please save this source code
User prompt
Batman: Night Runner
Initial prompt
Make a endless runner Batmobile game where you go side to side
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var BackgroundBuilding = Container.expand(function () { var self = Container.call(this); var buildingGraphics = self.attachAsset('buildingPiece', { anchorX: 0.5, anchorY: 0.5 }); // Randomize building color slightly var colorVariation = Math.random() * 0x222222; buildingGraphics.tint = 0x333333 + colorVariation; // Randomize building height var heightScale = 0.8 + Math.random() * 1.2; buildingGraphics.scaleY = heightScale; self.speed = 2 + Math.random() * 2; // Slightly randomized speed for parallax self.update = function () { self.y -= self.speed; // Loop building if it goes off screen if (self.y < -500) { self.y = 2732 + 100; self.x = Math.random() * 2048; // Random horizontal position } }; return self; }); var Batarang = Container.expand(function () { var self = Container.call(this); var batarangGraphics = self.attachAsset('batarang', { anchorX: 0.5, anchorY: 0.5 }); self.active = true; self.speed = 20; self.update = function () { self.y -= self.speed; batarangGraphics.rotation += 0.2; // Remove if off screen if (self.y < -50) { self.active = false; } }; return self; }); var Batmobile = Container.expand(function () { var self = Container.call(this); var batmobileGraphics = self.attachAsset('batmobile', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.jumpHeight = 0; self.isJumping = false; self.lane = 1; // 0 = left, 1 = center, 2 = right self.lanePositions = [600, 1024, 1448]; // x positions for the three lanes self.groundY = 2300; // ground position self.jumping = false; self.invincible = false; self.jump = function () { if (!self.jumping) { self.jumping = true; // Jump up tween(self, { y: self.groundY - 300 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { // Fall back down tween(self, { y: self.groundY }, { duration: 500, easing: tween.easeIn, onFinish: function onFinish() { self.jumping = false; } }); } }); } }; self.moveLeft = function () { if (self.lane > 0) { self.lane--; tween(self, { x: self.lanePositions[self.lane] }, { duration: 200, easing: tween.easeOut }); } }; self.moveRight = function () { if (self.lane < 2) { self.lane++; tween(self, { x: self.lanePositions[self.lane] }, { duration: 200, easing: tween.easeOut }); } }; self.makeInvincible = function (duration) { self.invincible = true; // Flash effect var flashCount = 0; var flashInterval = LK.setInterval(function () { batmobileGraphics.alpha = batmobileGraphics.alpha === 1 ? 0.3 : 1; flashCount++; if (flashCount >= 10) { LK.clearInterval(flashInterval); batmobileGraphics.alpha = 1; self.invincible = false; } }, duration / 10); }; self.shootBatarang = function () { var batarang = new Batarang(); batarang.x = self.x; batarang.y = self.y - 30; game.addChild(batarang); activeBatarangs.push(batarang); LK.getSound('batarangThrow').play(); }; return self; }); var Gadget = Container.expand(function () { var self = Container.call(this); var gadgetGraphics = self.attachAsset('gadget', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'gadget'; self.active = true; // Add some floating animation tween(gadgetGraphics, { y: 10 }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { tween(gadgetGraphics, { y: -10 }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { if (self.active) { self.update(); // Restart animation } } }); } }); self.update = function () { self.y -= gameSpeed; // Remove if off screen if (self.y < -50) { self.active = false; } // Spin the gadget gadgetGraphics.rotation += 0.05; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'obstacle'; self.active = true; self.update = function () { self.y -= gameSpeed; // Remove if off screen if (self.y < -100) { self.active = false; } }; return self; }); var Road = Container.expand(function () { var self = Container.call(this); var roadGraphics = self.attachAsset('roadPiece', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.y -= gameSpeed; // Loop road if it goes off screen if (self.y < -150) { self.y = 2732 + 150; } }; return self; }); var Villain = Container.expand(function () { var self = Container.call(this); var villainGraphics = self.attachAsset('villain', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'villain'; self.active = true; self.health = 1; self.update = function () { self.y -= gameSpeed; // Remove if off screen if (self.y < -150) { self.active = false; } }; self.hit = function () { self.health--; if (self.health <= 0) { self.active = false; LK.setScore(LK.getScore() + 100); LK.effects.flashObject(self, 0xff0000, 300); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Initialize assets used in this game. Scale them according to what is needed for the game. // Assets are automatically created and loaded during gameplay or via static code analysis // Game configuration var gameSpeed = 10; var spawnRate = 60; // Lower = more frequent spawns var difficultyTimer = 0; var difficultyInterval = 1000; // Increase difficulty every 1000 ticks (about 16 seconds) var gameOver = false; var canShoot = true; var shootCooldown = 30; // Cooldown in frames var currentCooldown = 0; var gadgetCount = 0; // Game elements var batmobile; var obstacles = []; var villains = []; var gadgets = []; var activeBatarangs = []; var roadPieces = []; var buildings = []; var lanePositions = [600, 1024, 1448]; // x positions for the three lanes // UI Elements var scoreTxt; var gadgetTxt; var highScoreTxt; // Initialize the game function initGame() { // Reset variables gameSpeed = 10; gameOver = false; obstacles = []; villains = []; gadgets = []; activeBatarangs = []; difficultyTimer = 0; gadgetCount = 0; // Set background color to dark blue (night sky) game.setBackgroundColor(0x111133); // Play background music LK.playMusic('batmanTheme', { fade: { start: 0, end: 0.7, duration: 1000 } }); // Create the road createRoad(); // Create background buildings createBuildings(); // Create the Batmobile batmobile = new Batmobile(); batmobile.x = lanePositions[1]; // Start in center lane batmobile.y = 2300; // Position near bottom of screen game.addChild(batmobile); // Create UI createUI(); // Reset score LK.setScore(0); } function createRoad() { // Create several road pieces to form a continuous road for (var i = 0; i < 3; i++) { var road = new Road(); road.x = 1024; // Center of screen road.y = i * 300 + 2300; // Stacked vertically with the first one at the bottom game.addChild(road); roadPieces.push(road); } } function createBuildings() { // Create background buildings for parallax effect for (var i = 0; i < 15; i++) { var building = new BackgroundBuilding(); building.x = Math.random() * 2048; // Random x position building.y = Math.random() * 2732; // Random y position game.addChild(building); buildings.push(building); } } function createUI() { // Score text scoreTxt = new Text2('SCORE: 0', { size: 70, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); scoreTxt.x = 150; scoreTxt.y = 50; LK.gui.addChild(scoreTxt); // Gadget counter gadgetTxt = new Text2('GADGETS: 0', { size: 70, fill: 0xFFFFFF }); gadgetTxt.anchor.set(0, 0); gadgetTxt.x = 150; gadgetTxt.y = 130; LK.gui.addChild(gadgetTxt); // High score highScoreTxt = new Text2('HIGH SCORE: ' + storage.highScore, { size: 70, fill: 0xFFFFFF }); highScoreTxt.anchor.set(1, 0); highScoreTxt.x = 1900; highScoreTxt.y = 50; LK.gui.addChild(highScoreTxt); } function spawnObstacle() { var lane = Math.floor(Math.random() * 3); // Random lane var obstacle = new Obstacle(); obstacle.x = lanePositions[lane]; obstacle.y = 2732 + 100; // Start just off-screen at the bottom game.addChild(obstacle); obstacles.push(obstacle); } function spawnVillain() { var lane = Math.floor(Math.random() * 3); // Random lane var villain = new Villain(); villain.x = lanePositions[lane]; villain.y = 2732 + 100; // Start just off-screen at the bottom game.addChild(villain); villains.push(villain); } function spawnGadget() { var lane = Math.floor(Math.random() * 3); // Random lane var gadget = new Gadget(); gadget.x = lanePositions[lane]; gadget.y = 2732 + 100; // Start just off-screen at the bottom game.addChild(gadget); gadgets.push(gadget); } function checkCollisions() { // Check Batmobile collision with obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (obstacle.active && batmobile.intersects(obstacle) && !batmobile.invincible) { // Collision with obstacle LK.getSound('crash').play(); LK.effects.flashScreen(0xff0000, 500); // Update high score if needed if (LK.getScore() > storage.highScore) { storage.highScore = LK.getScore(); highScoreTxt.setText('HIGH SCORE: ' + storage.highScore); } LK.showGameOver(); gameOver = true; return; } } // Check Batmobile collision with villains for (var i = villains.length - 1; i >= 0; i--) { var villain = villains[i]; if (villain.active && batmobile.intersects(villain) && !batmobile.invincible) { // Collision with villain LK.getSound('crash').play(); LK.effects.flashScreen(0xff0000, 500); // Update high score if needed if (LK.getScore() > storage.highScore) { storage.highScore = LK.getScore(); highScoreTxt.setText('HIGH SCORE: ' + storage.highScore); } LK.showGameOver(); gameOver = true; return; } } // Check Batmobile collection of gadgets for (var i = gadgets.length - 1; i >= 0; i--) { var gadget = gadgets[i]; if (gadget.active && batmobile.intersects(gadget)) { // Collect gadget gadget.active = false; LK.getSound('collect').play(); LK.setScore(LK.getScore() + 50); gadgetCount++; gadgetTxt.setText('GADGETS: ' + gadgetCount); // Flash gadget LK.effects.flashObject(gadget, 0xffff00, 300); gadgets.splice(i, 1); gadget.destroy(); } } // Check Batarang collision with villains for (var i = activeBatarangs.length - 1; i >= 0; i--) { var batarang = activeBatarangs[i]; if (batarang.active) { for (var j = villains.length - 1; j >= 0; j--) { var villain = villains[j]; if (villain.active && batarang.intersects(villain)) { // Hit villain with batarang villain.hit(); batarang.active = false; activeBatarangs.splice(i, 1); batarang.destroy(); if (!villain.active) { villains.splice(j, 1); villain.destroy(); } break; } } } } } function updateGameElements() { // Update road pieces for (var i = 0; i < roadPieces.length; i++) { roadPieces[i].update(); } // Update buildings for parallax effect for (var i = 0; i < buildings.length; i++) { buildings[i].update(); } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.update(); if (!obstacle.active) { obstacles.splice(i, 1); obstacle.destroy(); } } // Update villains for (var i = villains.length - 1; i >= 0; i--) { var villain = villains[i]; villain.update(); if (!villain.active) { villains.splice(i, 1); villain.destroy(); } } // Update gadgets for (var i = gadgets.length - 1; i >= 0; i--) { var gadget = gadgets[i]; gadget.update(); if (!gadget.active) { gadgets.splice(i, 1); gadget.destroy(); } } // Update batarangs for (var i = activeBatarangs.length - 1; i >= 0; i--) { var batarang = activeBatarangs[i]; batarang.update(); if (!batarang.active) { activeBatarangs.splice(i, 1); batarang.destroy(); } } } function increaseDifficulty() { difficultyTimer++; if (difficultyTimer >= difficultyInterval) { difficultyTimer = 0; // Increase game speed gameSpeed += 0.5; // Make spawns more frequent if (spawnRate > 30) { spawnRate -= 2; } // Flash screen to indicate difficulty increase LK.effects.flashScreen(0x0000ff, 300); } } function updateUI() { scoreTxt.setText('SCORE: ' + LK.getScore()); } function handleShoot() { if (currentCooldown > 0) { currentCooldown--; } else { canShoot = true; } } // Initialize the game when it starts initGame(); // Game update loop game.update = function () { if (gameOver) return; // Increase score by 1 every frame LK.setScore(LK.getScore() + 1); // Update UI updateUI(); // Handle shooting cooldown handleShoot(); // Update all game elements updateGameElements(); // Check for collisions checkCollisions(); // Increase difficulty over time increaseDifficulty(); // Randomly spawn obstacles, villains, and gadgets if (LK.ticks % spawnRate === 0) { // 70% chance for obstacle, 20% chance for villain, 10% chance for gadget var rand = Math.random(); if (rand < 0.7) { spawnObstacle(); } else if (rand < 0.9) { spawnVillain(); } else { spawnGadget(); } } }; // Handle touch inputs game.down = function (x, y, obj) { if (gameOver) return; // Determine which action to take based on touch position if (y < 1366) { // Upper half of screen - shoot if we have gadgets if (gadgetCount > 0 && canShoot) { batmobile.shootBatarang(); gadgetCount--; gadgetTxt.setText('GADGETS: ' + gadgetCount); canShoot = false; currentCooldown = shootCooldown; } } else { // Lower half of screen - movement if (x < 1024) { batmobile.moveLeft(); } else { batmobile.moveRight(); } } }; // Handle swipe up for jump var startY = 0; game.move = function (x, y, obj) { if (gameOver) return; if (obj && obj.event) { if (obj.event.type === "touchstart") { startY = y; } else if (obj.event.type === "touchmove") { var deltaY = startY - y; if (deltaY > 100) { // If swiped up more than 100px batmobile.jump(); startY = y; // Reset to prevent multiple jumps } } } };
===================================================================
--- original.js
+++ change.js
@@ -573,15 +573,17 @@
// Handle swipe up for jump
var startY = 0;
game.move = function (x, y, obj) {
if (gameOver) return;
- if (obj && obj.event && obj.event.type === "touchstart") {
- startY = y;
- } else if (obj && obj.event && obj.event.type === "touchmove") {
- var deltaY = startY - y;
- if (deltaY > 100) {
- // If swiped up more than 100px
- batmobile.jump();
- startY = y; // Reset to prevent multiple jumps
+ if (obj && obj.event) {
+ if (obj.event.type === "touchstart") {
+ startY = y;
+ } else if (obj.event.type === "touchmove") {
+ var deltaY = startY - y;
+ if (deltaY > 100) {
+ // If swiped up more than 100px
+ batmobile.jump();
+ startY = y; // Reset to prevent multiple jumps
+ }
}
}
};
\ No newline at end of file