/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 3
});
bossGraphics.tint = 0x8B0000; // Dark red tint for boss
self.health = 20;
self.maxHealth = 20;
self.speed = 1;
self.shootCooldown = 0;
self.specialAttackCooldown = 0;
self.time = 0;
self.phase = 1;
self.update = function () {
self.time++;
// Boss movement - side to side
self.x += Math.sin(self.time * 0.02) * 2;
if (self.x < 100) self.x = 100;
if (self.x > 1948) self.x = 1948;
self.y += self.speed * 0.2;
// Regular shooting
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
if (self.shootCooldown <= 0) {
self.shoot();
self.shootCooldown = 30;
}
// Special attack patterns
if (self.specialAttackCooldown > 0) {
self.specialAttackCooldown--;
}
if (self.specialAttackCooldown <= 0) {
self.specialAttack();
self.specialAttackCooldown = 180; // Every 3 seconds
}
// Change phase based on health
if (self.health <= self.maxHealth * 0.5 && self.phase === 1) {
self.phase = 2;
self.speed = 1.5;
LK.effects.flashObject(self, 0xff6600, 1000);
}
};
self.shoot = function () {
// Triple shot
for (var i = -1; i <= 1; i++) {
var bullet = new EnemyBullet();
bullet.x = self.x + i * 50;
bullet.y = self.y + 90;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
self.specialAttack = function () {
if (self.phase === 1) {
// Spread shot pattern
for (var i = 0; i < 8; i++) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 90;
bullet.speed = 6;
bullet.angle = i * 45 * Math.PI / 180;
bullet.update = function () {
this.x += Math.cos(this.angle) * this.speed;
this.y += Math.sin(this.angle) * this.speed;
};
enemyBullets.push(bullet);
game.addChild(bullet);
}
} else {
// Phase 2: Rapid fire burst
for (var i = 0; i < 12; i++) {
LK.setTimeout(function (delay) {
return function () {
var bullet = new EnemyBullet();
bullet.x = self.x + (Math.random() - 0.5) * 100;
bullet.y = self.y + 90;
bullet.speed = 10;
enemyBullets.push(bullet);
game.addChild(bullet);
};
}(i), i * 50);
}
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xffff00, 200);
if (self.health <= 0) {
// Boss defeated - big score bonus
LK.setScore(LK.getScore() + 500);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('enemyHit').play();
return true; // Signal boss is defeated
}
return false;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2 + Math.random() * 3;
self.shootCooldown = Math.floor(Math.random() * 120) + 60;
self.movePattern = Math.floor(Math.random() * 3);
self.originalX = self.x;
self.time = 0;
self.update = function () {
self.time++;
// Movement patterns
if (self.movePattern === 0) {
// Straight down
self.y += self.speed;
} else if (self.movePattern === 1) {
// Zigzag
self.y += self.speed;
self.x += Math.sin(self.time * 0.1) * 2;
} else {
// Side to side
self.y += self.speed * 0.5;
self.x += Math.cos(self.time * 0.05) * 3;
}
// Keep enemies on screen horizontally
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
// Shooting
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
if (self.shootCooldown <= 0 && self.y > 100 && self.y < 2000) {
self.shoot();
self.shootCooldown = Math.floor(Math.random() * 180) + 120;
}
};
self.shoot = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.maxHealth = 3;
self.shootCooldown = 0;
self.powerLevel = 1;
self.tripleShotActive = false;
self.tripleShotTimer = 0;
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
// Handle triple shot timer
if (self.tripleShotActive && self.tripleShotTimer > 0) {
self.tripleShotTimer--;
if (self.tripleShotTimer <= 0) {
self.tripleShotActive = false;
LK.effects.flashObject(self, 0xffffff, 200);
}
}
// Auto-shoot
if (self.shootCooldown <= 0) {
self.shoot();
self.shootCooldown = 15; // Shoot every 15 frames
}
};
self.shoot = function () {
if (self.tripleShotActive) {
// Triple shot
for (var i = -1; i <= 1; i++) {
var bullet = new PlayerBullet();
bullet.x = self.x + i * 30;
bullet.y = self.y - 60;
playerBullets.push(bullet);
game.addChild(bullet);
}
} else {
// Single shot
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 60;
playerBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
};
self.takeDamage = function () {
self.health--;
LK.getSound('playerHit').play();
LK.effects.flashObject(self, 0xff0000, 500);
if (self.health <= 0) {
LK.showGameOver();
}
};
self.heal = function () {
if (self.health < self.maxHealth) {
self.health++;
}
};
self.activateTripleShot = function () {
self.tripleShotActive = true;
self.tripleShotTimer = 900; // 15 seconds at 60 FPS
LK.effects.flashObject(self, 0xffff00, 500);
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.time = 0;
self.update = function () {
self.time++;
self.y += self.speed;
self.rotation += 0.1;
// Floating effect
powerUpGraphics.y = Math.sin(self.time * 0.2) * 10;
};
return self;
});
var TriplePowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('triplePowerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.time = 0;
self.update = function () {
self.time++;
self.y += self.speed;
self.rotation += 0.1;
// Floating effect
powerUpGraphics.y = Math.sin(self.time * 0.2) * 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var triplePowerUps = [];
var boss = null;
var bossSpawnTimer = 0;
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var difficultyLevel = 1;
var dragNode = null;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 120;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
var healthTxt = new Text2('Health: 3', {
size: 60,
fill: 0x00FF00
});
healthTxt.anchor.set(1, 0);
healthTxt.x = -50;
healthTxt.y = 50;
LK.gui.topRight.addChild(healthTxt);
// Add background covering full screen
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(background);
// Initialize player
player = new Player();
player.x = 1024;
player.y = 2400;
game.addChild(player);
// Game controls
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
// Keep player on screen
if (dragNode.x < 40) dragNode.x = 40;
if (dragNode.x > 2008) dragNode.x = 2008;
if (dragNode.y < 200) dragNode.y = 200;
if (dragNode.y > 2600) dragNode.y = 2600;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
// Update difficulty
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
difficultyLevel++;
}
// Spawn boss every 45 seconds if no boss exists
bossSpawnTimer++;
if (bossSpawnTimer >= 2700 && !boss) {
// 45 seconds at 60 FPS
var newBoss = new Boss();
newBoss.x = 1024;
newBoss.y = -150;
boss = newBoss;
game.addChild(boss);
bossSpawnTimer = 0;
LK.effects.flashScreen(0xff0000, 500);
}
// Spawn regular enemies (reduced rate when boss is present)
enemySpawnTimer++;
var spawnRate = Math.max(60 - difficultyLevel * 5, 20);
if (boss) spawnRate *= 2; // Slower enemy spawn when boss is active
if (enemySpawnTimer >= spawnRate) {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -50;
enemy.speed += difficultyLevel * 0.5;
enemies.push(enemy);
game.addChild(enemy);
enemySpawnTimer = 0;
}
// Spawn power-ups
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 900) {
// Every 15 seconds
// 30% chance for triple power-up, 70% for health
if (Math.random() < 0.3) {
var triplePowerUp = new TriplePowerUp();
triplePowerUp.x = Math.random() * 1800 + 124;
triplePowerUp.y = -50;
triplePowerUps.push(triplePowerUp);
game.addChild(triplePowerUp);
} else {
var powerUp = new PowerUp();
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = -50;
powerUps.push(powerUp);
game.addChild(powerUp);
}
powerUpSpawnTimer = 0;
}
// Update and check player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= -30 && bullet.y < -30) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with boss
if (boss && bullet.intersects(boss)) {
bullet.destroy();
playerBullets.splice(i, 1);
var bossDefeated = boss.takeDamage();
if (bossDefeated) {
boss.destroy();
boss = null;
bossSpawnTimer = 0;
}
scoreTxt.setText('Score: ' + LK.getScore());
break;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Destroy both bullet and enemy
bullet.destroy();
playerBullets.splice(i, 1);
enemy.destroy();
enemies.splice(j, 1);
// Add score
LK.setScore(LK.getScore() + 10 * difficultyLevel);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('enemyHit').play();
break;
}
}
if (bullet.parent) {
bullet.lastY = bullet.y;
}
}
// Update and check enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY <= 2732 && bullet.y > 2732) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
bullet.destroy();
enemyBullets.splice(i, 1);
player.takeDamage();
healthTxt.setText('Health: ' + player.health);
continue;
}
if (bullet.parent) {
bullet.lastY = bullet.y;
}
}
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
// Remove enemies that go off screen
if (enemy.lastY <= 2732 && enemy.y > 2732) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
enemy.destroy();
enemies.splice(i, 1);
player.takeDamage();
healthTxt.setText('Health: ' + player.health);
continue;
}
if (enemy.parent) {
enemy.lastY = enemy.y;
}
}
// Update and check boss
if (boss) {
if (boss.lastY === undefined) boss.lastY = boss.y;
// Remove boss if it goes off screen
if (boss.lastY <= 2732 && boss.y > 2732) {
boss.destroy();
boss = null;
bossSpawnTimer = 0;
}
// Check collision with player
else if (boss.intersects(player)) {
boss.destroy();
boss = null;
bossSpawnTimer = 0;
player.takeDamage();
player.takeDamage(); // Boss does double damage
healthTxt.setText('Health: ' + player.health);
} else if (boss.parent) {
boss.lastY = boss.y;
}
}
// Update and check power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
// Remove power-ups that go off screen
if (powerUp.lastY <= 2732 && powerUp.y > 2732) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
// Check collision with player
if (powerUp.intersects(player)) {
powerUp.destroy();
powerUps.splice(i, 1);
player.heal();
healthTxt.setText('Health: ' + player.health);
LK.getSound('powerup').play();
LK.effects.flashObject(player, 0x00ffff, 300);
continue;
}
if (powerUp.parent) {
powerUp.lastY = powerUp.y;
}
}
// Update and check triple power-ups
for (var i = triplePowerUps.length - 1; i >= 0; i--) {
var triplePowerUp = triplePowerUps[i];
if (triplePowerUp.lastY === undefined) triplePowerUp.lastY = triplePowerUp.y;
// Remove triple power-ups that go off screen
if (triplePowerUp.lastY <= 2732 && triplePowerUp.y > 2732) {
triplePowerUp.destroy();
triplePowerUps.splice(i, 1);
continue;
}
// Check collision with player
if (triplePowerUp.intersects(player)) {
triplePowerUp.destroy();
triplePowerUps.splice(i, 1);
player.activateTripleShot();
LK.getSound('powerup').play();
continue;
}
if (triplePowerUp.parent) {
triplePowerUp.lastY = triplePowerUp.y;
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 3
});
bossGraphics.tint = 0x8B0000; // Dark red tint for boss
self.health = 20;
self.maxHealth = 20;
self.speed = 1;
self.shootCooldown = 0;
self.specialAttackCooldown = 0;
self.time = 0;
self.phase = 1;
self.update = function () {
self.time++;
// Boss movement - side to side
self.x += Math.sin(self.time * 0.02) * 2;
if (self.x < 100) self.x = 100;
if (self.x > 1948) self.x = 1948;
self.y += self.speed * 0.2;
// Regular shooting
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
if (self.shootCooldown <= 0) {
self.shoot();
self.shootCooldown = 30;
}
// Special attack patterns
if (self.specialAttackCooldown > 0) {
self.specialAttackCooldown--;
}
if (self.specialAttackCooldown <= 0) {
self.specialAttack();
self.specialAttackCooldown = 180; // Every 3 seconds
}
// Change phase based on health
if (self.health <= self.maxHealth * 0.5 && self.phase === 1) {
self.phase = 2;
self.speed = 1.5;
LK.effects.flashObject(self, 0xff6600, 1000);
}
};
self.shoot = function () {
// Triple shot
for (var i = -1; i <= 1; i++) {
var bullet = new EnemyBullet();
bullet.x = self.x + i * 50;
bullet.y = self.y + 90;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
self.specialAttack = function () {
if (self.phase === 1) {
// Spread shot pattern
for (var i = 0; i < 8; i++) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 90;
bullet.speed = 6;
bullet.angle = i * 45 * Math.PI / 180;
bullet.update = function () {
this.x += Math.cos(this.angle) * this.speed;
this.y += Math.sin(this.angle) * this.speed;
};
enemyBullets.push(bullet);
game.addChild(bullet);
}
} else {
// Phase 2: Rapid fire burst
for (var i = 0; i < 12; i++) {
LK.setTimeout(function (delay) {
return function () {
var bullet = new EnemyBullet();
bullet.x = self.x + (Math.random() - 0.5) * 100;
bullet.y = self.y + 90;
bullet.speed = 10;
enemyBullets.push(bullet);
game.addChild(bullet);
};
}(i), i * 50);
}
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xffff00, 200);
if (self.health <= 0) {
// Boss defeated - big score bonus
LK.setScore(LK.getScore() + 500);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('enemyHit').play();
return true; // Signal boss is defeated
}
return false;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2 + Math.random() * 3;
self.shootCooldown = Math.floor(Math.random() * 120) + 60;
self.movePattern = Math.floor(Math.random() * 3);
self.originalX = self.x;
self.time = 0;
self.update = function () {
self.time++;
// Movement patterns
if (self.movePattern === 0) {
// Straight down
self.y += self.speed;
} else if (self.movePattern === 1) {
// Zigzag
self.y += self.speed;
self.x += Math.sin(self.time * 0.1) * 2;
} else {
// Side to side
self.y += self.speed * 0.5;
self.x += Math.cos(self.time * 0.05) * 3;
}
// Keep enemies on screen horizontally
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
// Shooting
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
if (self.shootCooldown <= 0 && self.y > 100 && self.y < 2000) {
self.shoot();
self.shootCooldown = Math.floor(Math.random() * 180) + 120;
}
};
self.shoot = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.maxHealth = 3;
self.shootCooldown = 0;
self.powerLevel = 1;
self.tripleShotActive = false;
self.tripleShotTimer = 0;
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
// Handle triple shot timer
if (self.tripleShotActive && self.tripleShotTimer > 0) {
self.tripleShotTimer--;
if (self.tripleShotTimer <= 0) {
self.tripleShotActive = false;
LK.effects.flashObject(self, 0xffffff, 200);
}
}
// Auto-shoot
if (self.shootCooldown <= 0) {
self.shoot();
self.shootCooldown = 15; // Shoot every 15 frames
}
};
self.shoot = function () {
if (self.tripleShotActive) {
// Triple shot
for (var i = -1; i <= 1; i++) {
var bullet = new PlayerBullet();
bullet.x = self.x + i * 30;
bullet.y = self.y - 60;
playerBullets.push(bullet);
game.addChild(bullet);
}
} else {
// Single shot
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 60;
playerBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
};
self.takeDamage = function () {
self.health--;
LK.getSound('playerHit').play();
LK.effects.flashObject(self, 0xff0000, 500);
if (self.health <= 0) {
LK.showGameOver();
}
};
self.heal = function () {
if (self.health < self.maxHealth) {
self.health++;
}
};
self.activateTripleShot = function () {
self.tripleShotActive = true;
self.tripleShotTimer = 900; // 15 seconds at 60 FPS
LK.effects.flashObject(self, 0xffff00, 500);
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.time = 0;
self.update = function () {
self.time++;
self.y += self.speed;
self.rotation += 0.1;
// Floating effect
powerUpGraphics.y = Math.sin(self.time * 0.2) * 10;
};
return self;
});
var TriplePowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('triplePowerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.time = 0;
self.update = function () {
self.time++;
self.y += self.speed;
self.rotation += 0.1;
// Floating effect
powerUpGraphics.y = Math.sin(self.time * 0.2) * 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var triplePowerUps = [];
var boss = null;
var bossSpawnTimer = 0;
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var difficultyLevel = 1;
var dragNode = null;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 120;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
var healthTxt = new Text2('Health: 3', {
size: 60,
fill: 0x00FF00
});
healthTxt.anchor.set(1, 0);
healthTxt.x = -50;
healthTxt.y = 50;
LK.gui.topRight.addChild(healthTxt);
// Add background covering full screen
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(background);
// Initialize player
player = new Player();
player.x = 1024;
player.y = 2400;
game.addChild(player);
// Game controls
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
// Keep player on screen
if (dragNode.x < 40) dragNode.x = 40;
if (dragNode.x > 2008) dragNode.x = 2008;
if (dragNode.y < 200) dragNode.y = 200;
if (dragNode.y > 2600) dragNode.y = 2600;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
// Update difficulty
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
difficultyLevel++;
}
// Spawn boss every 45 seconds if no boss exists
bossSpawnTimer++;
if (bossSpawnTimer >= 2700 && !boss) {
// 45 seconds at 60 FPS
var newBoss = new Boss();
newBoss.x = 1024;
newBoss.y = -150;
boss = newBoss;
game.addChild(boss);
bossSpawnTimer = 0;
LK.effects.flashScreen(0xff0000, 500);
}
// Spawn regular enemies (reduced rate when boss is present)
enemySpawnTimer++;
var spawnRate = Math.max(60 - difficultyLevel * 5, 20);
if (boss) spawnRate *= 2; // Slower enemy spawn when boss is active
if (enemySpawnTimer >= spawnRate) {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -50;
enemy.speed += difficultyLevel * 0.5;
enemies.push(enemy);
game.addChild(enemy);
enemySpawnTimer = 0;
}
// Spawn power-ups
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 900) {
// Every 15 seconds
// 30% chance for triple power-up, 70% for health
if (Math.random() < 0.3) {
var triplePowerUp = new TriplePowerUp();
triplePowerUp.x = Math.random() * 1800 + 124;
triplePowerUp.y = -50;
triplePowerUps.push(triplePowerUp);
game.addChild(triplePowerUp);
} else {
var powerUp = new PowerUp();
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = -50;
powerUps.push(powerUp);
game.addChild(powerUp);
}
powerUpSpawnTimer = 0;
}
// Update and check player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= -30 && bullet.y < -30) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with boss
if (boss && bullet.intersects(boss)) {
bullet.destroy();
playerBullets.splice(i, 1);
var bossDefeated = boss.takeDamage();
if (bossDefeated) {
boss.destroy();
boss = null;
bossSpawnTimer = 0;
}
scoreTxt.setText('Score: ' + LK.getScore());
break;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Destroy both bullet and enemy
bullet.destroy();
playerBullets.splice(i, 1);
enemy.destroy();
enemies.splice(j, 1);
// Add score
LK.setScore(LK.getScore() + 10 * difficultyLevel);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('enemyHit').play();
break;
}
}
if (bullet.parent) {
bullet.lastY = bullet.y;
}
}
// Update and check enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY <= 2732 && bullet.y > 2732) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
bullet.destroy();
enemyBullets.splice(i, 1);
player.takeDamage();
healthTxt.setText('Health: ' + player.health);
continue;
}
if (bullet.parent) {
bullet.lastY = bullet.y;
}
}
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
// Remove enemies that go off screen
if (enemy.lastY <= 2732 && enemy.y > 2732) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
enemy.destroy();
enemies.splice(i, 1);
player.takeDamage();
healthTxt.setText('Health: ' + player.health);
continue;
}
if (enemy.parent) {
enemy.lastY = enemy.y;
}
}
// Update and check boss
if (boss) {
if (boss.lastY === undefined) boss.lastY = boss.y;
// Remove boss if it goes off screen
if (boss.lastY <= 2732 && boss.y > 2732) {
boss.destroy();
boss = null;
bossSpawnTimer = 0;
}
// Check collision with player
else if (boss.intersects(player)) {
boss.destroy();
boss = null;
bossSpawnTimer = 0;
player.takeDamage();
player.takeDamage(); // Boss does double damage
healthTxt.setText('Health: ' + player.health);
} else if (boss.parent) {
boss.lastY = boss.y;
}
}
// Update and check power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
// Remove power-ups that go off screen
if (powerUp.lastY <= 2732 && powerUp.y > 2732) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
// Check collision with player
if (powerUp.intersects(player)) {
powerUp.destroy();
powerUps.splice(i, 1);
player.heal();
healthTxt.setText('Health: ' + player.health);
LK.getSound('powerup').play();
LK.effects.flashObject(player, 0x00ffff, 300);
continue;
}
if (powerUp.parent) {
powerUp.lastY = powerUp.y;
}
}
// Update and check triple power-ups
for (var i = triplePowerUps.length - 1; i >= 0; i--) {
var triplePowerUp = triplePowerUps[i];
if (triplePowerUp.lastY === undefined) triplePowerUp.lastY = triplePowerUp.y;
// Remove triple power-ups that go off screen
if (triplePowerUp.lastY <= 2732 && triplePowerUp.y > 2732) {
triplePowerUp.destroy();
triplePowerUps.splice(i, 1);
continue;
}
// Check collision with player
if (triplePowerUp.intersects(player)) {
triplePowerUp.destroy();
triplePowerUps.splice(i, 1);
player.activateTripleShot();
LK.getSound('powerup').play();
continue;
}
if (triplePowerUp.parent) {
triplePowerUp.lastY = triplePowerUp.y;
}
}
};
pixel art bir uzay gemisi. In-Game asset. 2d. High contrast. No shadows
aşağı doğru bakan pixel art bir uzay gemisi. In-Game asset. 2d. High contrast. No shadows
kırmızı pixel art bir mermi. In-Game asset. 2d. High contrast. No shadows
pixel art mermi . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
küçük ve az yıldızların olduğu gerçekçi bir uzay. In-Game asset. 2d. High contrast. No shadows
3 adet yan yana mermi, şarjör. In-Game asset. 2d. High contrast. No shadows