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(); };
/****
* 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();
};