User prompt
add a global boolean "running". default false. Then prevent indicator and graph updates when running is false
Code edit (3 edits merged)
Please save this source code
User prompt
add a console log in indicator's updateYPosition like drawNextSegment
Code edit (3 edits merged)
Please save this source code
User prompt
in drawGraph callback log don't display decimals
User prompt
in drawGraph log don't display decimals
User prompt
same in "Segment drawn from'" log
User prompt
in drawGraph log don't display decimals
Code edit (2 edits merged)
Please save this source code
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'updatePosition')' in this line: 'valueIndicator.updatePosition(100); // Example stock price' Line Number: 120
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in this line: 'var x = valueIndicator.x;' Line Number: 124
User prompt
the 1st graphPoints should be the start coordinates of valueIndicator
User prompt
remove the sample square
User prompt
Now compute the coordinates that of ValueIndicator will reach using stockValuesHistory and create a serie of points to pass to drawGraph
User prompt
modify the recursive `updateWidth` function to include a condition that compares the current time to the `endTime`. If the current time is greater than or equal to the `endTime`, the segment's width should be set to the final `distance` value, and the callback should be called if it is a function. Additionally, the recursive calls to `updateWidth` should be stopped to prevent further unnecessary updates.
User prompt
fix the condition to execute the callback is never met within the `updateWidth`
Code edit (1 edits merged)
Please save this source code
User prompt
add logs to drawGraph
Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'Uncaught ReferenceError: callback is not defined' in this line: 'updateWidth(callback);' Line Number: 201
User prompt
Fix Bug: 'Uncaught ReferenceError: callback is not defined' in this line: 'updateWidth(callback);' Line Number: 201
User prompt
Update drawGraph (and if needed drawSegment) function in order to draw the segments one after the other
Code edit (1 edits merged)
Please save this source code
User prompt
call drawGraph to draw a sample square
User prompt
create a drawGraph(gameRef, points) global function. It takes a list of coordinates (at least 2) and calls drawSegment to draw segments between the points. eg. drawGraph(gameRef, [{x:0,y:0}, {x:100,y:0}, {x:100,y:100}, {x:0,y:100}, {x:0,y:0}]) will draw a square
/****
* Classes
****/
// ValueIndicator class to represent the current value of the stock on the graph
var ValueIndicator = Container.expand(function () {
var self = Container.call(this);
var indicatorGraphics = self.createAsset('valueIndicator', 'Current Stock Value Indicator', 0.5, 0.5);
self.updatePosition = function (price) {
// Position ValueIndicator based on the stock price
self.x = 0; // Start from the left side
self.y = 2732 / 2; // Start from the left side
var targetX = game.width / 2; // Center horizontally
var targetY = game.height / 2; // Center vertically
// Custom tween function to animate the ValueIndicator and update SpecialGraphSegment
var startTime = Date.now();
var duration = 3000; // Duration in milliseconds
var startX = self.x;
var endX = targetX;
var startY = self.y;
var endY = targetY;
var animateX = function animateX() {
var endTime = startTime + duration;
var currentTime = Date.now();
var timeRemaining = endTime - currentTime;
var nextX = startX + (endX - startX) * (1 - timeRemaining / duration);
var nextY = startY + (endY - startY) * (1 - timeRemaining / duration);
self.x = nextX;
if (currentTime < endTime) {
LK.setTimeout(animateX, 16);
} else {
// Removed the call to self.graphLine.updateGraph as it's undefined in this context
}
};
animateX();
// Function to animate the ValueIndicator based on stockValuesHistory
var historyIndex = 0; // Start with the first value in the history
var updateYPosition = function updateYPosition() {
if (historyIndex < stockValuesHistory.length) {
var targetY = game.height / 2 - stockValuesHistory[historyIndex] * 10; // Scale the stock value for display
var startY = self.y;
var duration = 1000; // Duration in milliseconds for Y movement
var startTime = Date.now();
var animateY = function animateY() {
var currentTime = Date.now();
var timeElapsed = currentTime - startTime;
var newY = startY + (targetY - startY) * (timeElapsed / duration);
self.y = newY;
if (timeElapsed < duration) {
LK.setTimeout(animateY, 16);
} else {
self.y = targetY; // Ensure final position is set
}
};
animateY();
historyIndex++;
LK.setTimeout(function () {
updateYPosition();
}, 1000); // Update position every second and add a new segment
}
};
updateYPosition();
};
});
// Player class to represent the player's portfolio
var Player = Container.expand(function () {
var self = Container.call(this);
self.balance = 100; // Start with $100
self.stocks = {}; // Object to hold stocks and quantities
self.buyStock = function (stock, quantity) {
var cost = stock.getPrice() * quantity;
if (self.balance >= cost) {
self.balance -= cost;
if (!self.stocks[stock]) {
self.stocks[stock] = 0;
}
self.stocks[stock] += quantity;
}
};
self.sellStock = function (stock, quantity) {
if (self.stocks[stock] && self.stocks[stock] >= quantity) {
self.balance += stock.getPrice() * quantity;
self.stocks[stock] -= quantity;
if (self.stocks[stock] === 0) {
delete self.stocks[stock];
}
}
};
self.getBalance = function () {
return self.balance;
};
self.getPortfolio = function () {
return self.stocks;
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
// No need to set backgroundColor since we are adding a background asset
});
/****
* Game Code
****/
// Create and add background asset
var background = game.addChild(LK.getAsset('background', 'Game background', 0.5, 0.5));
background.x = 1024; // Center x position
background.y = 2732 - background.height / 2; // Center y position
// Initialize game elements
var player = new Player();
var stocks = [];
// Initialize stock values history with the first value of $10
var stockValuesHistory = [10];
// Add 10 other random stock values
for (var i = 0; i < 10; i++) {
stockValuesHistory.push(Math.floor(Math.random() * 100) + 1);
}
// Draw a sample segment
var x1 = 100;
var y1 = 2732 / 2;
var x2 = 500;
var y2 = 2732 / 2 - stockValuesHistory[0] * 10;
drawSegment(game, x1, y1, x2, y2, 1);
var stockDisplay = []; // Array to hold stock display elements
var balanceText = new Text2('Balance: $' + player.getBalance(), {
size: 50,
fill: "#ffffff"
});
// Create and add ValueIndicator to the game
var valueIndicator = game.addChild(new ValueIndicator());
valueIndicator.updatePosition(100); // Example stock price
balanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(balanceText);
// Update the player's balance display
function updateBalanceDisplay() {
balanceText.setText('Balance: $' + player.getBalance().toFixed(2));
}
// Function to handle buying stocks
function buyStock(stock) {
player.buyStock(stock, 1); // Buy 1 stock for simplicity
updateBalanceDisplay();
}
// Function to handle selling stocks
function sellStock(stock) {
player.sellStock(stock, 1); // Sell 1 stock for simplicity
updateBalanceDisplay();
}
// Main game loop
LK.on('tick', function () {
// Check for game over conditions (e.g., player runs out of money)
if (player.getBalance() <= 0) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
});
function drawSegment(gameRef, x1, y1, x2, y2, delay) {
var segment = gameRef.addChild(LK.getAsset('segment', 'Graph Segment', 0, 0.5));
segment.x = x1;
segment.y = y1;
segment.width = 1;
segment.height = 5;
var deltaX = x2 - x1;
var deltaY = y2 - y1;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
segment.rotation = Math.atan2(deltaY, deltaX);
var startTime = Date.now();
var endTime = startTime + delay * 1000;
var updateWidth = function updateWidth() {
var currentTime = Date.now();
var timeElapsed = currentTime - startTime;
var newWidth = timeElapsed / (delay * 1000) * distance;
if (currentTime < endTime) {
segment.width = newWidth;
LK.setTimeout(updateWidth, 16);
} else {
segment.width = distance;
}
};
updateWidth();
}
function drawGraph(gameRef, points) {
if (points.length < 2) {
return;
} // Need at least two points to draw a segment
for (var i = 0; i < points.length - 1; i++) {
var pointA = points[i];
var pointB = points[i + 1];
drawSegment(gameRef, pointA.x, pointA.y, pointB.x, pointB.y, 0);
}
}
A Technical dark background. Nothing just a gradiant of colors from black to dark blue. Theme : stock market. background
A modern clean empty rectangular button without borders. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
without shadow
a basic empty ui popup with a black background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.