Code edit (1 edits merged)
Please save this source code
User prompt
Pixel Dash: Endless Runner
Initial prompt
Title: "Pixel Dash: Endless Runner" A fast-paced, retro-style endless runner with simple controls and addictive gameplay. Long Description: "Pixel Dash" is a 2D side-scrolling endless runner where players control a character that automatically runs forward, dodging obstacles and collecting coins. Inspired by classics like Temple Run and Flappy Bird, this game features retro pixel art, smooth controls, and progressively challenging gameplay. Key Features: One-Tap Jumps: Simple tap/click controls for jumping over obstacles. Procedural Obstacles: Randomly generated gaps, spikes, and enemies. Score & Coins: Earn points by surviving longer and grabbing coins. Retro Aesthetic: Vibrant 16-bit pixel art and chiptune sound effects. High Scores: Compete against yourself or friends for the best run. Perfect for quick gaming sessions, Pixel Dash is easy to learn but hard to master! Game Flow: Start Screen: Pixel-style title ("PIXEL DASH") with a Start Button. Optional: Character selection (e.g., Knight, Robot, Bird). Gameplay: Player auto-runs to the right. Tap/click to jump over obstacles (spikes, pits, enemies). Collect coins for bonus points. Speed increases over time for added challenge. Game Over: Crash into an obstacle? "Game Over!" screen appears. Display Final Score and Best Score. Buttons: Restart / Main Menu. Extras (Optional): Unlockable characters. Daily challenges. Leaderboards (via Unity Gaming Services). Hashtags: #EndlessRunner #PixelArt #IndieGame #UnityGameDev #RetroGaming #HyperCasual #GameDesign #2DGame
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.collected = false; self.update = function () { self.x -= self.speed; coinGraphics.rotation += 0.1; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 1.0 }); self.speed = 8; self.moveDirection = 1; self.moveRange = 100; self.startY = 0; self.update = function () { self.x -= self.speed; self.y += self.moveDirection * 2; if (Math.abs(self.y - self.startY) > self.moveRange) { self.moveDirection *= -1; } }; return self; }); var Gap = Container.expand(function () { var self = Container.call(this); var gapGraphics = self.attachAsset('gap', { anchorX: 0, anchorY: 0 }); self.speed = 8; self.update = function () { self.x -= self.speed; }; return self; }); var Ground = Container.expand(function () { var self = Container.call(this); var groundGraphics = self.attachAsset('ground', { anchorX: 0, anchorY: 0 }); self.speed = 8; self.update = function () { self.x -= self.speed; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 1.0 }); self.velocityY = 0; self.isGrounded = false; self.jumpPower = -20; self.gravity = 1.2; self.groundY = 2400; self.jump = function () { if (self.isGrounded) { self.velocityY = self.jumpPower; self.isGrounded = false; LK.getSound('jump').play(); } }; self.update = function () { self.velocityY += self.gravity; self.y += self.velocityY; if (self.y >= self.groundY) { self.y = self.groundY; self.velocityY = 0; self.isGrounded = true; } }; return self; }); var Spike = Container.expand(function () { var self = Container.call(this); var spikeGraphics = self.attachAsset('spike', { anchorX: 0.5, anchorY: 1.0 }); self.speed = 8; self.update = function () { self.x -= self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ var player; var obstacles = []; var coins = []; var groundTiles = []; var gameSpeed = 8; var spawnTimer = 0; var coinSpawnTimer = 0; var speedIncreaseTimer = 0; var distance = 0; var coinScore = 0; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreText); scoreText.x = 120; scoreText.y = 20; var distanceText = new Text2('Distance: 0m', { size: 60, fill: 0xFFFFFF }); distanceText.anchor.set(1, 0); LK.gui.topRight.addChild(distanceText); distanceText.x = -20; distanceText.y = 20; // Initialize player player = game.addChild(new Player()); player.x = 300; player.y = 2400; // Initialize ground tiles for (var i = 0; i < 15; i++) { var groundTile = game.addChild(new Ground()); groundTile.x = i * 200; groundTile.y = 2400; groundTiles.push(groundTile); } function spawnObstacle() { var obstacleType = Math.floor(Math.random() * 3); var obstacle; switch (obstacleType) { case 0: // Spike obstacle = new Spike(); obstacle.x = 2200; obstacle.y = 2400; break; case 1: // Gap obstacle = new Gap(); obstacle.x = 2200; obstacle.y = 2400; break; case 2: // Enemy obstacle = new Enemy(); obstacle.x = 2200; obstacle.y = 2200; obstacle.startY = obstacle.y; break; } if (obstacle) { obstacles.push(obstacle); game.addChild(obstacle); } } function spawnCoin() { var coin = new Coin(); coin.x = 2200; coin.y = 2000 + Math.random() * 300; coins.push(coin); game.addChild(coin); } function updateScore() { var totalScore = Math.floor(distance / 10) + coinScore * 10; scoreText.setText('Score: ' + totalScore); distanceText.setText('Distance: ' + Math.floor(distance / 10) + 'm'); LK.setScore(totalScore); } function checkCollisions() { // Check obstacle collisions for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (player.intersects(obstacle)) { LK.effects.flashScreen(0xff0000, 500); LK.showGameOver(); return; } } // Check coin collisions for (var j = coins.length - 1; j >= 0; j--) { var coin = coins[j]; if (!coin.collected && player.intersects(coin)) { coin.collected = true; coinScore++; LK.getSound('coin').play(); coin.alpha = 0; tween(coin, { scaleX: 2, scaleY: 2 }, { duration: 200 }); } } } game.down = function (x, y, obj) { player.jump(); }; game.update = function () { distance += gameSpeed / 10; // Update all objects for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.speed = gameSpeed; if (obstacle.x < -200) { obstacle.destroy(); obstacles.splice(i, 1); } } for (var j = coins.length - 1; j >= 0; j--) { var coin = coins[j]; coin.speed = gameSpeed; if (coin.x < -100) { coin.destroy(); coins.splice(j, 1); } } for (var k = 0; k < groundTiles.length; k++) { var tile = groundTiles[k]; tile.speed = gameSpeed; if (tile.x < -200) { tile.x = tile.x + groundTiles.length * 200; } } // Spawn obstacles spawnTimer++; if (spawnTimer > 80 - Math.min(gameSpeed * 2, 50)) { spawnObstacle(); spawnTimer = 0; } // Spawn coins coinSpawnTimer++; if (coinSpawnTimer > 120) { if (Math.random() < 0.7) { spawnCoin(); } coinSpawnTimer = 0; } // Increase speed over time speedIncreaseTimer++; if (speedIncreaseTimer > 300) { gameSpeed += 0.5; speedIncreaseTimer = 0; } checkCollisions(); updateScore(); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,276 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.collected = false;
+ self.update = function () {
+ self.x -= self.speed;
+ coinGraphics.rotation += 0.1;
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.speed = 8;
+ self.moveDirection = 1;
+ self.moveRange = 100;
+ self.startY = 0;
+ self.update = function () {
+ self.x -= self.speed;
+ self.y += self.moveDirection * 2;
+ if (Math.abs(self.y - self.startY) > self.moveRange) {
+ self.moveDirection *= -1;
+ }
+ };
+ return self;
+});
+var Gap = Container.expand(function () {
+ var self = Container.call(this);
+ var gapGraphics = self.attachAsset('gap', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.speed = 8;
+ self.update = function () {
+ self.x -= self.speed;
+ };
+ return self;
+});
+var Ground = Container.expand(function () {
+ var self = Container.call(this);
+ var groundGraphics = self.attachAsset('ground', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.speed = 8;
+ self.update = function () {
+ self.x -= self.speed;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.velocityY = 0;
+ self.isGrounded = false;
+ self.jumpPower = -20;
+ self.gravity = 1.2;
+ self.groundY = 2400;
+ self.jump = function () {
+ if (self.isGrounded) {
+ self.velocityY = self.jumpPower;
+ self.isGrounded = false;
+ LK.getSound('jump').play();
+ }
+ };
+ self.update = function () {
+ self.velocityY += self.gravity;
+ self.y += self.velocityY;
+ if (self.y >= self.groundY) {
+ self.y = self.groundY;
+ self.velocityY = 0;
+ self.isGrounded = true;
+ }
+ };
+ return self;
+});
+var Spike = Container.expand(function () {
+ var self = Container.call(this);
+ var spikeGraphics = self.attachAsset('spike', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.speed = 8;
+ self.update = function () {
+ self.x -= self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87ceeb
+});
+
+/****
+* Game Code
+****/
+var player;
+var obstacles = [];
+var coins = [];
+var groundTiles = [];
+var gameSpeed = 8;
+var spawnTimer = 0;
+var coinSpawnTimer = 0;
+var speedIncreaseTimer = 0;
+var distance = 0;
+var coinScore = 0;
+// UI Elements
+var scoreText = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(scoreText);
+scoreText.x = 120;
+scoreText.y = 20;
+var distanceText = new Text2('Distance: 0m', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+distanceText.anchor.set(1, 0);
+LK.gui.topRight.addChild(distanceText);
+distanceText.x = -20;
+distanceText.y = 20;
+// Initialize player
+player = game.addChild(new Player());
+player.x = 300;
+player.y = 2400;
+// Initialize ground tiles
+for (var i = 0; i < 15; i++) {
+ var groundTile = game.addChild(new Ground());
+ groundTile.x = i * 200;
+ groundTile.y = 2400;
+ groundTiles.push(groundTile);
+}
+function spawnObstacle() {
+ var obstacleType = Math.floor(Math.random() * 3);
+ var obstacle;
+ switch (obstacleType) {
+ case 0:
+ // Spike
+ obstacle = new Spike();
+ obstacle.x = 2200;
+ obstacle.y = 2400;
+ break;
+ case 1:
+ // Gap
+ obstacle = new Gap();
+ obstacle.x = 2200;
+ obstacle.y = 2400;
+ break;
+ case 2:
+ // Enemy
+ obstacle = new Enemy();
+ obstacle.x = 2200;
+ obstacle.y = 2200;
+ obstacle.startY = obstacle.y;
+ break;
+ }
+ if (obstacle) {
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+ }
+}
+function spawnCoin() {
+ var coin = new Coin();
+ coin.x = 2200;
+ coin.y = 2000 + Math.random() * 300;
+ coins.push(coin);
+ game.addChild(coin);
+}
+function updateScore() {
+ var totalScore = Math.floor(distance / 10) + coinScore * 10;
+ scoreText.setText('Score: ' + totalScore);
+ distanceText.setText('Distance: ' + Math.floor(distance / 10) + 'm');
+ LK.setScore(totalScore);
+}
+function checkCollisions() {
+ // Check obstacle collisions
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (player.intersects(obstacle)) {
+ LK.effects.flashScreen(0xff0000, 500);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Check coin collisions
+ for (var j = coins.length - 1; j >= 0; j--) {
+ var coin = coins[j];
+ if (!coin.collected && player.intersects(coin)) {
+ coin.collected = true;
+ coinScore++;
+ LK.getSound('coin').play();
+ coin.alpha = 0;
+ tween(coin, {
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 200
+ });
+ }
+ }
+}
+game.down = function (x, y, obj) {
+ player.jump();
+};
+game.update = function () {
+ distance += gameSpeed / 10;
+ // Update all objects
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ obstacle.speed = gameSpeed;
+ if (obstacle.x < -200) {
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ }
+ }
+ for (var j = coins.length - 1; j >= 0; j--) {
+ var coin = coins[j];
+ coin.speed = gameSpeed;
+ if (coin.x < -100) {
+ coin.destroy();
+ coins.splice(j, 1);
+ }
+ }
+ for (var k = 0; k < groundTiles.length; k++) {
+ var tile = groundTiles[k];
+ tile.speed = gameSpeed;
+ if (tile.x < -200) {
+ tile.x = tile.x + groundTiles.length * 200;
+ }
+ }
+ // Spawn obstacles
+ spawnTimer++;
+ if (spawnTimer > 80 - Math.min(gameSpeed * 2, 50)) {
+ spawnObstacle();
+ spawnTimer = 0;
+ }
+ // Spawn coins
+ coinSpawnTimer++;
+ if (coinSpawnTimer > 120) {
+ if (Math.random() < 0.7) {
+ spawnCoin();
+ }
+ coinSpawnTimer = 0;
+ }
+ // Increase speed over time
+ speedIncreaseTimer++;
+ if (speedIncreaseTimer > 300) {
+ gameSpeed += 0.5;
+ speedIncreaseTimer = 0;
+ }
+ checkCollisions();
+ updateScore();
+};
\ No newline at end of file