Code edit (3 edits merged)
Please save this source code
User prompt
I don't see stonksguy
User prompt
Add the stonksguy asset to display in the lower-left of the screen at all times
User prompt
Instead of the single background, make a grid of dark blue squares (outlined in lighter shade of blue) which covers the entire background but repeats like tiles behind everything else, and moves like everything else ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (2 edits merged)
Please save this source code
User prompt
Make the background repeat
User prompt
Make the background slide southwest when the arrow is facing northeast, and make the background slide northwest when the arrow is facing southeast. It should slide at the same speed as the rest of the objects.
User prompt
Make the arrow's hitbox smaller
User prompt
Make the obstacle hitbox even smaller
User prompt
Make the hitbox smaller for the obstacles and bonuses
Code edit (1 edits merged)
Please save this source code
User prompt
Make the hitbox even smaller for obstacles
User prompt
Make the hitboxes smaller for the obstacles
User prompt
Alongside the gradual speed increase, Increase the rate at which dollars, obstacles, and bonuses spawn.
User prompt
Randomly spawn an obstacle directly in the path of the arrow
User prompt
Start the arrow two thirds down on the screen and two thirds left on the screen
Code edit (2 edits merged)
Please save this source code
User prompt
Gradually increase movement speed as the stonk market cap increases
Code edit (1 edits merged)
Please save this source code
Code edit (3 edits merged)
Please save this source code
User prompt
Make the camera and game stand still and have the dollars, obstacles, and bonuses move instead of the arrow
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'x')' in or related to this line: 'game.container.x = this.container.x;' Line Number: 170
Code edit (11 edits merged)
Please save this source code
User prompt
When I click on the Tap to Start screen, nothing is happening
User prompt
Please fix the bug: 'window.addEventListener is not a function' in or related to this line: 'window.addEventListener('mousedown', function () {' Line Number: 242
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Arrow = Container.expand(function () { var self = Container.call(this); var arrowGraphics = self.attachAsset('arrow', { anchorX: 0.5, anchorY: 0.5 }); self.direction = "northeast"; // Starting direction self.speed = 10; // Movement speed will be used for object movement self.x = 2048 / 2; // Fixed position in center horizontally self.y = 2732 / 2; // Fixed position in center vertically self.path = []; // Track arrow's path self.update = function () { // Direction changes based on touch state, but arrow doesn't move if (!game.isTouching) { // Not touching - arrow faces northeast self.direction = "northeast"; arrowGraphics.rotation = -Math.PI / 4; // 45 degrees up } else { // Touching - arrow faces southeast self.direction = "southeast"; arrowGraphics.rotation = Math.PI / 4; // 45 degrees down } // Record fixed path for consistency if (game.ticks % 5 === 0) { self.path.push({ x: self.x, y: self.y }); } }; // Direction is now controlled by touch state in update method return self; }); var Bonus = Container.expand(function () { var self = Container.call(this); var bonusGraphics = self.attachAsset('bonus', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.collected = false; self.update = function () { // Bonuses now move towards the arrow (opposite direction) if (game.isTouching) { // Move opposite to southeast direction self.x -= arrow.speed; self.y -= arrow.speed; } else { // Move opposite to northeast direction self.x -= arrow.speed; self.y += arrow.speed; } // Spin the bonus bonusGraphics.rotation += 0.05; }; self.collect = function () { self.collected = true; tween(bonusGraphics, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, easing: tween.easeOut }); }; return self; }); var DollarBill = Container.expand(function (direction) { var self = Container.call(this); var color = direction === "northeast" ? 0x00FF00 : 0xFF0000; var dollarGraphics = self.attachAsset('dollar', { anchorX: 0.5, anchorY: 0.5, tint: color }); //dollarGraphics.rotation = Math.random() * Math.PI * 2; // Random rotation dollarGraphics.scale.set(0.8, 0.5); // Make it more bill-shaped self.speed = 10; // Movement speed self.direction = direction; // Store direction for movement self.update = function () { // Move in the opposite direction of what the arrow would move if (self.direction === "northeast") { self.x -= self.speed; self.y += self.speed; } else { self.x -= self.speed; self.y -= self.speed; } }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -10; self.update = function () { // Obstacles now move towards the arrow (opposite direction) if (game.isTouching) { // Move opposite to southeast direction self.x -= arrow.speed; self.y -= arrow.speed; } else { // Move opposite to northeast direction self.x -= arrow.speed; self.y += arrow.speed; } }; return self; }); var StonksText = Container.expand(function (message, color) { var self = Container.call(this); var text = new Text2(message || "STONKS!", { size: 100, fill: color || "#00FF00" }); text.anchor.set(0.5, 0.5); self.addChild(text); self.animate = function () { self.alpha = 1; tween(self, { alpha: 0, y: self.y - 200 }, { duration: 1500, easing: tween.easeOut }); tween(self.scale, { x: 2, y: 2 }, { duration: 1500, easing: tween.easeOut }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0066ff }); /**** * Game Code ****/ // Track if the screen is being touched // Game variables game.isTouching = false; var gameStarted = false; // Track if the game has been started by the first touch // Camera functionality removed as the arrow now stays stationary // and other objects move around it var camera = { update: function update() {} // Empty function to prevent errors }; var arrow; var obstacles = []; var bonuses = []; var stonksTexts = []; var dollarBills = []; var lastObstacleTime = 0; var lastBonusTime = 0; var lastDollarTime = 0; var marketCap = 0; var gameActive = true; // Create background var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, width: 10000, height: 10000 }); game.addChild(background); // Create GUI elements var marketCapText = new Text2("Stonk Market Cap: $0.00", { size: 60, fill: 0xFFFFFF }); marketCapText.anchor.set(0.5, 0); LK.gui.top.addChild(marketCapText); marketCapText.visible = false; // Hide initially // Create startup logo var logoText = new Text2("Stonks Go Up", { size: 150, fill: 0x00FF00 }); logoText.anchor.set(0.5, 0.5); logoText.x = 2048 / 2; logoText.y = 2732 / 2; game.addChild(logoText); // Add tap to start instruction var startInstructionText = new Text2("Tap to Start", { size: 80, fill: 0xFFFFFF }); startInstructionText.anchor.set(0.5, 0.5); startInstructionText.x = 2048 / 2; startInstructionText.y = 2732 / 2 + 200; game.addChild(startInstructionText); // Make the text pulse tween(startInstructionText.scale, { x: 1.1, y: 1.1 }, { duration: 800, easing: tween.easeInOut, loop: -1, yoyo: true }); // Create arrow in the center of the screen arrow = new Arrow(); // Arrow position is set in the class constructor game.addChild(arrow); // No camera setup needed since we have a fixed view // Play background music LK.playMusic('bgMusic'); // Handle touch events game.down = function (x, y, obj) { if (!gameStarted) { // First touch - start the game gameStarted = true; // Hide the logo and instruction tween(logoText, { alpha: 0 }, { duration: 500, easing: tween.easeOut, onComplete: function onComplete() { logoText.destroy(); } }); tween(startInstructionText, { alpha: 0 }, { duration: 500, easing: tween.easeOut, onComplete: function onComplete() { startInstructionText.destroy(); } }); // Show the market cap text marketCapText.visible = true; // Set touch state game.isTouching = true; } else if (gameActive) { game.isTouching = true; } }; game.up = function (x, y, obj) { if (gameActive) { game.isTouching = false; } }; // Generate obstacles function createObstacle() { var obstacle = new Obstacle(); // Since arrow is fixed in center, use fixed screen coordinates var screenWidth = 2048; var screenHeight = 2732; // Spawn obstacles at the upper-right corner of visible screen var spawnRegion = Math.random(); if (spawnRegion < 0.7) { // Spawn to the right obstacle.x = screenWidth + Math.random() * 200; // Just off-screen to the right obstacle.y = screenHeight / 2 - Math.random() * 500; // Spread around middle height } else { // Spawn above obstacle.x = screenWidth / 2 + Math.random() * 500; // Spread to the right of center obstacle.y = -200 - Math.random() * 200; // Just above the visible screen } obstacles.push(obstacle); game.addChild(obstacle); } // Generate bonuses function createBonus() { var bonus = new Bonus(); // Since arrow is fixed in center, use fixed screen coordinates var screenWidth = 2048; var screenHeight = 2732; // Spawn bonuses at the upper-right corner of visible screen var spawnRegion = Math.random(); if (spawnRegion < 0.6) { // Spawn to the right bonus.x = screenWidth + Math.random() * 300; // Just off-screen to the right bonus.y = screenHeight / 2 - Math.random() * 600; // Spread around middle height } else { // Spawn above bonus.x = screenWidth / 2 + Math.random() * 600; // Spread to the right of center bonus.y = -200 - Math.random() * 300; // Just above the visible screen } bonuses.push(bonus); game.addChild(bonus); } // Create dollar bill in appropriate direction function createDollarBill() { if (!arrow || !gameActive) { return; } var dollarBill = new DollarBill(arrow.direction); // Position the dollar bill in front of the arrow based on direction // Since the arrow is stationary, we position relative to the center var offsetDistance = 100; if (arrow.direction === "northeast") { dollarBill.x = arrow.x + offsetDistance; dollarBill.y = arrow.y - offsetDistance; dollarBill.rotation = -Math.PI / 4; // 45 degrees up } else { dollarBill.x = arrow.x + offsetDistance; dollarBill.y = arrow.y + offsetDistance; dollarBill.rotation = Math.PI / 4; // 45 degrees down } dollarBills.push(dollarBill); game.addChild(dollarBill); } // Create stonks text popup function createStonksText(isPositive, x, y) { var message = isPositive ? "STONKS!" : "NOT STONKS!"; var color = isPositive ? "#00FF00" : "#FF0000"; var stonksText = new StonksText(message, color); stonksText.x = x; stonksText.y = y; stonksText.animate(); stonksTexts.push(stonksText); game.addChild(stonksText); } // Game update loop game.update = function () { if (!gameStarted || !gameActive) { return; } // No camera update needed with stationary arrow // Create obstacles at regular intervals lastObstacleTime = lastObstacleTime + 1; if (lastObstacleTime > 60) { createObstacle(); lastObstacleTime = 0; } // Create bonuses less frequently lastBonusTime = lastBonusTime + 1; if (lastBonusTime > 180) { createBonus(); lastBonusTime = 0; } // Create dollar bills every 0.5 seconds (30 ticks) lastDollarTime = lastDollarTime + 1; if (lastDollarTime > 30) { createDollarBill(); lastDollarTime = 0; } // Update marketCap - increase when going northeast, decrease when going southeast if (arrow.direction === "northeast") { marketCap += 1; } else if (arrow.direction === "southeast") { marketCap -= 1; } // Check if market cap has reached game-ending threshold of -10 if (marketCap <= -10 && gameActive) { // Game over gameActive = false; createStonksText(false, arrow.x, arrow.y); LK.getSound('crash').play(); // Flash screen red LK.effects.flashScreen(0xFF0000, 1000); // Show game over LK.setTimeout(function () { LK.setScore(marketCap); LK.showGameOver(); }, 1500); } marketCapText.setText("Stonk Market Cap: $" + marketCap + ".00"); // Check if obstacles are completely off-screen for (var i = obstacles.length - 1; i >= 0; i--) { // Remove obstacles that have moved off the left side of the screen if (obstacles[i].x < -200) { obstacles[i].destroy(); obstacles.splice(i, 1); } } // Check for bonuses that are off-screen for (var i = bonuses.length - 1; i >= 0; i--) { if (bonuses[i].x < -200 || bonuses[i].collected) { bonuses[i].destroy(); bonuses.splice(i, 1); } } // Remove faded stonks texts for (var i = stonksTexts.length - 1; i >= 0; i--) { if (stonksTexts[i].alpha <= 0) { stonksTexts[i].destroy(); stonksTexts.splice(i, 1); } } // Clean up dollar bills that are off-screen for (var i = dollarBills.length - 1; i >= 0; i--) { if (dollarBills[i].x < -200) { dollarBills[i].destroy(); dollarBills.splice(i, 1); } } // Check for collisions with obstacles for (var i = 0; i < obstacles.length; i++) { if (arrow.intersects(obstacles[i])) { // Game over gameActive = false; createStonksText(false, arrow.x, arrow.y); LK.getSound('crash').play(); // Flash screen red LK.effects.flashScreen(0xFF0000, 1000); // Show game over LK.setTimeout(function () { LK.setScore(marketCap); LK.showGameOver(); }, 1500); break; } } // Check for collisions with bonuses for (var i = bonuses.length - 1; i >= 0; i--) { if (!bonuses[i].collected && arrow.intersects(bonuses[i])) { // Collect bonus bonuses[i].collect(); LK.getSound('collect').play(); // Add bonus score var bonusValue = Math.floor(Math.random() * 1000) + 500; marketCap += bonusValue; // Show stonks text createStonksText(true, arrow.x, arrow.y); // Flash screen green LK.effects.flashScreen(0x00FF00, 300); } } // Objects don't move, so no need to increase difficulty by changing their speed };
===================================================================
--- original.js
+++ change.js
@@ -13,26 +13,24 @@
anchorX: 0.5,
anchorY: 0.5
});
self.direction = "northeast"; // Starting direction
- self.speed = 10; // Movement speed
+ self.speed = 10; // Movement speed will be used for object movement
+ self.x = 2048 / 2; // Fixed position in center horizontally
+ self.y = 2732 / 2; // Fixed position in center vertically
self.path = []; // Track arrow's path
self.update = function () {
- // Move based on current touch state
+ // Direction changes based on touch state, but arrow doesn't move
if (!game.isTouching) {
- // Not touching - go northeast
+ // Not touching - arrow faces northeast
self.direction = "northeast";
- self.x += self.speed;
- self.y -= self.speed;
arrowGraphics.rotation = -Math.PI / 4; // 45 degrees up
} else {
- // Touching - go southeast
+ // Touching - arrow faces southeast
self.direction = "southeast";
- self.x += self.speed;
- self.y += self.speed;
arrowGraphics.rotation = Math.PI / 4; // 45 degrees down
}
- // Record path for replay at game end
+ // Record fixed path for consistency
if (game.ticks % 5 === 0) {
self.path.push({
x: self.x,
y: self.y
@@ -50,10 +48,20 @@
});
self.speed = -8;
self.collected = false;
self.update = function () {
- // Bonuses are stationary, only rotate
- //bonusGraphics.rotation += 0.05;
+ // Bonuses now move towards the arrow (opposite direction)
+ if (game.isTouching) {
+ // Move opposite to southeast direction
+ self.x -= arrow.speed;
+ self.y -= arrow.speed;
+ } else {
+ // Move opposite to northeast direction
+ self.x -= arrow.speed;
+ self.y += arrow.speed;
+ }
+ // Spin the bonus
+ bonusGraphics.rotation += 0.05;
};
self.collect = function () {
self.collected = true;
tween(bonusGraphics, {
@@ -76,8 +84,20 @@
tint: color
});
//dollarGraphics.rotation = Math.random() * Math.PI * 2; // Random rotation
dollarGraphics.scale.set(0.8, 0.5); // Make it more bill-shaped
+ self.speed = 10; // Movement speed
+ self.direction = direction; // Store direction for movement
+ self.update = function () {
+ // Move in the opposite direction of what the arrow would move
+ if (self.direction === "northeast") {
+ self.x -= self.speed;
+ self.y += self.speed;
+ } else {
+ self.x -= self.speed;
+ self.y -= self.speed;
+ }
+ };
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
@@ -86,9 +106,18 @@
anchorY: 0.5
});
self.speed = -10;
self.update = function () {
- // Obstacles are stationary
+ // Obstacles now move towards the arrow (opposite direction)
+ if (game.isTouching) {
+ // Move opposite to southeast direction
+ self.x -= arrow.speed;
+ self.y -= arrow.speed;
+ } else {
+ // Move opposite to northeast direction
+ self.x -= arrow.speed;
+ self.y += arrow.speed;
+ }
};
return self;
});
var StonksText = Container.expand(function (message, color) {
@@ -132,36 +161,13 @@
// Track if the screen is being touched
// Game variables
game.isTouching = false;
var gameStarted = false; // Track if the game has been started by the first touch
-var Camera = function Camera() {
- this.target = null;
- this.container = null;
- this.offsetX = 0;
- this.offsetY = 0;
- this.init = function (container) {
- this.container = container;
- };
- this.setTarget = function (target) {
- this.target = target;
- };
- this.setOffset = function (x, y) {
- this.offsetX = x;
- this.offsetY = y;
- };
- this.update = function () {
- if (!this.target || !this.container) {
- return;
- }
- // Move the container in the opposite direction of target
- this.container.x = this.offsetX - this.target.x;
- this.container.y = this.offsetY - this.target.y;
- // Set position directly on game to simulate camera movement
- game.x = this.container.x;
- game.y = this.container.y;
- };
+// Camera functionality removed as the arrow now stays stationary
+// and other objects move around it
+var camera = {
+ update: function update() {} // Empty function to prevent errors
};
-var camera = new Camera();
var arrow;
var obstacles = [];
var bonuses = [];
var stonksTexts = [];
@@ -216,17 +222,13 @@
easing: tween.easeInOut,
loop: -1,
yoyo: true
});
-// Create arrow
+// Create arrow in the center of the screen
arrow = new Arrow();
-arrow.x = 300;
-arrow.y = 2732 / 2;
+// Arrow position is set in the class constructor
game.addChild(arrow);
-// Setup camera to follow arrow
-camera.init(game);
-camera.setTarget(arrow);
-camera.setOffset(2048 / 2, 2732 / 2); // Center the camera on the arrow
+// No camera setup needed since we have a fixed view
// Play background music
LK.playMusic('bgMusic');
// Handle touch events
game.down = function (x, y, obj) {
@@ -267,59 +269,61 @@
};
// Generate obstacles
function createObstacle() {
var obstacle = new Obstacle();
- // Get visible screen bounds relative to arrow
- var screenRight = arrow.x + 1024; // Half screen width
- var screenTop = arrow.y - 1366; // Half screen height
- // Spawn obstacles just beyond the upper-right corner of visible screen
+ // Since arrow is fixed in center, use fixed screen coordinates
+ var screenWidth = 2048;
+ var screenHeight = 2732;
+ // Spawn obstacles at the upper-right corner of visible screen
var spawnRegion = Math.random();
if (spawnRegion < 0.7) {
// Spawn to the right
- obstacle.x = screenRight + Math.random() * 200; // Just off-screen to the right
- obstacle.y = arrow.y - Math.random() * 200; // Spread around arrow's height
+ obstacle.x = screenWidth + Math.random() * 200; // Just off-screen to the right
+ obstacle.y = screenHeight / 2 - Math.random() * 500; // Spread around middle height
} else {
// Spawn above
- obstacle.x = arrow.x + Math.random() * 200; // Spread to the right of arrow
- obstacle.y = screenTop - Math.random() * 200; // Just above the visible screen
+ obstacle.x = screenWidth / 2 + Math.random() * 500; // Spread to the right of center
+ obstacle.y = -200 - Math.random() * 200; // Just above the visible screen
}
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Generate bonuses
function createBonus() {
var bonus = new Bonus();
- // Get visible screen bounds relative to arrow
- var screenRight = arrow.x + 1024; // Half screen width
- var screenTop = arrow.y - 1366; // Half screen height
- // Spawn bonuses just beyond the upper-right corner of visible screen
+ // Since arrow is fixed in center, use fixed screen coordinates
+ var screenWidth = 2048;
+ var screenHeight = 2732;
+ // Spawn bonuses at the upper-right corner of visible screen
var spawnRegion = Math.random();
if (spawnRegion < 0.6) {
// Spawn to the right
- bonus.x = screenRight + Math.random() * 500; // Just off-screen to the right
- bonus.y = arrow.y - Math.random() * 700; // Spread around arrow's height
+ bonus.x = screenWidth + Math.random() * 300; // Just off-screen to the right
+ bonus.y = screenHeight / 2 - Math.random() * 600; // Spread around middle height
} else {
// Spawn above
- bonus.x = arrow.x + Math.random() * 700; // Spread to the right of arrow
- bonus.y = screenTop - Math.random() * 300; // Just above the visible screen
+ bonus.x = screenWidth / 2 + Math.random() * 600; // Spread to the right of center
+ bonus.y = -200 - Math.random() * 300; // Just above the visible screen
}
bonuses.push(bonus);
game.addChild(bonus);
}
-// Create dollar bill behind arrow
+// Create dollar bill in appropriate direction
function createDollarBill() {
if (!arrow || !gameActive) {
return;
}
var dollarBill = new DollarBill(arrow.direction);
- // Position the dollar bill behind the arrow based on direction
+ // Position the dollar bill in front of the arrow based on direction
+ // Since the arrow is stationary, we position relative to the center
+ var offsetDistance = 100;
if (arrow.direction === "northeast") {
- dollarBill.x = arrow.x - 50;
- dollarBill.y = arrow.y + 50;
+ dollarBill.x = arrow.x + offsetDistance;
+ dollarBill.y = arrow.y - offsetDistance;
dollarBill.rotation = -Math.PI / 4; // 45 degrees up
} else {
- dollarBill.x = arrow.x - 50;
- dollarBill.y = arrow.y - 50;
+ dollarBill.x = arrow.x + offsetDistance;
+ dollarBill.y = arrow.y + offsetDistance;
dollarBill.rotation = Math.PI / 4; // 45 degrees down
}
dollarBills.push(dollarBill);
game.addChild(dollarBill);
@@ -339,10 +343,9 @@
game.update = function () {
if (!gameStarted || !gameActive) {
return;
}
- // Update the camera to follow the arrow
- camera.update();
+ // No camera update needed with stationary arrow
// Create obstacles at regular intervals
lastObstacleTime = lastObstacleTime + 1;
if (lastObstacleTime > 60) {
createObstacle();
@@ -380,19 +383,19 @@
LK.showGameOver();
}, 1500);
}
marketCapText.setText("Stonk Market Cap: $" + marketCap + ".00");
- // Check if obstacles are completely off-screen relative to arrow position
+ // Check if obstacles are completely off-screen
for (var i = obstacles.length - 1; i >= 0; i--) {
- // Only remove obstacles that are far behind the arrow (to the left)
- if (obstacles[i].x < arrow.x - 1500) {
+ // Remove obstacles that have moved off the left side of the screen
+ if (obstacles[i].x < -200) {
obstacles[i].destroy();
obstacles.splice(i, 1);
}
}
- // Check for bonuses that are far behind the arrow
+ // Check for bonuses that are off-screen
for (var i = bonuses.length - 1; i >= 0; i--) {
- if (bonuses[i].x < arrow.x - 1500 || bonuses[i].collected) {
+ if (bonuses[i].x < -200 || bonuses[i].collected) {
bonuses[i].destroy();
bonuses.splice(i, 1);
}
}
@@ -402,11 +405,11 @@
stonksTexts[i].destroy();
stonksTexts.splice(i, 1);
}
}
- // Clean up dollar bills that are far behind the arrow
+ // Clean up dollar bills that are off-screen
for (var i = dollarBills.length - 1; i >= 0; i--) {
- if (dollarBills[i].x < arrow.x - 1500) {
+ if (dollarBills[i].x < -200) {
dollarBills[i].destroy();
dollarBills.splice(i, 1);
}
}
arrow pointing to the right like on a stock market ticker. No shadows
cartoonish dollar bill. In-Game asset. 2d. High contrast. No shadows
green stock market chart candle. In-Game asset. 2d. High contrast. No shadows
red stock market chart candle. In-Game asset. 2d. High contrast. No shadows
screen-wrappable repeating blue grid on dark background. In-Game asset. 2d. High contrast. No shadows
white full moon. In-Game asset. 2d. High contrast. No shadows