User prompt
Temporarily hard-code the scaleX property to -1 for all enemies regardless of spawn direction. If they all flip correctly, the issue lies with how spawnDirection influences scaleX.
User prompt
if I switch my tab and leave the game unattended, the game keeps creating elements and when I return there's a ton of elements created, lagging the game, which is a bug
User prompt
add this. Consider the possibility that the rendering order or the way graphics are updated might interfere with seeing the flip effect. Ensure that the flipping logic isn't somehow being visually overridden by how and when the game's render cycle updates the enemy graphics.
User prompt
1. Confirm spawnDirection Assignment Ensure that spawnDirection is correctly assigned when each enemy is created. It's crucial that this value accurately reflects the side from which the enemy is spawning at the time of their creation. 2. Verify scaleX Application Double-check that the scaleX property application actually occurs after spawnDirection is determined. The placement of this operation in your code matters. It needs to be set after you're certain of the enemy's spawn direction but before the enemy is rendered or added to the scene.
User prompt
add this. In your Enemy class, when you attach the enemy graphics (the obstacle image), you're already setting scaleX based on spawnDirection. This is correct. For enemies spawning from the left, scaleX is set to -1, which flips the graphic on the x-axis.
User prompt
Double-check that the `scaleX = -1` transformation for flipping the enemy graphic is not being overridden or reset elsewhere in the code after its initial application. This includes looking for any subsequent modifications to `scaleX` or other transformations applied to the enemy object.
User prompt
Ensure that the `spawnDirection` property is correctly set and checked before applying the `scaleX` transformation. This might involve reviewing the logic that sets the `spawnDirection` to confirm it's being assigned correctly before the enemy's graphical properties are initialized.
User prompt
Check if the enemy spawns from the left. , then Apply a scale transformation by setting scaleX to -1 for enemies spawning from the left to flip the graphic on the x-axis.
User prompt
separate the enemies code into 2 parts. one chunk of text for enemies spawning from the left and another for ones spawning from the right.
User prompt
use this method to flip the x axis for enemies coming from the left " newObstacle.scale.x = -1; // Flip the fish on its x-axis"
User prompt
use a different method to flip the x axi for the enemies spawning fro mthe left
User prompt
determine when an enemy is spawning from the left side. This determination is crucial because it's the condition under which you'll apply the flip transformation to the enemy's graphics. When you've identified that an enemy is spawning from the left, you'll apply a transformation to flip the enemy's graphics along the x-axis. This typically involves scaling the graphics by a factor of -1 in the x dimension while leaving the y dimension unchanged.
User prompt
there's a bug where the enemies spawning from the left side dont have their graphic flipped on it's x axis
User prompt
flienemies spawning from the left side should have their graphics flipped on it's x axis
User prompt
When you create or initialize an enemy object and attach its graphical asset, check the `spawnDirection` of the enemy. If the enemy is spawning from the left, set the `flipX` property to `1` (true) to flip the asset along the x-axis. If the enemy is spawning from the right, either do not set `flipX` or set it to `0` (false) to keep the asset unflipped.
User prompt
the enemies spawning from the left side should have their graphic flipped on it's x axis
User prompt
flip the graphic asset on it's x axis for enemies spawning from the left side
User prompt
add a background to the game that stretches across the entire screen
Code edit (1 edits merged)
Please save this source code
User prompt
move the score in the center of the screen and add a black outline to it with a value of 15
Code edit (1 edits merged)
Please save this source code
User prompt
move the enmy acceleration from the enemy into the global game variables with the rest
Code edit (1 edits merged)
Please save this source code
User prompt
disable the player's input while it's traveling. the player can only tap to change it's direction if the player is rested on an edge
Code edit (3 edits merged)
Please save this source code
/****
* 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);
var enemyGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.acceleration = 0;
self.move = function () {
self.acceleration += 0.5;
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
****/
// 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 = 15; // 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();
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 - 800) + 400; // 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 () {
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;
});
});