/****
* 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_migrated = function () {
self.speed *= 1.01; // Increase speed by 1% each frame
self.y += self.speed;
flame._move_migrated();
};
});
// 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_migrated = function () {
self.speed *= 1.01; // Increase speed by 1% each frame
self.x += self.speed * self.direction;
rotor1._move_migrated();
rotor2._move_migrated();
};
});
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_migrated = 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 + Math.random() * 3;
self.direction = Math.random() > 0.5 ? 1 : -1;
self._move_migrated = 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_migrated = 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
// Play DeductMove sound when player reaches its destination
LK.getSound('DeductMove').play();
} 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) {
self.readyForNewCommand = true;
// Decrement score after movement stops
LK.setScore(LK.getScore() - 1);
scoreTxt.setText(LK.getScore().toString());
if (LK.getScore() <= 0) {
LK.showGameOver();
}
if (LK.getScore() === 1) {
var warningAsset = foregroundContainer.addChild(LK.getAsset('Warning', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
// Center of the screen for 2048 width
y: 150 // Adjusted to be visually above the score text
}));
foregroundContainer.addChild(warningAsset);
var blinkCount = 0;
var blinkInterval = LK.setInterval(function () {
warningAsset.alpha = warningAsset.alpha === 1 ? 0 : 1;
blinkCount++;
if (blinkCount >= 6) {
// 3 times visible and 3 times invisible
LK.clearInterval(blinkInterval);
warningAsset.destroy();
}
}, 300);
// Play NoMoves sound when warning sign for 1 move remaining is shown
LK.getSound('NoMoves').play();
}
// Display deduct asset
var deductAsset = game.addChild(LK.getAsset('deduct', {
anchorX: 0.5,
// Relative to the center of the game stage, not the character
anchorY: 0.5,
// Relative to the center of the game stage, not the character
x: self.x + 100,
// Position relative to the character's current x position
y: self.y - 200 // Position 100 pixels higher relative to the character's current y position
}));
LK.setTimeout(function () {
deductAsset.destroy();
}, 500);
}
}
// 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_migrated = 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;
});
/****
* Initialize Game
****/
var game = new LK.Game();
/****
* Game Code
****/
// Play looping background music
LK.playMusic('backgroundMusic', {
loop: true
});
// Set the initial score to 3 at the start of the game
var warningDisplayed = false;
var warningBlinkCount = 0;
var foodCollected = 0;
LK.setScore(3);
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());
// Play the Destroy sound
LK.getSound('Destroy').play();
// 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...
});
// Moved blocker spawn logic to a more appropriate location to ensure correct flag handling
var backgroundContainer = game.addChild(new BackgroundContainer());
var midgroundContainer = game.addChild(new MidgroundContainer());
var foregroundContainer = game.addChild(new ForegroundContainer());
var whiteBackground = backgroundContainer.addChild(LK.getAsset('whiteBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732,
alpha: 1
}));
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('3', {
size: 200,
fill: '#ffffff',
stroke: '#000000',
strokeThickness: 5
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.x = game.width / 2; // Align score text X position with the center of the screen
scoreTxt.y += 50; // Move score text 100 pixels lower
midgroundContainer.addChild(scoreTxt);
// Touch down event to set player's destination
game.on('down', function (x, y, obj) {
var touchPosition = game.toLocal(obj.global);
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
// Score decrement and game over check are now moved to be processed after character stops moving
}
});
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_migrated();
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_migrated();
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) {
// Adjust the alpha of the white background based on the score to make it fully transparent after 50 points
// Adjust the alpha of the white background directly when a fish is collected
if (player.intersects(food[l]) && player.width > food[l].width) {
whiteBackground.alpha -= 0.03;
if (whiteBackground.alpha < 0) {
whiteBackground.alpha = 0;
}
}
player.grow();
var plusAsset = game.addChild(LK.getAsset('plus', {
anchorX: 0.5,
anchorY: 0.5,
x: food[l].x,
y: food[l].y
}));
LK.setTimeout(function () {
plusAsset.destroy();
}, 200);
food[l].destroy();
food.splice(l, 1);
foodCollected++;
// Play the Eat sound
LK.getSound('Eat').play();
foodCollected++;
// Increase score
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
// Spawn a new enemy for each score increment
newEnemy = new EnemyFish();
LK.getSound('Drone').play(); // Play Drone sound when a drone is created
// 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_migrated();
if (blockers[m].y > game.height) {
blockers[m].destroy();
blockers.splice(m, 1);
}
}
// Move player
player._move_migrated();
// Spawn enemies and food
// This condition has been removed to prevent spawning blockers based on score
if (LK.ticks % 60 === 0) {
var newFood = new FoodFish();
newFood.x = newFood.direction > 0 ? 0 : game.width;
newFood.y = 300 + Math.random() * (game.height - 400);
food.push(newFood);
midgroundContainer.addChild(newFood);
}
if (foodCollected % 5 === 0 && foodCollected > 0 && !blockersSpawned) {
foodCollected = 0; // Reset fish collection counter after spawning a blocker
blockersSpawned = true; // Blocker has been spawned, prevent more until reset
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,
y: 50
});
game.addChild(incomingWarning);
var blinkInterval = LK.setInterval(function () {
incomingWarning.alpha = incomingWarning.alpha === 1 ? 0 : 1;
}, 200);
LK.setTimeout(function () {
LK.clearInterval(blinkInterval);
incomingWarning.destroy();
// Play the Rocket sound after warning sign animation ends
LK.getSound('Rocket').play();
blockersSpawned = false; // Reset the flag to allow new blockers to be generated
}, 2000);
var newBlocker = new Blocker();
LK.getSound('Warning').play(); // Play Warning sound as soon as the rocket is created
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.