Code edit (1 edits merged)
Please save this source code
User prompt
Cowboy Rush: Shootout Road
Initial prompt
๐ฎ Game Title: Cowboy Rush: Shootout Road --- ๐ Game Description Welcome to Cowboy Rush, a fast-paced 2D arcade shooter where YOU are the last hope of the wild west! Dodge, shoot, and survive on a triple-lane desert road while enemy cowboys chase you down. --- ๐ฏ Game Objective Stay alive as long as you can. Switch between 3 lanes, avoid bullets, and shoot down enemies chasing you. The longer you survive, the faster the game gets! --- ๐น๏ธ Gameplay Mechanics You are a lone cowboy running forward endlessly. Behind you: a gang of enemy cowboys chasing you. There are 3 lanes โ left, middle, right. Use the Left and Right buttons to switch lanes. Enemies also change lanes randomly to match your position. Tap the Shoot button to fire your revolver. You can shoot once every 1.2 seconds. Enemies shoot once every 3 seconds. Both you and enemies die with a single hit. The game gets faster over time. Reaction time shortens! --- ๐ Game Over Conditions If an enemy bullet hits you โ Game Over. The longer you survive, the higher your Score (based on time + kills). --- ๐ Leaderboard Feature Enable global leaderboards so players can compete for the Highest Score: Survive longer = Higher score Kill enemies = Bonus points Leaderboard tracks: Username Top Score Kill Count --- ๐ UI Buttons โฌ ๏ธ Left: Move to the left lane โก๏ธ Right: Move to the right lane ๐ฏ Shoot: Fire a bullet (cooldown: 1.2 sec) ๐ Restart: Restart game after Game Over --- ๐ Score System Action Points Survive 1 sec +1 Kill 1 enemy +5 --- ๐จ Visual/Style Suggestions Pixel art or cartoon 2D Desert background with cacti and old western town in distance Enemies with cowboy hats and red bandanas Speed lines as difficulty increases
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.update = function () { self.y += self.speed; }; return self; }); var EnemyCowboy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyCowboy', { anchorX: 0.5, anchorY: 0.5 }); self.lane = 1; self.speed = 3; self.lastShot = 0; self.shootCooldown = 180; // 3 seconds at 60fps self.targetLane = 1; self.laneChangeSpeed = 8; self.update = function () { self.y += self.speed; // Move towards target lane var targetX = getLaneX(self.targetLane); if (Math.abs(self.x - targetX) > self.laneChangeSpeed) { if (self.x < targetX) { self.x += self.laneChangeSpeed; } else { self.x -= self.laneChangeSpeed; } } else { self.x = targetX; self.lane = self.targetLane; } // Shooting logic self.lastShot++; if (self.lastShot >= self.shootCooldown) { self.lastShot = 0; // Create enemy bullet var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y; enemyBullets.push(bullet); game.addChild(bullet); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('cowboy', { anchorX: 0.5, anchorY: 0.5 }); self.lane = 1; self.targetLane = 1; self.laneChangeSpeed = 12; self.lastShot = 0; self.shootCooldown = 72; // 1.2 seconds at 60fps self.update = function () { // Move towards target lane var targetX = getLaneX(self.targetLane); if (Math.abs(self.x - targetX) > self.laneChangeSpeed) { if (self.x < targetX) { self.x += self.laneChangeSpeed; } else { self.x -= self.laneChangeSpeed; } } else { self.x = targetX; self.lane = self.targetLane; } self.lastShot++; }; self.moveLeft = function () { if (self.targetLane > 0) { self.targetLane--; } }; self.moveRight = function () { if (self.targetLane < 2) { self.targetLane++; } }; self.shoot = function () { if (self.lastShot >= self.shootCooldown) { self.lastShot = 0; var bullet = new PlayerBullet(); bullet.x = self.x; bullet.y = self.y; playerBullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } }; return self; }); var PlayerBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -20; self.update = function () { self.y += self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var player; var enemies = []; var playerBullets = []; var enemyBullets = []; var gameSpeed = 1; var survivalTime = 0; var killCount = 0; var lastEnemySpawn = 0; var enemySpawnRate = 300; // 5 seconds at 60fps var speedIncreaseTimer = 0; // Lane positions function getLaneX(lane) { var laneWidth = 2048 / 3; return laneWidth * lane + laneWidth / 2; } // Create road background var road = game.addChild(LK.getAsset('road', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2732 / 2 })); // Create player player = game.addChild(new Player()); player.x = getLaneX(1); player.y = 2200; // Create UI var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreTxt); scoreTxt.x = 120; scoreTxt.y = 20; var killsTxt = new Text2('Kills: 0', { size: 60, fill: 0xFFFFFF }); killsTxt.anchor.set(1, 0); LK.gui.topRight.addChild(killsTxt); killsTxt.y = 20; // Control buttons var leftBtn = new Text2('โ', { size: 120, fill: 0xFFFFFF }); leftBtn.anchor.set(0.5, 0.5); LK.gui.bottomLeft.addChild(leftBtn); leftBtn.x = 200; leftBtn.y = -150; var rightBtn = new Text2('โถ', { size: 120, fill: 0xFFFFFF }); rightBtn.anchor.set(0.5, 0.5); LK.gui.bottomRight.addChild(rightBtn); rightBtn.x = -200; rightBtn.y = -150; var shootBtn = new Text2('๐ซ', { size: 100, fill: 0xFFFFFF }); shootBtn.anchor.set(0.5, 0.5); LK.gui.bottom.addChild(shootBtn); shootBtn.y = -150; // Button event handlers leftBtn.down = function () { player.moveLeft(); }; rightBtn.down = function () { player.moveRight(); }; shootBtn.down = function () { player.shoot(); }; // Game update loop game.update = function () { // Update survival time and score survivalTime++; if (survivalTime % 60 === 0) { // Every second LK.setScore(LK.getScore() + 1); scoreTxt.setText('Score: ' + LK.getScore()); } // Increase game speed over time speedIncreaseTimer++; if (speedIncreaseTimer % 600 === 0) { // Every 10 seconds gameSpeed += 0.2; if (enemySpawnRate > 120) { enemySpawnRate -= 20; } } // Spawn enemies lastEnemySpawn++; if (lastEnemySpawn >= enemySpawnRate) { lastEnemySpawn = 0; var enemy = new EnemyCowboy(); enemy.lane = Math.floor(Math.random() * 3); enemy.targetLane = player.lane; // Target player's current lane enemy.x = getLaneX(enemy.lane); enemy.y = -100; enemy.speed *= gameSpeed; enemies.push(enemy); game.addChild(enemy); } // Update enemies and make them target player for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Occasionally retarget player's lane if (LK.ticks % 120 === 0) { enemy.targetLane = player.lane; } // Remove enemies that went off screen if (enemy.y > 2800) { enemy.destroy(); enemies.splice(i, 1); continue; } } // Update player bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var bullet = playerBullets[i]; // Remove bullets that went off screen if (bullet.y < -50) { bullet.destroy(); playerBullets.splice(i, 1); continue; } // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Enemy hit LK.getSound('enemyHit').play(); killCount++; LK.setScore(LK.getScore() + 5); scoreTxt.setText('Score: ' + LK.getScore()); killsTxt.setText('Kills: ' + killCount); // Remove bullet and enemy bullet.destroy(); playerBullets.splice(i, 1); enemy.destroy(); enemies.splice(j, 1); break; } } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; // Remove bullets that went off screen if (bullet.y > 2800) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check collision with player if (bullet.intersects(player)) { // Player hit - game over LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,300 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 15;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var EnemyCowboy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemyCowboy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.lane = 1;
+ self.speed = 3;
+ self.lastShot = 0;
+ self.shootCooldown = 180; // 3 seconds at 60fps
+ self.targetLane = 1;
+ self.laneChangeSpeed = 8;
+ self.update = function () {
+ self.y += self.speed;
+ // Move towards target lane
+ var targetX = getLaneX(self.targetLane);
+ if (Math.abs(self.x - targetX) > self.laneChangeSpeed) {
+ if (self.x < targetX) {
+ self.x += self.laneChangeSpeed;
+ } else {
+ self.x -= self.laneChangeSpeed;
+ }
+ } else {
+ self.x = targetX;
+ self.lane = self.targetLane;
+ }
+ // Shooting logic
+ self.lastShot++;
+ if (self.lastShot >= self.shootCooldown) {
+ self.lastShot = 0;
+ // Create enemy bullet
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('cowboy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.lane = 1;
+ self.targetLane = 1;
+ self.laneChangeSpeed = 12;
+ self.lastShot = 0;
+ self.shootCooldown = 72; // 1.2 seconds at 60fps
+ self.update = function () {
+ // Move towards target lane
+ var targetX = getLaneX(self.targetLane);
+ if (Math.abs(self.x - targetX) > self.laneChangeSpeed) {
+ if (self.x < targetX) {
+ self.x += self.laneChangeSpeed;
+ } else {
+ self.x -= self.laneChangeSpeed;
+ }
+ } else {
+ self.x = targetX;
+ self.lane = self.targetLane;
+ }
+ self.lastShot++;
+ };
+ self.moveLeft = function () {
+ if (self.targetLane > 0) {
+ self.targetLane--;
+ }
+ };
+ self.moveRight = function () {
+ if (self.targetLane < 2) {
+ self.targetLane++;
+ }
+ };
+ self.shoot = function () {
+ if (self.lastShot >= self.shootCooldown) {
+ self.lastShot = 0;
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ }
+ };
+ return self;
+});
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -20;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var enemies = [];
+var playerBullets = [];
+var enemyBullets = [];
+var gameSpeed = 1;
+var survivalTime = 0;
+var killCount = 0;
+var lastEnemySpawn = 0;
+var enemySpawnRate = 300; // 5 seconds at 60fps
+var speedIncreaseTimer = 0;
+// Lane positions
+function getLaneX(lane) {
+ var laneWidth = 2048 / 3;
+ return laneWidth * lane + laneWidth / 2;
+}
+// Create road background
+var road = game.addChild(LK.getAsset('road', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 2732 / 2
+}));
+// Create player
+player = game.addChild(new Player());
+player.x = getLaneX(1);
+player.y = 2200;
+// Create UI
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+LK.gui.topLeft.addChild(scoreTxt);
+scoreTxt.x = 120;
+scoreTxt.y = 20;
+var killsTxt = new Text2('Kills: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+killsTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(killsTxt);
+killsTxt.y = 20;
+// Control buttons
+var leftBtn = new Text2('โ', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+leftBtn.anchor.set(0.5, 0.5);
+LK.gui.bottomLeft.addChild(leftBtn);
+leftBtn.x = 200;
+leftBtn.y = -150;
+var rightBtn = new Text2('โถ', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+rightBtn.anchor.set(0.5, 0.5);
+LK.gui.bottomRight.addChild(rightBtn);
+rightBtn.x = -200;
+rightBtn.y = -150;
+var shootBtn = new Text2('๐ซ', {
+ size: 100,
+ fill: 0xFFFFFF
+});
+shootBtn.anchor.set(0.5, 0.5);
+LK.gui.bottom.addChild(shootBtn);
+shootBtn.y = -150;
+// Button event handlers
+leftBtn.down = function () {
+ player.moveLeft();
+};
+rightBtn.down = function () {
+ player.moveRight();
+};
+shootBtn.down = function () {
+ player.shoot();
+};
+// Game update loop
+game.update = function () {
+ // Update survival time and score
+ survivalTime++;
+ if (survivalTime % 60 === 0) {
+ // Every second
+ LK.setScore(LK.getScore() + 1);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ }
+ // Increase game speed over time
+ speedIncreaseTimer++;
+ if (speedIncreaseTimer % 600 === 0) {
+ // Every 10 seconds
+ gameSpeed += 0.2;
+ if (enemySpawnRate > 120) {
+ enemySpawnRate -= 20;
+ }
+ }
+ // Spawn enemies
+ lastEnemySpawn++;
+ if (lastEnemySpawn >= enemySpawnRate) {
+ lastEnemySpawn = 0;
+ var enemy = new EnemyCowboy();
+ enemy.lane = Math.floor(Math.random() * 3);
+ enemy.targetLane = player.lane; // Target player's current lane
+ enemy.x = getLaneX(enemy.lane);
+ enemy.y = -100;
+ enemy.speed *= gameSpeed;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ }
+ // Update enemies and make them target player
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ // Occasionally retarget player's lane
+ if (LK.ticks % 120 === 0) {
+ enemy.targetLane = player.lane;
+ }
+ // Remove enemies that went off screen
+ if (enemy.y > 2800) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ }
+ // Update player bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ // Remove bullets that went off screen
+ if (bullet.y < -50) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with enemies
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ // Enemy hit
+ LK.getSound('enemyHit').play();
+ killCount++;
+ LK.setScore(LK.getScore() + 5);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ killsTxt.setText('Kills: ' + killCount);
+ // Remove bullet and enemy
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ enemy.destroy();
+ enemies.splice(j, 1);
+ break;
+ }
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ // Remove bullets that went off screen
+ if (bullet.y > 2800) {
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (bullet.intersects(player)) {
+ // Player hit - game over
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
+};
\ No newline at end of file
2d cowboy character head. In-Game asset. 2d. High contrast. No shadows
2d revolver bullet. In-Game asset. 2d. High contrast. No shadows
2d old concrete wall suitable for desert atmosphere. In-Game asset. 2d. High contrast. No shadows
2d edgy red themed hostile cowboy character head
A 2d fired revolver. In-Game asset. 2d. High contrast. No shadows
a 2d revolver without firing effect
Let it be red themed
2d simple repair button. In-Game asset. 2d. High contrast. No shadows
2d protection shield. In-Game asset. 2d. High contrast. No shadows
2d explosion effect. In-Game asset. 2d. High contrast. No shadows