User prompt
you're generating way too many blockers. only a single blocker can be generated at once
User prompt
blockers dont work correctly. way too many blockers get generated, instead only a single blocker must be generated per 5 fish collected
User prompt
blockers dont work correctly. a blocker does get generated after the first 5 points are collected, but then doesnt work again after the next 5 are collected
User prompt
blockers dont work correctly. a blocker does get generated after the first 5 points are collected, but then doesnt work again after the next 5 are collected
User prompt
the game generates way too many blockers, only a single blocker can be generated per 5 points collected
User prompt
we need to change how obstacles get generated. a bocker has to be generated once every 5 collected fish, as to maintain the one obstacles generated once every 5 points rule
User prompt
we need to change how obstacles get generated. currently, they get generated when the score reaches 5,10,15 or any multiple of 5 values, which no longer works for the game. a bocker instead has to be generated once every 5 collected fish, as to maintain the one obstacles generated once every 5 points rule
User prompt
when the score reaches 0 it's game over
User prompt
now deduct 1 point from the score, every time the player taps on the screen to move its character
User prompt
fix the score to display the actual score of 3. right now it's displayed as 0 even though it's set at 3
User prompt
✅ Remove redundant score text initialization to fix the overlapping score texts issue.
User prompt
optimize the score as there's currently 2 overlapping score texts
User prompt
there's a bug with the score, where there's 2 overlapping texts. right now there's a 3 that never updates, and the score that increments. there needs to be a single value, that starts at 3
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'setText')' in or related to this line: 'scoreTxt.setText(LK.getScore().toString());' Line Number: 196
User prompt
apply the above fixes
User prompt
check the code that relates to the scoring and optimize it, as to ensure it doesn't have multiple irrelevant mentions and to ensure it starts from 3 instead of 0
User prompt
apply the above fixes to make the score start at 3
User prompt
fix it
User prompt
fix it
User prompt
do it
User prompt
fix it
User prompt
fix it so it starts from 3
User prompt
the score has to start from 3 instead of 0
User prompt
start the score with 3 points
User prompt
when 2 enemies collide, increment the score by 2
/****
* Classes
****/
var BackgroundContainer = Container.expand(function () {
var self = Container.call(this);
return Container.call(this);
});
var Blocker = Container.expand(function () {
var self = Container.call(this);
var blockerGraphics = self.attachAsset('blocker', {
anchorX: 0.5,
anchorY: 0.5
});
var flame = self.addChild(new Flame());
flame.x = 0;
flame.y = -150;
self.speed = 2;
self.spawnOffset = 0;
self.move = function () {
self.speed *= 1.01; // Increase speed by 1% each frame
self.y += self.speed;
flame.move();
};
});
// Enemy fish class
var EnemyFish = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyFish', {
anchorX: 0.5,
anchorY: 0.5,
flipX: self.direction > 0 ? 0 : 1
});
var rotor1 = self.addChild(new Rotor());
rotor1.x = -90;
rotor1.y = -70;
var rotor2 = self.addChild(new Rotor());
rotor2.x = 90;
rotor2.y = -70;
self.speed = 3;
self.direction = Math.random() > 0.5 ? 1 : -1;
self.spawnOffset = self.direction > 0 ? -100 : 100;
self.move = function () {
self.speed *= 1.01; // Increase speed by 1% each frame
self.x += self.speed * self.direction;
rotor1.move();
rotor2.move();
};
});
var Flame = Container.expand(function () {
var self = Container.call(this);
var flameGraphics = self.attachAsset('flame', {
anchorX: 0.5,
anchorY: 0.5
});
self.spawnOffset = 0;
self.blinkTimer = 0;
self.move = function () {
// Increment blink timer
// Increment blink timer
self.blinkTimer += 16.6667; // Assuming 60FPS, each tick is approximately 16.6667ms
// Toggle visibility based on blink timer
if (self.blinkTimer >= 60) {
self.alpha = self.alpha === 1 ? 0 : 1;
self.blinkTimer = 0; // Reset timer
}
};
});
// Food fish class
var FoodFish = Container.expand(function () {
var self = Container.call(this);
var foodGraphics = self.attachAsset('foodFish', {
anchorX: 0.5,
anchorY: 0.5,
flipX: self.direction > 0 ? 0 : 1
});
self.speed = 2;
self.direction = Math.random() > 0.5 ? 1 : -1;
self.move = function () {
self.x += self.speed * self.direction;
};
});
var ForegroundContainer = Container.expand(function () {
var self = Container.call(this);
return self;
});
var MidgroundContainer = Container.expand(function () {
var self = Container.call(this);
return Container.call(this);
});
// Player fish class
var PlayerFish = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('playerFish', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.destination = null;
self.readyForNewCommand = true; // Player is initially ready for a new command
self.move = function () {
if (self.destination) {
var direction = {
x: self.destination.x - self.x,
y: self.destination.y - self.y
};
var magnitude = Math.sqrt(direction.x * direction.x + direction.y * direction.y);
if (magnitude < self.speed) {
self.x = self.destination.x;
self.y = self.destination.y;
self.destination = null; // Reached destination
self.speed = 0; // Stop the player fish
} else {
direction.x /= magnitude;
direction.y /= magnitude;
self.x += direction.x * self.speed;
self.y += direction.y * self.speed;
self.speed *= 0.98; // Decelerate
}
// Allow new commands when the player fish comes to a full stop
if (self.speed < 0.1) {
self.readyForNewCommand = true;
}
}
// Flip the fish asset based on the direction it's moving
if (self.destination) {
playerGraphics.flipX = self.x < self.destination.x ? 0 : 1;
} else {
playerGraphics.flipX = playerGraphics.flipX;
}
};
self.grow = function () {
self.scaleX *= 1.01;
self.scaleY *= 1.01;
playerGraphics.width *= 1.01;
playerGraphics.height *= 1.01;
self.speed -= 0.1;
};
});
var Rotor = Container.expand(function () {
var self = Container.call(this);
var rotorGraphics = self.attachAsset('rotor', {
anchorX: 0.5,
anchorY: 0.5
});
self.blinkTimer = 0;
self.move = function () {
// Increment blink timer
// Increment blink timer
// Increment blink timer
self.blinkTimer += 16.6667; // Assuming 60FPS, each tick is approximately 16.6667ms
// Toggle visibility based on blink timer
if (self.blinkTimer >= 90) {
self.alpha = self.alpha === 1 ? 0 : 1;
self.blinkTimer = 0; // Reset timer
}
};
return self;
});
// TV class
var TV = Container.expand(function () {
var self = Container.call(this);
var tvGraphics = self.attachAsset('tv', {
anchorX: 0.5,
anchorY: 0.5
});
});
/****
* Initialize Game
****/
var game = new LK.Game();
/****
* Game Code
****/
// Spawn blockers with incoming warning
// Game tick event
LK.on('tick', function () {
// Existing game tick logic...
// Check for enemy collision and destroy both enemies
for (var i = 0; i < enemies.length; i++) {
for (var j = i + 1; j < enemies.length; j++) {
if (enemies[i] && enemies[j] && enemies[i].intersects(enemies[j])) {
// Create individual explosions for each enemy
var explosion1 = LK.getAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
x: enemies[i].x,
y: enemies[i].y
});
var explosion2 = LK.getAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
x: enemies[j].x,
y: enemies[j].y
});
midgroundContainer.addChild(explosion1);
midgroundContainer.addChild(explosion2);
// Set timeouts to destroy explosions
LK.setTimeout(function () {
explosion1.destroy();
}, 200);
LK.setTimeout(function () {
explosion2.destroy();
}, 200);
// Increment score by 2 when two enemies collide
LK.setScore(LK.getScore() + 2);
scoreTxt.setText(LK.getScore().toString());
// Destroy the colliding enemies
enemies[i].destroy();
enemies[j].destroy();
// Remove the destroyed enemies from the array
enemies.splice(j, 1);
enemies.splice(i, 1);
i--;
}
}
}
// Continue with any additional game tick logic...
});
if (LK.getScore() % 5 === 0 && LK.getScore() > 0 && !blockersSpawned) {
blockersSpawned = true;
var incomingWarning = LK.getAsset('incoming', {
anchorX: 0.5,
anchorY: 0,
x: randomX,
// Match the x position of the incoming blocker
y: 50 // Move it higher, closer to the top of the screen
});
foregroundContainer.addChild(incomingWarning);
var blinkInterval = LK.setInterval(function () {
incomingWarning.alpha = incomingWarning.alpha === 1 ? 0 : 1;
}, 100);
LK.setTimeout(function () {
LK.clearInterval(blinkInterval);
incomingWarning.destroy();
}, 300);
var newBlocker = new Blocker();
var safeZone = newBlocker.width / 2 + 300; // Half width of the blocker plus minimum gap
var randomX = Math.random() * (game.width - 2 * safeZone) + safeZone; // Calculate random X within safe zone
newBlocker.x = randomX;
newBlocker.y = -newBlocker.height;
blockers.push(newBlocker);
midgroundContainer.addChild(newBlocker);
}
var backgroundContainer = game.addChild(new BackgroundContainer());
var midgroundContainer = game.addChild(new MidgroundContainer());
var foregroundContainer = game.addChild(new ForegroundContainer());
var newWhiteBackground = backgroundContainer.addChild(LK.getAsset('whiteBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732,
color: 0xffffff
}));
var whiteBackground = backgroundContainer.addChild(LK.getAsset('whiteBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732,
alpha: 0.8
}));
var background = backgroundContainer.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732,
alpha: 0.8
}));
// Initialize player, enemies, and food arrays
// Define assets for the player fish, enemy fish, and food fish
// Initialize score text
var scoreTxt = new Text2('0', {
size: 150,
fill: '#ffffff',
stroke: '#000000',
strokeThickness: 5
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Touch down event to set player's destination
game.on('down', function (obj) {
var touchPosition = obj.event.getLocalPosition(game);
if (player.readyForNewCommand) {
player.destination = {
x: touchPosition.x,
y: touchPosition.y
};
player.speed = 40; // Reset speed
player.readyForNewCommand = false; // Player is not ready for a new command until it reaches its destination
}
});
var player;
var enemies = [];
var food = [];
var blockers = [];
var tv;
var blockersSpawned = false;
var spawnSide = 'right'; // Variable to alternate enemy spawn side
// Create the player fish
player = midgroundContainer.addChild(new PlayerFish());
player.x = game.width / 2;
player.y = game.height / 2;
// Game tick event
LK.on('tick', function () {
// Move enemies and check for off-screen
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].move();
if (enemies[i].x < -enemies[i].width || enemies[i].x > game.width + enemies[i].width) {
enemies[i].destroy();
enemies.splice(i, 1);
}
}
// Move food and check for off-screen
for (var j = food.length - 1; j >= 0; j--) {
food[j].move();
if (food[j].x < -food[j].width) {
food[j].destroy();
food.splice(j, 1);
}
}
// Check for player collision with enemies
for (var k = 0; k < enemies.length; k++) {
if (player.intersects(enemies[k])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
for (var n = 0; n < blockers.length; n++) {
if (player.intersects(blockers[n])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// Check for player collision with food and grow if the food is smaller
var _loop = function _loop() {
if (player.intersects(food[l]) && player.width > food[l].width) {
var fadeOutFood = function fadeOutFood(fish) {
var fadeOutInterval = LK.setInterval(function () {
if (fish.alpha > 0) {
fish.alpha -= 0.3; // Increase the rate of becoming transparent
fish.scaleX *= 1.1; // Grow in size
fish.scaleY *= 1.1; // Grow in size
} else {
LK.clearInterval(fadeOutInterval);
fish.destroy();
}
}, 50); // Reduce the interval time
};
// Adjust the alpha of the white background based on the score to make it fully transparent after 50 points
var currentScore = LK.getScore();
var newAlpha = 1 - currentScore * 0.02; // Each point decreases alpha by 2%
whiteBackground.alpha = newAlpha > 0 ? newAlpha : 0; // Ensure alpha does not go below 0
player.grow();
// Animate food fish before destroying
food[l].scaleX = 2;
food[l].scaleY = 2;
fadeOutFood(food[l]);
food.splice(l, 1);
// Increase score
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
// Spawn a new enemy for each score increment
newEnemy = new EnemyFish();
// Alternate spawn side for each new enemy
if (spawnSide === 'right') {
newEnemy.x = game.width + 100; // Spawn 100 pixels to the right of the screen
spawnSide = 'left';
} else {
newEnemy.x = -100; // Spawn 100 pixels to the left of the screen
spawnSide = 'right';
}
newEnemy.direction = spawnSide === 'right' ? 1 : -1;
newEnemy.y = 200 + Math.random() * (game.height - 400);
enemies.push(newEnemy);
midgroundContainer.addChild(newEnemy);
}
},
newEnemy;
for (var l = 0; l < food.length; l++) {
_loop();
}
for (var m = blockers.length - 1; m >= 0; m--) {
blockers[m].move();
if (blockers[m].y > game.height) {
blockers[m].destroy();
blockers.splice(m, 1);
}
}
// Move player
player.move();
// Spawn enemies and food
if (LK.getScore() % 5 !== 0) {
blockersSpawned = false;
}
if (LK.ticks % 60 === 0) {
var newFood = new FoodFish();
newFood.x = newFood.direction > 0 ? 0 : game.width;
newFood.y = 200 + Math.random() * (game.height - 900);
food.push(newFood);
midgroundContainer.addChild(newFood);
}
if (LK.getScore() % 5 === 0 && LK.getScore() > 0 && !blockersSpawned) {
blockersSpawned = true;
// Calculate random X within safe zone first
var safeZone = 300; // Minimum gap from the edge
var randomX = Math.random() * (game.width - 2 * safeZone) + safeZone;
var incomingWarning = LK.getAsset('incoming', {
anchorX: 0.5,
anchorY: 0,
x: randomX,
// Match the x position of the incoming blocker
y: 50 // Move it higher, closer to the top of the screen
});
game.addChild(incomingWarning);
var blinkInterval = LK.setInterval(function () {
incomingWarning.alpha = incomingWarning.alpha === 1 ? 0 : 1;
}, 200);
LK.setTimeout(function () {
LK.clearInterval(blinkInterval);
incomingWarning.destroy();
}, 2000);
var newBlocker = new Blocker();
newBlocker.x = randomX;
newBlocker.y = -newBlocker.height;
blockers.push(newBlocker);
midgroundContainer.addChild(newBlocker);
}
});
Design a minimalistic, pixelated background for a cyberpunk AI city, focusing on a futuristic yet understated aesthetic to ensure it doesn't overshadow game elements.. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cute red enemy flying drone. angry eyes. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Design a pixel art scene for a game item: a TV broadcasting a news alert about an imminent AI uprising. Include flashing warning signs and depict the newscaster in a state of high alert to convey urgency and tension, ensuring all elements are styled to fit within a pixelated game environment.. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
notepad word document file icon. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
yellow warning sign. flat pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
red flame. flat pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
blue text saying "+1". pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
red danger warning sign. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.