User prompt
Move signals closer to each other
User prompt
Ensure when the game is starting the player falling from the top of the screen
User prompt
Ensure fee signals already arriving under player when the game is starting
Code edit (1 edits merged)
Please save this source code
User prompt
StockSharks: Market Runner
Initial prompt
'Stocksharks' Endless runner game. The player has to jump on the Stock Market charts that load on the far right of the screen and move to the left. If green vertical signals arrive, they are always higher and higher, loaded in a staggered arrangement, while if red vertical signals arrive, they are placed lower and lower. The player jumps on the top of the green signals, and when touch the red signal, then fall to the bottom of the screen. Also load arriving memecoins from the right side and they count bonus point. At the bottom of the screen, a shark swims horizontally hunting the player.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Memecoin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('memecoin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.active = true;
self.collected = false;
self.update = function () {
if (!self.active) {
return;
}
self.x -= self.speed;
// Rotate coin
coinGraphics.rotation += 0.03;
// Remove when off screen
if (self.x < -100) {
self.active = false;
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.vx = 0;
self.vy = 0;
self.gravity = 0.5;
self.jumpPower = -15;
self.isJumping = false;
self.isDead = false;
self.jump = function () {
if (!self.isJumping && !self.isDead) {
self.vy = self.jumpPower;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.update = function () {
if (self.isDead) {
return;
}
// Apply gravity
self.vy += self.gravity;
// Apply movement
self.y += self.vy;
// Ground collision detection
if (self.y > 2732 - 250) {
// Shark zone
self.y = 2732 - 250;
self.vy = 0;
self.isJumping = false;
}
};
return self;
});
var Shark = Container.expand(function () {
var self = Container.call(this);
var sharkGraphics = self.attachAsset('shark', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.direction = 1;
self.amplitude = 100;
self.centerY = 2732 - 100;
self.startX = 400;
self.time = 0;
self.update = function () {
self.time += 0.02;
// Shark moves in a wavy pattern along the bottom
self.x = self.startX + Math.sin(self.time) * self.amplitude;
self.y = self.centerY + Math.sin(self.time * 2) * 20;
// Flip shark based on direction
if (Math.sin(self.time) > 0 && self.direction === -1) {
self.direction = 1;
sharkGraphics.scale.x = 1;
} else if (Math.sin(self.time) < 0 && self.direction === 1) {
self.direction = -1;
sharkGraphics.scale.x = -1;
}
};
return self;
});
var Signal = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'green';
var assetId = self.type === 'green' ? 'greenSignal' : 'redSignal';
var signalGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.active = true;
self.update = function () {
if (!self.active) {
return;
}
self.x -= self.speed;
// Remove when off screen
if (self.x < -200) {
self.active = false;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001F3F
});
/****
* Game Code
****/
// Game variables
var player;
var signals = [];
var memecoins = [];
var shark;
var isGameActive = true;
var gameSpeed = 1;
var lastSignalTime = 0;
var lastCoinTime = 0;
var score = 0;
var scoreIncrement = 0.1;
var distanceTraveled = 0;
// UI elements
var scoreTxt;
var highScoreTxt;
// Initialize UI
function initUI() {
// Score text
scoreTxt = new Text2('SCORE: 0', {
size: 70,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 50;
// High score text
var highScore = storage.highScore || 0;
highScoreTxt = new Text2('HIGH SCORE: ' + Math.floor(highScore), {
size: 50,
fill: 0xFFD700
});
highScoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(highScoreTxt);
highScoreTxt.y = 130;
}
// Initialize game world
function initGame() {
isGameActive = true;
score = 0;
distanceTraveled = 0;
gameSpeed = 1;
// Create player
player = new Player();
player.x = 400;
player.y = 1500;
game.addChild(player);
// Create shark
shark = new Shark();
shark.y = 2732 - 100;
game.addChild(shark);
// Clear signals and coins
clearEntities();
// Start game music
LK.playMusic('gameMusic');
}
// Clear all entities
function clearEntities() {
for (var i = signals.length - 1; i >= 0; i--) {
signals[i].destroy();
signals.splice(i, 1);
}
for (var i = memecoins.length - 1; i >= 0; i--) {
memecoins[i].destroy();
memecoins.splice(i, 1);
}
}
// Spawn signals
function spawnSignal() {
var currentTime = Date.now();
// Spawn signals at intervals
if (currentTime - lastSignalTime > 1200 / gameSpeed) {
var type = Math.random() < 0.6 ? 'green' : 'red'; // 60% green, 40% red
var signal = new Signal(type);
signal.x = 2048 + 150;
// Green signals appear higher, red signals lower
if (type === 'green') {
signal.y = 1300 + Math.random() * 700;
} else {
signal.y = 1700 + Math.random() * 500;
}
signals.push(signal);
game.addChild(signal);
lastSignalTime = currentTime;
}
}
// Spawn memecoins
function spawnMemecoin() {
var currentTime = Date.now();
// Spawn coins less frequently than signals
if (currentTime - lastCoinTime > 3000 / gameSpeed) {
var coin = new Memecoin();
coin.x = 2048 + 150;
coin.y = 1000 + Math.random() * 1000; // Random height
memecoins.push(coin);
game.addChild(coin);
lastCoinTime = currentTime;
}
}
// Check collisions between player and signals/coins/shark
function checkCollisions() {
if (!isGameActive) {
return;
}
// Check signal collisions
for (var i = 0; i < signals.length; i++) {
var signal = signals[i];
if (signal.active && player.intersects(signal)) {
// Land on top of the signal
if (player.y < signal.y - 20 && player.vy > 0) {
player.y = signal.y - 75;
player.vy = 0;
player.isJumping = false;
// If it's a red signal, make it more slippery (player keeps falling)
if (signal.type === 'red') {
player.vy = 5;
player.isJumping = true;
}
}
}
}
// Check memecoin collisions
for (var i = 0; i < memecoins.length; i++) {
var coin = memecoins[i];
if (coin.active && !coin.collected && player.intersects(coin)) {
// Collect coin
coin.collected = true;
// Add points
score += 50;
scoreTxt.setText('SCORE: ' + Math.floor(score));
// Flash coin and remove
LK.effects.flashObject(coin, 0xFFFFFF, 300);
LK.getSound('coinCollect').play();
tween(coin, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
coin.active = false;
}
});
}
}
// Check shark collision
if (player.y > 2732 - 250 && player.intersects(shark)) {
// Game over if player touches shark
gameOver();
}
}
// Clean up inactive entities
function cleanupEntities() {
// Remove inactive signals
for (var i = signals.length - 1; i >= 0; i--) {
if (!signals[i].active) {
signals[i].destroy();
signals.splice(i, 1);
}
}
// Remove inactive coins
for (var i = memecoins.length - 1; i >= 0; i--) {
if (!memecoins[i].active) {
memecoins[i].destroy();
memecoins.splice(i, 1);
}
}
}
// Game over
function gameOver() {
isGameActive = false;
player.isDead = true;
// Play crash sound
LK.getSound('crash').play();
// Flash screen red
LK.effects.flashScreen(0xFF0000, 500);
// Update high score
var highScore = storage.highScore || 0;
if (score > highScore) {
storage.highScore = score;
highScoreTxt.setText('HIGH SCORE: ' + Math.floor(score));
}
// Show game over after a short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 800);
}
// Input handling
game.down = function (x, y, obj) {
// Jump when tapping/clicking
player.jump();
};
// Main game update loop
game.update = function () {
if (!isGameActive) {
return;
}
// Update score based on distance
distanceTraveled += gameSpeed;
score += scoreIncrement * gameSpeed;
// Update score display occasionally to avoid text updates every frame
if (Math.floor(score) % 5 === 0) {
scoreTxt.setText('SCORE: ' + Math.floor(score));
}
// Increase game speed gradually
gameSpeed = 1 + distanceTraveled / 10000;
// Spawn entities
spawnSignal();
spawnMemecoin();
// Check collisions
checkCollisions();
// Remove inactive entities
cleanupEntities();
// Check if player fell off screen
if (player.y > 2732 + 200) {
gameOver();
}
};
// Initialize UI and game
initUI();
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,350 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Memecoin = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('memecoin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 6;
+ self.active = true;
+ self.collected = false;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Rotate coin
+ coinGraphics.rotation += 0.03;
+ // Remove when off screen
+ if (self.x < -100) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.vx = 0;
+ self.vy = 0;
+ self.gravity = 0.5;
+ self.jumpPower = -15;
+ self.isJumping = false;
+ self.isDead = false;
+ self.jump = function () {
+ if (!self.isJumping && !self.isDead) {
+ self.vy = self.jumpPower;
+ self.isJumping = true;
+ LK.getSound('jump').play();
+ }
+ };
+ self.update = function () {
+ if (self.isDead) {
+ return;
+ }
+ // Apply gravity
+ self.vy += self.gravity;
+ // Apply movement
+ self.y += self.vy;
+ // Ground collision detection
+ if (self.y > 2732 - 250) {
+ // Shark zone
+ self.y = 2732 - 250;
+ self.vy = 0;
+ self.isJumping = false;
+ }
+ };
+ return self;
+});
+var Shark = Container.expand(function () {
+ var self = Container.call(this);
+ var sharkGraphics = self.attachAsset('shark', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.direction = 1;
+ self.amplitude = 100;
+ self.centerY = 2732 - 100;
+ self.startX = 400;
+ self.time = 0;
+ self.update = function () {
+ self.time += 0.02;
+ // Shark moves in a wavy pattern along the bottom
+ self.x = self.startX + Math.sin(self.time) * self.amplitude;
+ self.y = self.centerY + Math.sin(self.time * 2) * 20;
+ // Flip shark based on direction
+ if (Math.sin(self.time) > 0 && self.direction === -1) {
+ self.direction = 1;
+ sharkGraphics.scale.x = 1;
+ } else if (Math.sin(self.time) < 0 && self.direction === 1) {
+ self.direction = -1;
+ sharkGraphics.scale.x = -1;
+ }
+ };
+ return self;
+});
+var Signal = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'green';
+ var assetId = self.type === 'green' ? 'greenSignal' : 'redSignal';
+ var signalGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 6;
+ self.active = true;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Remove when off screen
+ if (self.x < -200) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x001F3F
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var signals = [];
+var memecoins = [];
+var shark;
+var isGameActive = true;
+var gameSpeed = 1;
+var lastSignalTime = 0;
+var lastCoinTime = 0;
+var score = 0;
+var scoreIncrement = 0.1;
+var distanceTraveled = 0;
+// UI elements
+var scoreTxt;
+var highScoreTxt;
+// Initialize UI
+function initUI() {
+ // Score text
+ scoreTxt = new Text2('SCORE: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ scoreTxt.anchor.set(0.5, 0);
+ LK.gui.top.addChild(scoreTxt);
+ scoreTxt.y = 50;
+ // High score text
+ var highScore = storage.highScore || 0;
+ highScoreTxt = new Text2('HIGH SCORE: ' + Math.floor(highScore), {
+ size: 50,
+ fill: 0xFFD700
+ });
+ highScoreTxt.anchor.set(0.5, 0);
+ LK.gui.top.addChild(highScoreTxt);
+ highScoreTxt.y = 130;
+}
+// Initialize game world
+function initGame() {
+ isGameActive = true;
+ score = 0;
+ distanceTraveled = 0;
+ gameSpeed = 1;
+ // Create player
+ player = new Player();
+ player.x = 400;
+ player.y = 1500;
+ game.addChild(player);
+ // Create shark
+ shark = new Shark();
+ shark.y = 2732 - 100;
+ game.addChild(shark);
+ // Clear signals and coins
+ clearEntities();
+ // Start game music
+ LK.playMusic('gameMusic');
+}
+// Clear all entities
+function clearEntities() {
+ for (var i = signals.length - 1; i >= 0; i--) {
+ signals[i].destroy();
+ signals.splice(i, 1);
+ }
+ for (var i = memecoins.length - 1; i >= 0; i--) {
+ memecoins[i].destroy();
+ memecoins.splice(i, 1);
+ }
+}
+// Spawn signals
+function spawnSignal() {
+ var currentTime = Date.now();
+ // Spawn signals at intervals
+ if (currentTime - lastSignalTime > 1200 / gameSpeed) {
+ var type = Math.random() < 0.6 ? 'green' : 'red'; // 60% green, 40% red
+ var signal = new Signal(type);
+ signal.x = 2048 + 150;
+ // Green signals appear higher, red signals lower
+ if (type === 'green') {
+ signal.y = 1300 + Math.random() * 700;
+ } else {
+ signal.y = 1700 + Math.random() * 500;
+ }
+ signals.push(signal);
+ game.addChild(signal);
+ lastSignalTime = currentTime;
+ }
+}
+// Spawn memecoins
+function spawnMemecoin() {
+ var currentTime = Date.now();
+ // Spawn coins less frequently than signals
+ if (currentTime - lastCoinTime > 3000 / gameSpeed) {
+ var coin = new Memecoin();
+ coin.x = 2048 + 150;
+ coin.y = 1000 + Math.random() * 1000; // Random height
+ memecoins.push(coin);
+ game.addChild(coin);
+ lastCoinTime = currentTime;
+ }
+}
+// Check collisions between player and signals/coins/shark
+function checkCollisions() {
+ if (!isGameActive) {
+ return;
+ }
+ // Check signal collisions
+ for (var i = 0; i < signals.length; i++) {
+ var signal = signals[i];
+ if (signal.active && player.intersects(signal)) {
+ // Land on top of the signal
+ if (player.y < signal.y - 20 && player.vy > 0) {
+ player.y = signal.y - 75;
+ player.vy = 0;
+ player.isJumping = false;
+ // If it's a red signal, make it more slippery (player keeps falling)
+ if (signal.type === 'red') {
+ player.vy = 5;
+ player.isJumping = true;
+ }
+ }
+ }
+ }
+ // Check memecoin collisions
+ for (var i = 0; i < memecoins.length; i++) {
+ var coin = memecoins[i];
+ if (coin.active && !coin.collected && player.intersects(coin)) {
+ // Collect coin
+ coin.collected = true;
+ // Add points
+ score += 50;
+ scoreTxt.setText('SCORE: ' + Math.floor(score));
+ // Flash coin and remove
+ LK.effects.flashObject(coin, 0xFFFFFF, 300);
+ LK.getSound('coinCollect').play();
+ tween(coin, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ coin.active = false;
+ }
+ });
+ }
+ }
+ // Check shark collision
+ if (player.y > 2732 - 250 && player.intersects(shark)) {
+ // Game over if player touches shark
+ gameOver();
+ }
+}
+// Clean up inactive entities
+function cleanupEntities() {
+ // Remove inactive signals
+ for (var i = signals.length - 1; i >= 0; i--) {
+ if (!signals[i].active) {
+ signals[i].destroy();
+ signals.splice(i, 1);
+ }
+ }
+ // Remove inactive coins
+ for (var i = memecoins.length - 1; i >= 0; i--) {
+ if (!memecoins[i].active) {
+ memecoins[i].destroy();
+ memecoins.splice(i, 1);
+ }
+ }
+}
+// Game over
+function gameOver() {
+ isGameActive = false;
+ player.isDead = true;
+ // Play crash sound
+ LK.getSound('crash').play();
+ // Flash screen red
+ LK.effects.flashScreen(0xFF0000, 500);
+ // Update high score
+ var highScore = storage.highScore || 0;
+ if (score > highScore) {
+ storage.highScore = score;
+ highScoreTxt.setText('HIGH SCORE: ' + Math.floor(score));
+ }
+ // Show game over after a short delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 800);
+}
+// Input handling
+game.down = function (x, y, obj) {
+ // Jump when tapping/clicking
+ player.jump();
+};
+// Main game update loop
+game.update = function () {
+ if (!isGameActive) {
+ return;
+ }
+ // Update score based on distance
+ distanceTraveled += gameSpeed;
+ score += scoreIncrement * gameSpeed;
+ // Update score display occasionally to avoid text updates every frame
+ if (Math.floor(score) % 5 === 0) {
+ scoreTxt.setText('SCORE: ' + Math.floor(score));
+ }
+ // Increase game speed gradually
+ gameSpeed = 1 + distanceTraveled / 10000;
+ // Spawn entities
+ spawnSignal();
+ spawnMemecoin();
+ // Check collisions
+ checkCollisions();
+ // Remove inactive entities
+ cleanupEntities();
+ // Check if player fell off screen
+ if (player.y > 2732 + 200) {
+ gameOver();
+ }
+};
+// Initialize UI and game
+initUI();
+initGame();
\ No newline at end of file
Grey shark, sideview. In-Game asset. 2d. High contrast. No shadows
Golden Dogecoin
Golden memecoin with sunglasses
shiba inu golden memecoin
Golden memecoin with Pepe
Golden coin with Floki
Golden coin with volt
Golden coin with cute catface
Golden coin with Trump and 'WILL FIX IT' Text
Lightning line. In-Game asset. 2d. High contrast. No shadows