Code edit (1 edits merged)
Please save this source code
User prompt
add a black outline to the score
Code edit (1 edits merged)
Please save this source code
User prompt
move the score to the center of the screen
User prompt
attach the score to the midgroundcontainer
User prompt
attach the background asset to the background container
User prompt
create a BackgroundContainer, MidgroundContainer and ForegroundContainer in that order
Code edit (1 edits merged)
Please save this source code
User prompt
enemies spawned from the left, should spawn 100 pixels more from the left, and the ones spawning from the right, should spawn 100 pixels more to the right
User prompt
how would I make the enemies spawning from the left have their graphic flipped on it's x axis? give me a step by step solution
User prompt
rotate enemies spawning from left by 180 degress
User prompt
optimize the code for the enemies spawn direction. separate them into 2 categories based on their direction
User prompt
Instead of relying solely on the spawnDirection at the moment of enemy creation, consider using a global variable or a property within your game's state management that tracks the last spawn direction. Update this tracker each time an enemy is spawned, and use it to set the scaleX for flipping graphics correctly.
User prompt
Create a dedicated method within the Enemy class for flipping the graphic. Call this method right after the instantiation of an enemy, based on its spawnDirection. This method can directly manipulate the scaleX property of the enemy's graphics.
User prompt
After the creation of an enemy instance, instead of setting the scaleX property inside the Enemy class constructor, adjust the scaleX immediately after each enemy is instantiated and before it is added to the game scene. This separation can help ensure that the correct scaleX value is applied based on the spawn direction.
User prompt
Since hardcoding scaleX to -1 worked for flipping, right within the spawnEnemy function or immediately after an enemy is instantiated based on the spawnDirection, forcibly set scaleX to 1 for enemies that are supposed to spawn from the right.
User prompt
add this. Check all points in your code where Enemy instances are created, especially within the spawnEnemy function. Ensure that the spawnDirection is being accurately passed and used at these moments.
User prompt
After an enemy is created and added to the game, immediately update its scaleX property based on its spawnDirection. This step ensures that even if there was a failure in the initial setup, the correct scale is enforced immediately afterward.
User prompt
If spawnDirection is being correctly set to either 'left' or 'right' but the dynamic application of scaleX isn't working as intended, hardcode the scaleX assignment within the enemy creation logic itself, but this time do it conditionally right where you're handling enemy spawning.
User prompt
In the instantiation of the Enemy class, where enemyGraphics is attached, ensure the scaleX value is determined at the moment of instantiation, using the current value of spawnDirection.
User prompt
In the instantiation of the Enemy class, where enemyGraphics is attached, ensure the scaleX value is determined at the moment of instantiation, using the current value of spawnDirection. If spawnDirection is being correctly set to either 'left' or 'right' but the dynamic application of scaleX isn't working as intended, hardcode the scaleX assignment within the enemy creation logic itself, but this time do it conditionally right where you're handling enemy spawning. After an enemy is created and added to the game, immediately update its scaleX property based on its spawnDirection. This step ensures that even if there was a failure in the initial setup, the correct scale is enforced immediately afterward. Check all points in your code where Enemy instances are created, especially within the spawnEnemy function. Ensure that the spawnDirection is being accurately passed and used at these moments. Since hardcoding scaleX to -1 worked for flipping, right within the spawnEnemy function or immediately after an enemy is instantiated based on the spawnDirection, forcibly set scaleX to 1 for enemies that are supposed to spawn from the right.
User prompt
When creating an Enemy instance, check the spawnDirection. If the enemy spawns from the left, set scaleX to -1 to flip the graphic. If the enemy spawns from the right, ensure scaleX is set to 1 to keep the graphic unflipped. This differentiation ensures that only left-spawning enemies are mirrored, while right-spawning enemies retain their original orientation.
User prompt
When creating an Enemy instance, check the spawnDirection. If the enemy spawns from the left, set scaleX to -1 to flip the graphic. If the enemy spawns from the right, ensure scaleX is set to 1 to keep the graphic unflipped. This differentiation ensures that only left-spawning enemies are mirrored, while right-spawning enemies retain their original orientation.
User prompt
Set scaleX Based on spawnDirection: Since the flipping mechanism worked when hardcoded for left-spawning enemies, you now need to conditionally set scaleX based on the spawnDirection: If spawnDirection is 'left', scaleX should be -1. If spawnDirection is 'right', scaleX should be 1.
User prompt
so flipping works. now hardcode the same thing but for enemies on the right, which should have a +1 to their scaleX
/****
* Classes
****/
// Coin class
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.move = function () {
if (self.spawnDirection === 'right') {
self.x -= coinSpeed;
} else {
self.x += coinSpeed;
}
// Destroy coin when it moves off screen
if (self.x < -100 || self.x > 2048 + 100) {
self.destroy();
}
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Determine scaleX based on spawnDirection and attach enemy graphics with correct scaleX
var scaleX = self.spawnDirection === 'right' ? 1 : -1;
var enemyGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: scaleX
});
self.acceleration = 0;
self.move = function () {
self.acceleration += 0.2;
if (self.spawnDirection === 'right') {
self.x -= enemySpeed + self.acceleration;
} else {
self.x += enemySpeed + self.acceleration;
}
// Destroy enemy when it moves off screen and remove it from the enemies array
if (self.x < -100 || self.x > 2048 + 100) {
self.destroy();
var index = enemies.indexOf(self);
if (index > -1) {
enemies.splice(index, 1);
}
// Spawn a new enemy if the current number of enemies is less than the maximum number of enemies
if (enemies.length < maxEnemies) {
spawnEnemy();
}
}
};
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = obstacleSpeed;
self.move = function () {
self.x += self.speed;
// Destroy obstacle when it moves off screen
if (self.x < -100) {
self.destroy();
}
};
});
// Assets will be automatically generated based on usage in the code.
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.gravity = -1; // Start with gravity pulling upwards
self.flipGravity = function () {
self.gravity *= -1;
};
self.touchingEdge = false;
self.update = function () {
self.y += playerSpeed * self.gravity;
// Prevent player from going out of bounds
if (self.y - playerGraphics.height / 2 <= 0) {
self.y = playerGraphics.height / 2;
if (self.gravity == -1 && !self.touchingEdge) {
self.touchingEdge = true;
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore().toString());
maxEnemies = Math.floor(LK.getScore() / 10);
if (enemies.length < maxEnemies) {
spawnEnemy();
}
}
} else if (self.y + playerGraphics.height / 2 >= 2732) {
self.y = 2732 - playerGraphics.height / 2;
if (self.gravity == 1 && !self.touchingEdge) {
self.touchingEdge = true;
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore().toString());
maxEnemies = Math.floor(LK.getScore() / 10);
if (enemies.length < maxEnemies) {
spawnEnemy();
}
}
} else {
self.touchingEdge = false;
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
var background = game.addChild(LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
// Game Variables
// Assets will be automatically generated based on usage in the code.
var playerGraphics;
var player;
var playerSpeed = 80;
var score = 0;
var scoreTxt;
var obstacles = []; // Array to keep track of obstacles
var obstacleSpeed = -10;
var coins = []; // Initialize coins array
var coinSpeed = 10;
var coinSpawnDirection = 'right'; // Initialize coin spawn direction
var enemies = []; // Initialize enemies array
var maxEnemies = 0; // Initialize maximum number of enemies that can be spawned
var enemySpawnDirection = 'left'; // Initialize enemy spawn direction
var enemySpeed = 5; // Define enemy speed
// Initialize Player
player = game.addChild(new Player());
player.x = 1024; // Center horizontally
player.y = 1366; // Center vertically
// Initialize Score Display
scoreTxt = new Text2(score.toString(), {
size: 150,
fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create obstacles and coins at intervals
function spawnEnemy() {
// Check if the score is less than 10
if (LK.getScore() < 10) {
return;
}
// Determine the number of enemies to spawn based on the player's score
var numEnemies = Math.floor(LK.getScore() / 10);
// Determine the spawn side based on the last spawn side
var spawnSide = enemySpawnDirection;
// Alternate the spawn side
enemySpawnDirection = enemySpawnDirection === 'right' ? 'left' : 'right';
// Spawn enemies if the current number of enemies is less than the maximum number of enemies
if (enemies.length < numEnemies) {
var enemy = new Enemy();
// Determine the spawn side based on the last spawn side
var spawnSide = enemySpawnDirection === 'right' ? 'left' : 'right';
enemy.spawnDirection = spawnSide;
enemy.x = spawnSide === 'right' ? 2048 : 0;
enemy.y = Math.random() * (2732 - 800) + 400; // Random height with 200 pixel padding at the top and bottom
enemy.acceleration = 0;
enemies.push(enemy);
game.addChild(enemy);
}
}
var enemyTimer = LK.setInterval(spawnEnemy, 1000); // Create an enemy every 1 second
var coinTimer = LK.setInterval(function () {
// Create a coin
var coin = new Coin();
coin.spawnDirection = coinSpawnDirection;
// Spawn coin from right or left alternately
if (coinSpawnDirection === 'right') {
coin.x = 2048;
} else {
coin.x = 0;
}
// coin speed is set in the move function of the Coin class
coin.y = Math.random() * (2732 - 600) + 300; // Random height with 200 pixel padding at the top and bottom
coins.push(coin);
game.addChild(coin);
// Switch coin spawn direction
coinSpawnDirection = coinSpawnDirection === 'right' ? 'left' : 'right';
}, 200); // Create a coin every 200 milliseconds
// Listen for touch events to flip gravity
game.on('down', function () {
if (player.touchingEdge) {
player.flipGravity();
}
});
// Update game state on each tick
LK.on('tick', function () {
player.update();
obstacles.forEach(function (obstacle) {
obstacle.move();
// Check for collision with player
if (player.intersects(obstacle)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
});
// Update coins and remove destroyed coins
coins.forEach(function (coin, index) {
coin.move();
// Check for collision with player
if (player.intersects(coin)) {
// Increase score by 1
LK.setScore(LK.getScore() + 1);
// Update score text
scoreTxt.setText(LK.getScore().toString());
// Destroy the coin
coin.destroy();
// Remove the coin from the coins array
coins.splice(index, 1);
}
});
// Update enemies and remove destroyed enemies
enemies.forEach(function (enemy, index) {
enemy.move();
// Check for collision with player
if (player.intersects(enemy)) {
// Flash screen red for 1 second (1000ms) to show we are dead.
LK.effects.flashScreen(0xff0000, 1000);
// Show game over. The game will be automatically paused while game over is showing.
LK.showGameOver();
// Destroy the enemy
enemy.destroy();
// Remove the enemy from the enemies array
enemies.splice(index, 1);
// Spawn a new enemy if the current number of enemies is less than the maximum number of enemies
if (enemies.length < maxEnemies) {
spawnEnemy();
}
}
});
// Remove obstacles that have been destroyed
obstacles = obstacles.filter(function (obstacle) {
return !obstacle._destroyed;
});
});