User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'easeInOutQuad')' in or related to this line: 'tween.to(graphic, {' Line Number: 391
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'easeOutQuad')' in or related to this line: 'tween.to(graphic, {' Line Number: 264 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make best
User prompt
delete al code
User prompt
boss cant defeat. find and fix
User prompt
fix
User prompt
eneny can destroy
User prompt
player can destroy boss
User prompt
make
User prompt
delete all code
Code edit (1 edits merged)
Please save this source code
User prompt
fix game were bullet
Code edit (1 edits merged)
Please save this source code
User prompt
Sky Duel: Airship Showdown
Initial prompt
vertical shooter player vs airship big bos
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Boss = Container.expand(function () { var self = Container.call(this); // Boss graphics var bossGraphics = self.attachAsset('boss', { anchorX: 0.5, anchorY: 0.5 }); // Boss properties self.speed = 2; self.health = 50; self.points = 500; self.lastX = 0; self.moveDirection = 1; self.movePhase = 0; self.active = false; self.turrets = []; self.attackPhase = 0; self.attackTimer = 0; // Add turrets for (var i = 0; i < 4; i++) { var turret = self.addChild(LK.getAsset('bossPart', { anchorX: 0.5, anchorY: 0.5, x: i < 2 ? -100 : 100, y: i % 2 === 0 ? -50 : 50 })); turret.health = 10; self.turrets.push(turret); } // Activate boss self.activate = function () { self.active = true; LK.getSound('bossAlert').play(); // Entrance animation self.y = -150; tween.to(self, { y: 400 }, 2000, tween.easing.easeOutQuad); }; // Damage the boss self.damage = function (amount, target) { if (!self.active) { return false; } if (target) { // Hit a turret target.health -= amount; if (target.health <= 0) { // Create explosion var explosion = new Explosion(); explosion.x = self.x + target.x; explosion.y = self.y + target.y; game.addChild(explosion); // Remove turret from array and destroy it var index = self.turrets.indexOf(target); if (index !== -1) { self.turrets.splice(index, 1); } target.destroy(); // Add score LK.setScore(LK.getScore() + 50); } else { // Flash turret when hit LK.effects.flashObject(target, 0xffffff, 300); } return false; } // Hit the main boss body self.health -= amount; if (self.health <= 0) { // Create explosion var finalExplosion = new Explosion(); finalExplosion.x = self.x; finalExplosion.y = self.y; game.addChild(finalExplosion); // Add score LK.setScore(LK.getScore() + self.points); // You win! LK.setTimeout(function () { LK.showYouWin(); }, 1000); // Remove boss self.destroy(); return true; } // Flash boss when hit LK.effects.flashObject(self, 0xffffff, 300); return false; }; // Fire bullets from turrets self.fire = function () { if (!self.active || self.turrets.length === 0) { return; } // Fire from each turret for (var i = 0; i < self.turrets.length; i++) { var turret = self.turrets[i]; var bullet = new EnemyBullet(); bullet.x = self.x + turret.x; bullet.y = self.y + turret.y + 40; game.addChild(bullet); enemyBullets.push(bullet); } LK.getSound('enemyShoot').play(); }; // Update the boss self.update = function () { if (!self.active) { return; } self.lastX = self.x; // Move horizontally in a sine wave pattern self.movePhase += 0.02; self.x = 2048 / 2 + Math.sin(self.movePhase) * 500; // Attack patterns self.attackTimer++; if (self.attackTimer >= 60) { self.attackTimer = 0; // Different attack patterns based on phase if (self.attackPhase === 0) { self.fire(); } else if (self.attackPhase === 1) { // Rapid fire self.fire(); LK.setTimeout(function () { self.fire(); }, 200); LK.setTimeout(function () { self.fire(); }, 400); } // Change attack phase based on health self.attackPhase = self.health < 25 ? 1 : 0; } }; return self; }); // Set game background var Enemy = Container.expand(function () { var self = Container.call(this); // Enemy graphics var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); // Enemy properties self.speed = 3; self.fireRate = 120; self.health = 2; self.points = 10; self.lastY = 0; self.lastX = 0; self.moveDirection = 1; self.lastWasIntersecting = false; // Initialize with random horizontal movement self.horizontalSpeed = 1 + Math.random() * 2; if (Math.random() > 0.5) { self.horizontalSpeed *= -1; } // Damage the enemy self.damage = function (amount) { self.health -= amount; if (self.health <= 0) { // Create explosion var explosion = new Explosion(); explosion.x = self.x; explosion.y = self.y; game.addChild(explosion); // Add score LK.setScore(LK.getScore() + self.points); // Remove enemy self.destroy(); return true; } // Flash enemy when hit LK.effects.flashObject(self, 0xffffff, 300); return false; }; // Fire a bullet self.fire = function () { if (Math.random() < 0.7 && player && player.health > 0) { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 40; game.addChild(bullet); enemyBullets.push(bullet); LK.getSound('enemyShoot').play(); } }; // Update the enemy self.update = function () { self.lastX = self.x; self.lastY = self.y; // Move down self.y += self.speed; // Move side to side self.x += self.horizontalSpeed * self.moveDirection; // Bounce at edges if (self.x < 100 || self.x > 2048 - 100) { self.moveDirection *= -1; } // Occasionally fire if (LK.ticks % self.fireRate === 0) { self.fire(); } }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); // Bullet graphics self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); // Bullet properties self.speed = 8; self.lastY = 0; self.lastWasIntersecting = false; // Update the bullet position self.update = function () { self.lastY = self.y; self.y += self.speed; }; return self; }); var Explosion = Container.expand(function () { var self = Container.call(this); // Explosion graphics var graphic = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); // Play explosion sound LK.getSound('explosion').play(); // Animate the explosion tween.to(graphic, { scaleX: 2, scaleY: 2, alpha: 0 }, 500, tween.easing.easeOutQuad, function () { self.destroy(); }); return self; }); var PlayerBullet = Container.expand(function () { var self = Container.call(this); // Bullet graphics self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); // Bullet properties self.speed = 15; self.damage = 1; self.lastY = 0; self.lastWasIntersecting = false; // Update the bullet position self.update = function () { self.lastY = self.y; self.y -= self.speed; }; return self; }); var PlayerShip = Container.expand(function () { var self = Container.call(this); // Ship graphics var shipGraphics = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5 }); // Ship properties self.speed = 15; self.health = 3; self.shieldActive = false; self.lastX = 0; self.lastY = 0; self.fireRate = 15; self.lastFired = 0; self.invulnerable = false; // Shield self.shield = self.addChild(LK.getAsset('shield', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 })); self.shield.visible = false; // Make ship fire a bullet self.fire = function () { if (LK.ticks - self.lastFired >= self.fireRate) { var bullet = new PlayerBullet(); bullet.x = self.x; bullet.y = self.y - 50; game.addChild(bullet); bullets.push(bullet); LK.getSound('playerShoot').play(); self.lastFired = LK.ticks; } }; // Activate shield self.activateShield = function () { self.shieldActive = true; self.shield.visible = true; // Shield lasts for 5 seconds LK.setTimeout(function () { self.shieldActive = false; self.shield.visible = false; }, 5000); }; // Damage the ship self.damage = function () { if (self.invulnerable) { return; } if (self.shieldActive) { self.shieldActive = false; self.shield.visible = false; return; } self.health--; if (self.health <= 0) { // Game over LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } // Flash ship when hit LK.effects.flashObject(self, 0xff0000, 1000); // Make temporarily invulnerable self.invulnerable = true; shipGraphics.alpha = 0.5; LK.setTimeout(function () { self.invulnerable = false; shipGraphics.alpha = 1; }, 1500); }; // Update method self.update = function () { self.lastX = self.x; self.lastY = self.y; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); // PowerUp types: 0 = shield, 1 = rapid fire self.type = Math.floor(Math.random() * 2); // PowerUp graphics (different colors based on type) var color = self.type === 0 ? 0x3498db : 0xf1c40f; var graphic = self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5, tint: color }); // PowerUp properties self.speed = 2; self.lastY = 0; self.lastWasIntersecting = false; // Animate the powerup tween.to(graphic, { scaleX: 1.2, scaleY: 1.2 }, 500, tween.easing.easeInOutQuad).then(graphic, { scaleX: 0.8, scaleY: 0.8 }, 500, tween.easing.easeInOutQuad).repeat(); // Apply the powerup effect self.apply = function () { LK.getSound('powerup').play(); if (self.type === 0) { // Shield powerup player.activateShield(); } else { // Rapid fire powerup var oldFireRate = player.fireRate; player.fireRate = 5; LK.setTimeout(function () { player.fireRate = oldFireRate; }, 5000); } }; // Update the powerup self.update = function () { self.lastY = self.y; self.y += self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Set game background // Define player ship, bullets, enemies, and other game assets // Game sounds // Background music // Import the tween library for animations game.setBackgroundColor(0x000033); // Initialize game variables var player; var bullets = []; var enemies = []; var enemyBullets = []; var powerUps = []; var boss; var waveCount = 0; var enemiesDefeated = 0; var bossSpawned = false; var gameOver = false; var score = 0; // Create score text var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreTxt); scoreTxt.x = 120; // Keep away from top left 100x100 area // Create wave text var waveTxt = new Text2('Wave: 1', { size: 60, fill: 0xFFFFFF }); waveTxt.anchor.set(1, 0); LK.gui.topRight.addChild(waveTxt); // Create health text var healthTxt = new Text2('Health: 3', { size: 60, fill: 0xFFFFFF }); healthTxt.anchor.set(0.5, 0); LK.gui.top.addChild(healthTxt); // Initialize player player = new PlayerShip(); player.x = 2048 / 2; player.y = 2732 - 200; game.addChild(player); // Create boss (not active yet) boss = new Boss(); boss.x = 2048 / 2; game.addChild(boss); // Create a new wave of enemies function createWave() { waveCount++; waveTxt.setText('Wave: ' + waveCount); // Boss appears after wave 5 if (waveCount >= 5 && !bossSpawned) { bossSpawned = true; boss.activate(); return; } // Create a new wave of enemies var count = 5 + waveCount * 2; for (var i = 0; i < count; i++) { var enemy = new Enemy(); enemy.x = 200 + Math.random() * (2048 - 400); enemy.y = -100 - Math.random() * 500; // Make enemies tougher in later waves enemy.health = 1 + Math.floor(waveCount / 2); enemy.points = 10 * enemy.health; game.addChild(enemy); enemies.push(enemy); } } // Initial wave createWave(); // Play background music LK.playMusic('gameMusic', { loop: true }); // Event handlers for player controls var touchActive = false; var touchX = 0; // Mouse/touch down game.down = function (x, y, obj) { touchActive = true; touchX = x; // Fire weapon if (player && player.health > 0) { player.fire(); } }; // Mouse/touch move game.move = function (x, y, obj) { if (touchActive && player && player.health > 0) { // Move player var deltaX = x - touchX; player.x += deltaX; // Keep player within screen bounds player.x = Math.max(100, Math.min(2048 - 100, player.x)); touchX = x; } }; // Mouse/touch up game.up = function (x, y, obj) { touchActive = false; }; // Main game update loop game.update = function () { if (gameOver) { return; } // Update player if (player) { player.update(); // Auto-fire if touch is active if (touchActive && LK.ticks % 15 === 0) { player.fire(); } } // Update boss if (boss) { boss.update(); } // Update player bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.update(); // Check if bullet is off screen if (bullet.y < -50) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check collision with enemies var hitEnemy = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (!bullet.lastWasIntersecting && bullet.intersects(enemy)) { bullet.lastWasIntersecting = true; // Damage enemy if (enemy.damage(bullet.damage)) { enemies.splice(j, 1); enemiesDefeated++; // Spawn powerup (10% chance) if (Math.random() < 0.1) { var powerUp = new PowerUp(); powerUp.x = enemy.x; powerUp.y = enemy.y; game.addChild(powerUp); powerUps.push(powerUp); } } // Remove bullet bullet.destroy(); bullets.splice(i, 1); hitEnemy = true; break; } } // Skip boss check if already hit an enemy if (hitEnemy) { continue; } // Check collision with boss if (boss && boss.active) { // Check collision with turrets first var hitTurret = false; for (var t = 0; t < boss.turrets.length; t++) { var turret = boss.turrets[t]; var turretGlobal = game.toLocal(boss.toGlobal({ x: turret.x, y: turret.y })); if (Math.abs(bullet.x - turretGlobal.x) < 50 && Math.abs(bullet.y - turretGlobal.y) < 50) { boss.damage(bullet.damage, turret); bullet.destroy(); bullets.splice(i, 1); hitTurret = true; break; } } if (hitTurret) { continue; } // Check collision with boss body if (!bullet.lastWasIntersecting && bullet.intersects(boss)) { bullet.lastWasIntersecting = true; // Damage boss boss.damage(bullet.damage); // Remove bullet bullet.destroy(); bullets.splice(i, 1); } } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var enemyBullet = enemyBullets[i]; enemyBullet.update(); // Check if bullet is off screen if (enemyBullet.y > 2732 + 50) { enemyBullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check collision with player if (player && player.health > 0 && !enemyBullet.lastWasIntersecting && enemyBullet.intersects(player)) { enemyBullet.lastWasIntersecting = true; // Damage player player.damage(); // Update health text healthTxt.setText('Health: ' + player.health); // Remove bullet enemyBullet.destroy(); enemyBullets.splice(i, 1); } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.update(); // Check if enemy is off screen if (enemy.y > 2732 + 100) { enemy.destroy(); enemies.splice(i, 1); continue; } // Check collision with player if (player && player.health > 0 && !enemy.lastWasIntersecting && enemy.intersects(player)) { enemy.lastWasIntersecting = true; // Damage player player.damage(); // Update health text healthTxt.setText('Health: ' + player.health); // Damage enemy if (enemy.damage(1)) { enemies.splice(i, 1); enemiesDefeated++; } } } // Update powerups for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; powerUp.update(); // Check if powerup is off screen if (powerUp.y > 2732 + 50) { powerUp.destroy(); powerUps.splice(i, 1); continue; } // Check collision with player if (player && player.health > 0 && !powerUp.lastWasIntersecting && powerUp.intersects(player)) { powerUp.lastWasIntersecting = true; // Apply powerup effect powerUp.apply(); // Remove powerup powerUp.destroy(); powerUps.splice(i, 1); } } // Check if wave is completed if (enemies.length === 0 && !bossSpawned) { createWave(); } // Update score text scoreTxt.setText('Score: ' + LK.getScore()); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,675 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Boss = Container.expand(function () {
+ var self = Container.call(this);
+ // Boss graphics
+ var bossGraphics = self.attachAsset('boss', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Boss properties
+ self.speed = 2;
+ self.health = 50;
+ self.points = 500;
+ self.lastX = 0;
+ self.moveDirection = 1;
+ self.movePhase = 0;
+ self.active = false;
+ self.turrets = [];
+ self.attackPhase = 0;
+ self.attackTimer = 0;
+ // Add turrets
+ for (var i = 0; i < 4; i++) {
+ var turret = self.addChild(LK.getAsset('bossPart', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: i < 2 ? -100 : 100,
+ y: i % 2 === 0 ? -50 : 50
+ }));
+ turret.health = 10;
+ self.turrets.push(turret);
+ }
+ // Activate boss
+ self.activate = function () {
+ self.active = true;
+ LK.getSound('bossAlert').play();
+ // Entrance animation
+ self.y = -150;
+ tween.to(self, {
+ y: 400
+ }, 2000, tween.easing.easeOutQuad);
+ };
+ // Damage the boss
+ self.damage = function (amount, target) {
+ if (!self.active) {
+ return false;
+ }
+ if (target) {
+ // Hit a turret
+ target.health -= amount;
+ if (target.health <= 0) {
+ // Create explosion
+ var explosion = new Explosion();
+ explosion.x = self.x + target.x;
+ explosion.y = self.y + target.y;
+ game.addChild(explosion);
+ // Remove turret from array and destroy it
+ var index = self.turrets.indexOf(target);
+ if (index !== -1) {
+ self.turrets.splice(index, 1);
+ }
+ target.destroy();
+ // Add score
+ LK.setScore(LK.getScore() + 50);
+ } else {
+ // Flash turret when hit
+ LK.effects.flashObject(target, 0xffffff, 300);
+ }
+ return false;
+ }
+ // Hit the main boss body
+ self.health -= amount;
+ if (self.health <= 0) {
+ // Create explosion
+ var finalExplosion = new Explosion();
+ finalExplosion.x = self.x;
+ finalExplosion.y = self.y;
+ game.addChild(finalExplosion);
+ // Add score
+ LK.setScore(LK.getScore() + self.points);
+ // You win!
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 1000);
+ // Remove boss
+ self.destroy();
+ return true;
+ }
+ // Flash boss when hit
+ LK.effects.flashObject(self, 0xffffff, 300);
+ return false;
+ };
+ // Fire bullets from turrets
+ self.fire = function () {
+ if (!self.active || self.turrets.length === 0) {
+ return;
+ }
+ // Fire from each turret
+ for (var i = 0; i < self.turrets.length; i++) {
+ var turret = self.turrets[i];
+ var bullet = new EnemyBullet();
+ bullet.x = self.x + turret.x;
+ bullet.y = self.y + turret.y + 40;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ }
+ LK.getSound('enemyShoot').play();
+ };
+ // Update the boss
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.lastX = self.x;
+ // Move horizontally in a sine wave pattern
+ self.movePhase += 0.02;
+ self.x = 2048 / 2 + Math.sin(self.movePhase) * 500;
+ // Attack patterns
+ self.attackTimer++;
+ if (self.attackTimer >= 60) {
+ self.attackTimer = 0;
+ // Different attack patterns based on phase
+ if (self.attackPhase === 0) {
+ self.fire();
+ } else if (self.attackPhase === 1) {
+ // Rapid fire
+ self.fire();
+ LK.setTimeout(function () {
+ self.fire();
+ }, 200);
+ LK.setTimeout(function () {
+ self.fire();
+ }, 400);
+ }
+ // Change attack phase based on health
+ self.attackPhase = self.health < 25 ? 1 : 0;
+ }
+ };
+ return self;
+});
+// Set game background
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ // Enemy graphics
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Enemy properties
+ self.speed = 3;
+ self.fireRate = 120;
+ self.health = 2;
+ self.points = 10;
+ self.lastY = 0;
+ self.lastX = 0;
+ self.moveDirection = 1;
+ self.lastWasIntersecting = false;
+ // Initialize with random horizontal movement
+ self.horizontalSpeed = 1 + Math.random() * 2;
+ if (Math.random() > 0.5) {
+ self.horizontalSpeed *= -1;
+ }
+ // Damage the enemy
+ self.damage = function (amount) {
+ self.health -= amount;
+ if (self.health <= 0) {
+ // Create explosion
+ var explosion = new Explosion();
+ explosion.x = self.x;
+ explosion.y = self.y;
+ game.addChild(explosion);
+ // Add score
+ LK.setScore(LK.getScore() + self.points);
+ // Remove enemy
+ self.destroy();
+ return true;
+ }
+ // Flash enemy when hit
+ LK.effects.flashObject(self, 0xffffff, 300);
+ return false;
+ };
+ // Fire a bullet
+ self.fire = function () {
+ if (Math.random() < 0.7 && player && player.health > 0) {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 40;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ LK.getSound('enemyShoot').play();
+ }
+ };
+ // Update the enemy
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ // Move down
+ self.y += self.speed;
+ // Move side to side
+ self.x += self.horizontalSpeed * self.moveDirection;
+ // Bounce at edges
+ if (self.x < 100 || self.x > 2048 - 100) {
+ self.moveDirection *= -1;
+ }
+ // Occasionally fire
+ if (LK.ticks % self.fireRate === 0) {
+ self.fire();
+ }
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ // Bullet graphics
+ self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Bullet properties
+ self.speed = 8;
+ self.lastY = 0;
+ self.lastWasIntersecting = false;
+ // Update the bullet position
+ self.update = function () {
+ self.lastY = self.y;
+ self.y += self.speed;
+ };
+ return self;
+});
+var Explosion = Container.expand(function () {
+ var self = Container.call(this);
+ // Explosion graphics
+ var graphic = self.attachAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.8
+ });
+ // Play explosion sound
+ LK.getSound('explosion').play();
+ // Animate the explosion
+ tween.to(graphic, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, 500, tween.easing.easeOutQuad, function () {
+ self.destroy();
+ });
+ return self;
+});
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ // Bullet graphics
+ self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Bullet properties
+ self.speed = 15;
+ self.damage = 1;
+ self.lastY = 0;
+ self.lastWasIntersecting = false;
+ // Update the bullet position
+ self.update = function () {
+ self.lastY = self.y;
+ self.y -= self.speed;
+ };
+ return self;
+});
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ // Ship graphics
+ var shipGraphics = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Ship properties
+ self.speed = 15;
+ self.health = 3;
+ self.shieldActive = false;
+ self.lastX = 0;
+ self.lastY = 0;
+ self.fireRate = 15;
+ self.lastFired = 0;
+ self.invulnerable = false;
+ // Shield
+ self.shield = self.addChild(LK.getAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5
+ }));
+ self.shield.visible = false;
+ // Make ship fire a bullet
+ self.fire = function () {
+ if (LK.ticks - self.lastFired >= self.fireRate) {
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 50;
+ game.addChild(bullet);
+ bullets.push(bullet);
+ LK.getSound('playerShoot').play();
+ self.lastFired = LK.ticks;
+ }
+ };
+ // Activate shield
+ self.activateShield = function () {
+ self.shieldActive = true;
+ self.shield.visible = true;
+ // Shield lasts for 5 seconds
+ LK.setTimeout(function () {
+ self.shieldActive = false;
+ self.shield.visible = false;
+ }, 5000);
+ };
+ // Damage the ship
+ self.damage = function () {
+ if (self.invulnerable) {
+ return;
+ }
+ if (self.shieldActive) {
+ self.shieldActive = false;
+ self.shield.visible = false;
+ return;
+ }
+ self.health--;
+ if (self.health <= 0) {
+ // Game over
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ // Flash ship when hit
+ LK.effects.flashObject(self, 0xff0000, 1000);
+ // Make temporarily invulnerable
+ self.invulnerable = true;
+ shipGraphics.alpha = 0.5;
+ LK.setTimeout(function () {
+ self.invulnerable = false;
+ shipGraphics.alpha = 1;
+ }, 1500);
+ };
+ // Update method
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ // PowerUp types: 0 = shield, 1 = rapid fire
+ self.type = Math.floor(Math.random() * 2);
+ // PowerUp graphics (different colors based on type)
+ var color = self.type === 0 ? 0x3498db : 0xf1c40f;
+ var graphic = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: color
+ });
+ // PowerUp properties
+ self.speed = 2;
+ self.lastY = 0;
+ self.lastWasIntersecting = false;
+ // Animate the powerup
+ tween.to(graphic, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, 500, tween.easing.easeInOutQuad).then(graphic, {
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, 500, tween.easing.easeInOutQuad).repeat();
+ // Apply the powerup effect
+ self.apply = function () {
+ LK.getSound('powerup').play();
+ if (self.type === 0) {
+ // Shield powerup
+ player.activateShield();
+ } else {
+ // Rapid fire powerup
+ var oldFireRate = player.fireRate;
+ player.fireRate = 5;
+ LK.setTimeout(function () {
+ player.fireRate = oldFireRate;
+ }, 5000);
+ }
+ };
+ // Update the powerup
+ self.update = function () {
+ self.lastY = self.y;
+ self.y += self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+// Set game background
+// Define player ship, bullets, enemies, and other game assets
+// Game sounds
+// Background music
+// Import the tween library for animations
+game.setBackgroundColor(0x000033);
+// Initialize game variables
+var player;
+var bullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerUps = [];
+var boss;
+var waveCount = 0;
+var enemiesDefeated = 0;
+var bossSpawned = false;
+var gameOver = false;
+var score = 0;
+// Create score text
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+LK.gui.topLeft.addChild(scoreTxt);
+scoreTxt.x = 120; // Keep away from top left 100x100 area
+// Create wave text
+var waveTxt = new Text2('Wave: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+waveTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(waveTxt);
+// Create health text
+var healthTxt = new Text2('Health: 3', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+healthTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(healthTxt);
+// Initialize player
+player = new PlayerShip();
+player.x = 2048 / 2;
+player.y = 2732 - 200;
+game.addChild(player);
+// Create boss (not active yet)
+boss = new Boss();
+boss.x = 2048 / 2;
+game.addChild(boss);
+// Create a new wave of enemies
+function createWave() {
+ waveCount++;
+ waveTxt.setText('Wave: ' + waveCount);
+ // Boss appears after wave 5
+ if (waveCount >= 5 && !bossSpawned) {
+ bossSpawned = true;
+ boss.activate();
+ return;
+ }
+ // Create a new wave of enemies
+ var count = 5 + waveCount * 2;
+ for (var i = 0; i < count; i++) {
+ var enemy = new Enemy();
+ enemy.x = 200 + Math.random() * (2048 - 400);
+ enemy.y = -100 - Math.random() * 500;
+ // Make enemies tougher in later waves
+ enemy.health = 1 + Math.floor(waveCount / 2);
+ enemy.points = 10 * enemy.health;
+ game.addChild(enemy);
+ enemies.push(enemy);
+ }
+}
+// Initial wave
+createWave();
+// Play background music
+LK.playMusic('gameMusic', {
+ loop: true
+});
+// Event handlers for player controls
+var touchActive = false;
+var touchX = 0;
+// Mouse/touch down
+game.down = function (x, y, obj) {
+ touchActive = true;
+ touchX = x;
+ // Fire weapon
+ if (player && player.health > 0) {
+ player.fire();
+ }
+};
+// Mouse/touch move
+game.move = function (x, y, obj) {
+ if (touchActive && player && player.health > 0) {
+ // Move player
+ var deltaX = x - touchX;
+ player.x += deltaX;
+ // Keep player within screen bounds
+ player.x = Math.max(100, Math.min(2048 - 100, player.x));
+ touchX = x;
+ }
+};
+// Mouse/touch up
+game.up = function (x, y, obj) {
+ touchActive = false;
+};
+// Main game update loop
+game.update = function () {
+ if (gameOver) {
+ return;
+ }
+ // Update player
+ if (player) {
+ player.update();
+ // Auto-fire if touch is active
+ if (touchActive && LK.ticks % 15 === 0) {
+ player.fire();
+ }
+ }
+ // Update boss
+ if (boss) {
+ boss.update();
+ }
+ // Update player bullets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ bullet.update();
+ // Check if bullet is off screen
+ if (bullet.y < -50) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with enemies
+ var hitEnemy = false;
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (!bullet.lastWasIntersecting && bullet.intersects(enemy)) {
+ bullet.lastWasIntersecting = true;
+ // Damage enemy
+ if (enemy.damage(bullet.damage)) {
+ enemies.splice(j, 1);
+ enemiesDefeated++;
+ // Spawn powerup (10% chance)
+ if (Math.random() < 0.1) {
+ var powerUp = new PowerUp();
+ powerUp.x = enemy.x;
+ powerUp.y = enemy.y;
+ game.addChild(powerUp);
+ powerUps.push(powerUp);
+ }
+ }
+ // Remove bullet
+ bullet.destroy();
+ bullets.splice(i, 1);
+ hitEnemy = true;
+ break;
+ }
+ }
+ // Skip boss check if already hit an enemy
+ if (hitEnemy) {
+ continue;
+ }
+ // Check collision with boss
+ if (boss && boss.active) {
+ // Check collision with turrets first
+ var hitTurret = false;
+ for (var t = 0; t < boss.turrets.length; t++) {
+ var turret = boss.turrets[t];
+ var turretGlobal = game.toLocal(boss.toGlobal({
+ x: turret.x,
+ y: turret.y
+ }));
+ if (Math.abs(bullet.x - turretGlobal.x) < 50 && Math.abs(bullet.y - turretGlobal.y) < 50) {
+ boss.damage(bullet.damage, turret);
+ bullet.destroy();
+ bullets.splice(i, 1);
+ hitTurret = true;
+ break;
+ }
+ }
+ if (hitTurret) {
+ continue;
+ }
+ // Check collision with boss body
+ if (!bullet.lastWasIntersecting && bullet.intersects(boss)) {
+ bullet.lastWasIntersecting = true;
+ // Damage boss
+ boss.damage(bullet.damage);
+ // Remove bullet
+ bullet.destroy();
+ bullets.splice(i, 1);
+ }
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var enemyBullet = enemyBullets[i];
+ enemyBullet.update();
+ // Check if bullet is off screen
+ if (enemyBullet.y > 2732 + 50) {
+ enemyBullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player && player.health > 0 && !enemyBullet.lastWasIntersecting && enemyBullet.intersects(player)) {
+ enemyBullet.lastWasIntersecting = true;
+ // Damage player
+ player.damage();
+ // Update health text
+ healthTxt.setText('Health: ' + player.health);
+ // Remove bullet
+ enemyBullet.destroy();
+ enemyBullets.splice(i, 1);
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ enemy.update();
+ // Check if enemy is off screen
+ if (enemy.y > 2732 + 100) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player && player.health > 0 && !enemy.lastWasIntersecting && enemy.intersects(player)) {
+ enemy.lastWasIntersecting = true;
+ // Damage player
+ player.damage();
+ // Update health text
+ healthTxt.setText('Health: ' + player.health);
+ // Damage enemy
+ if (enemy.damage(1)) {
+ enemies.splice(i, 1);
+ enemiesDefeated++;
+ }
+ }
+ }
+ // Update powerups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ powerUp.update();
+ // Check if powerup is off screen
+ if (powerUp.y > 2732 + 50) {
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player && player.health > 0 && !powerUp.lastWasIntersecting && powerUp.intersects(player)) {
+ powerUp.lastWasIntersecting = true;
+ // Apply powerup effect
+ powerUp.apply();
+ // Remove powerup
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ }
+ }
+ // Check if wave is completed
+ if (enemies.length === 0 && !bossSpawned) {
+ createWave();
+ }
+ // Update score text
+ scoreTxt.setText('Score: ' + LK.getScore());
+};
\ No newline at end of file
top down 32 bit image manta ray air warplane. In-Game asset. 2d. High contrast. No shadows
2d disney style image about zone of blue sky. In-Game asset. 2d. High contrast. No shadows
red laser. In-Game asset. 2d. High contrast. No shadows
top down 2d scifi pelican war air plane look a like. In-Game asset. 2d. High contrast. No shadows
vertical torpedo fall. In-Game asset. 2d. High contrast. No shadows
disney image style yellow explosion. In-Game asset. 2d. High contrast. No shadows