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
/****
* Classes
****/
// Complete airship boss class
var AirshipBoss = Container.expand(function () {
var self = Container.call(this);
// Create airship body
var body = self.attachAsset('airshipBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Create wings
var leftWing = self.addChild(LK.getAsset('airshipWing', {
anchorX: 0.5,
anchorY: 0.5,
x: -400,
y: 0
}));
var rightWing = self.addChild(LK.getAsset('airshipWing', {
anchorX: 0.5,
anchorY: 0.5,
x: 400,
y: 0
}));
// Create core
self.core = new AirshipCore();
self.core.x = 0;
self.core.y = 0;
self.addChild(self.core);
// Create turrets
self.turrets = [];
var turretPositions = [{
x: -200,
y: -100
}, {
x: 200,
y: -100
}, {
x: -300,
y: 100
}, {
x: 300,
y: 100
}, {
x: 0,
y: 200
}];
for (var i = 0; i < turretPositions.length; i++) {
var turret = new AirshipTurret();
turret.x = turretPositions[i].x;
turret.y = turretPositions[i].y;
self.addChild(turret);
self.turrets.push(turret);
}
// Boss properties
self.active = true;
self.phase = 1;
self.moveDirection = 1;
self.moveSpeed = 1;
self.maxMoveX = 300;
self.startingY = 400;
self.lastX = 0;
// Move pattern
self.update = function () {
self.lastX = self.x;
// Move side to side
self.x += self.moveSpeed * self.moveDirection;
// Check if we need to change direction
if (Math.abs(self.x) > self.maxMoveX) {
self.moveDirection *= -1;
}
// Update core state
self.core.update();
// Count active turrets
var activeTurrets = 0;
for (var i = 0; i < self.turrets.length; i++) {
if (self.turrets[i].active) {
activeTurrets++;
// Update turrets and check if they need to fire
if (self.turrets[i].update()) {
// Signal to create a bullet
return {
fire: true,
x: self.x + self.turrets[i].x,
y: self.y + self.turrets[i].y
};
}
}
}
// Check if we need to expose the core
if (activeTurrets === 0 && !self.core.exposed) {
self.core.setExposed(true);
self.phase = 2;
// Increase movement speed in phase 2
self.moveSpeed = 2;
}
return {
fire: false
};
};
// Check if a specific part of the airship is hit
self.checkHit = function (bullet) {
// Try to hit turrets first
for (var i = 0; i < self.turrets.length; i++) {
if (bullet.intersects(self.turrets[i]) && self.turrets[i].active) {
if (self.turrets[i].takeHit(bullet.damage)) {
return {
hit: true,
destroyed: true,
type: 'turret'
};
}
return {
hit: true,
destroyed: false,
type: 'turret'
};
}
}
// Try to hit core if exposed
if (self.core.exposed && bullet.intersects(self.core)) {
if (self.core.takeHit(bullet.damage)) {
self.active = false;
return {
hit: true,
destroyed: true,
type: 'core'
};
}
return {
hit: true,
destroyed: false,
type: 'core'
};
}
// Hit the body but no damage
if (bullet.intersects(body)) {
return {
hit: true,
destroyed: false,
type: 'body'
};
}
return {
hit: false
};
};
return self;
});
// Set game background
// Airship core class
var AirshipCore = Container.expand(function () {
var self = Container.call(this);
// Attach core graphics
var coreGraphics = self.attachAsset('airshipCore', {
anchorX: 0.5,
anchorY: 0.5
});
// Core properties
self.health = 200;
self.maxHealth = 200;
self.active = true;
self.exposed = false;
self.lastWasIntersecting = false;
// Update core state
self.update = function () {
// Pulsate effect when exposed
if (self.exposed) {
coreGraphics.alpha = 0.5 + Math.sin(LK.ticks * 0.1) * 0.5;
}
};
// Handle core being hit
self.takeHit = function (damage) {
if (!self.active || !self.exposed) {
return false;
}
self.health -= damage;
LK.effects.flashObject(self, 0xff0000, 300);
if (self.health <= 0) {
self.health = 0;
self.active = false;
return true; // Core destroyed
}
return false; // Core still active
};
// Expose the core when all turrets are destroyed
self.setExposed = function (isExposed) {
self.exposed = isExposed;
if (isExposed) {
coreGraphics.tint = 0xff0000;
} else {
coreGraphics.tint = 0xffffff;
}
};
return self;
});
// Airship turret class
var AirshipTurret = Container.expand(function () {
var self = Container.call(this);
// Attach turret graphics
var turretGraphics = self.attachAsset('airshipTurret', {
anchorX: 0.5,
anchorY: 0.5
});
// Turret properties
self.health = 50;
self.maxHealth = 50;
self.fireRate = 120;
self.fireCounter = Math.floor(Math.random() * 60); // Randomize initial fire time
self.active = true;
self.lastWasIntersecting = false;
// Update turret state
self.update = function () {
if (!self.active) {
return;
}
self.fireCounter--;
// Ready to fire
if (self.fireCounter <= 0) {
self.fireCounter = self.fireRate;
return true; // Signal to create a bullet
}
return false;
};
// Handle turret being hit
self.takeHit = function (damage) {
if (!self.active) {
return false;
}
self.health -= damage;
LK.effects.flashObject(self, 0xff0000, 300);
if (self.health <= 0) {
self.health = 0;
self.active = false;
turretGraphics.alpha = 0.3;
return true; // Turret destroyed
}
return false; // Turret still active
};
return self;
});
// Enemy bullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
// Attach bullet graphics
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Bullet properties
self.speed = 8; // Moving downward
self.damage = 10;
self.active = true;
self.lastY = 0;
self.lastWasIntersecting = false;
// Update bullet position
self.update = function () {
self.lastY = self.y;
self.y += self.speed;
// Check if bullet is off-screen
if (self.y > 2732 + 50) {
self.active = false;
}
};
return self;
});
// Explosion effect class
var Explosion = Container.expand(function () {
var self = Container.call(this);
// Attach explosion graphics
var explosionGraphics = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5
});
// Explosion properties
self.lifetime = 30; // frames
self.active = true;
// Update explosion state
self.update = function () {
self.lifetime--;
// Scale and fade explosion
explosionGraphics.scaleX += 0.05;
explosionGraphics.scaleY += 0.05;
explosionGraphics.alpha = self.lifetime / 30;
if (self.lifetime <= 0) {
self.active = false;
}
};
return self;
});
// Player class for the fighter plane
var Player = Container.expand(function () {
var self = Container.call(this);
// Attach player graphics
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Player properties
self.speed = 10;
self.health = 100;
self.maxHealth = 100;
self.fireRate = 15;
self.lastShot = 0;
self.isDragging = false;
self.lastX = 0;
self.lastY = 0;
// Player movement bounds
self.minX = 100;
self.maxX = 2048 - 100;
self.minY = 2732 / 2;
self.maxY = 2732 - 100;
// Update player position and state
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
// Keep player within bounds
if (self.x < self.minX) {
self.x = self.minX;
}
if (self.x > self.maxX) {
self.x = self.maxX;
}
if (self.y < self.minY) {
self.y = self.minY;
}
if (self.y > self.maxY) {
self.y = self.maxY;
}
};
// Handle player being hit
self.takeHit = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
return true; // Player died
}
LK.effects.flashObject(self, 0xff0000, 300);
return false; // Player still alive
};
// Event handling for touch/click
self.down = function (x, y, obj) {
self.isDragging = true;
};
self.up = function (x, y, obj) {
self.isDragging = false;
};
return self;
});
// Player bullet class
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
// Attach bullet graphics
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Bullet properties
self.speed = -15; // Moving upward
self.damage = 10;
self.active = true;
self.lastY = 0;
self.lastWasIntersecting = false;
// Update bullet position
self.update = function () {
self.lastY = self.y;
self.y += self.speed;
// Check if bullet is off-screen
if (self.y < -50) {
self.active = false;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Set game background
// Initialize game assets
game.setBackgroundColor(0x1a1a2e);
// Game state variables
var player;
var airshipBoss;
var playerBullets = [];
var enemyBullets = [];
var explosions = [];
var score = 0;
var gameActive = true;
var bossDefeated = false;
// Create UI elements
var scoreText = new Text2('SCORE: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreText);
scoreText.x = 120; // Keep away from top-left 100x100 area
scoreText.y = 50;
// Create player health bar
var healthBarBg = game.addChild(LK.getAsset('healthBarBg', {
anchorX: 0,
anchorY: 0.5,
x: 120,
y: 120
}));
var healthBar = game.addChild(LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0.5,
x: 120,
y: 120
}));
var healthText = new Text2('HEALTH', {
size: 40,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0.5);
healthText.x = 250;
healthText.y = 120;
game.addChild(healthText);
// Create boss health bar (initially hidden)
var bossHealthBarBg = game.addChild(LK.getAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 200
}));
var bossHealthBar = game.addChild(LK.getAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 200,
tint: 0xff0000
}));
var bossText = new Text2('BOSS', {
size: 40,
fill: 0xFFFFFF
});
bossText.anchor.set(0.5, 0.5);
bossText.x = 2048 / 2;
bossText.y = 200;
game.addChild(bossText);
// Initially hide boss health
bossHealthBarBg.alpha = 0;
bossHealthBar.alpha = 0;
bossText.alpha = 0;
// Initialize player
function initPlayer() {
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 300;
game.addChild(player);
}
// Initialize airship boss
function initBoss() {
airshipBoss = new AirshipBoss();
airshipBoss.x = 2048 / 2;
airshipBoss.y = airshipBoss.startingY;
airshipBoss.lastX = airshipBoss.x;
game.addChild(airshipBoss);
// Show boss health
bossHealthBarBg.alpha = 1;
bossHealthBar.alpha = 1;
bossText.alpha = 1;
}
// Create player bullet
function createPlayerBullet() {
var bullet = new PlayerBullet();
bullet.x = player.x;
bullet.y = player.y - 60;
bullet.lastY = bullet.y;
bullet.lastWasIntersecting = false;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('playerShoot').play();
}
// Create enemy bullet
function createEnemyBullet(x, y) {
var bullet = new EnemyBullet();
bullet.x = x;
bullet.y = y;
bullet.lastY = bullet.y;
bullet.lastWasIntersecting = false;
enemyBullets.push(bullet);
game.addChild(bullet);
LK.getSound('enemyShoot').play();
}
// Create explosion
function createExplosion(x, y, scale) {
var explosion = new Explosion();
explosion.x = x;
explosion.y = y;
if (scale) {
explosion.scale.set(scale, scale);
}
explosions.push(explosion);
game.addChild(explosion);
LK.getSound('explosion').play();
}
// Update score
function updateScore(points) {
score += points;
scoreText.setText('SCORE: ' + score);
}
// Initialize game
initPlayer();
initBoss();
LK.playMusic('battleMusic');
// Game input handlers
game.down = function (x, y, obj) {
if (!gameActive) {
return;
}
// Auto-firing is handled in update
player.isDragging = true;
player.targetX = x;
player.targetY = y;
};
game.up = function (x, y, obj) {
player.isDragging = false;
};
game.move = function (x, y, obj) {
if (!gameActive || !player.isDragging) {
return;
}
player.x = x;
player.y = y;
};
// Main game update loop
game.update = function () {
if (!gameActive) {
return;
}
// Update player
player.update();
// Auto-fire player bullets
if (LK.ticks % player.fireRate === 0) {
createPlayerBullet();
}
// Update boss
if (airshipBoss && airshipBoss.active) {
var bossUpdate = airshipBoss.update();
if (bossUpdate.fire) {
createEnemyBullet(bossUpdate.x, bossUpdate.y);
}
// Update boss health bar
var bossHealthPercent = airshipBoss.core.health / airshipBoss.core.maxHealth;
bossHealthBar.scale.x = bossHealthPercent;
}
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
bullet.update();
// Check for collision with boss
if (airshipBoss && airshipBoss.active) {
var hitResult = airshipBoss.checkHit(bullet);
if (hitResult.hit && bullet.active) {
bullet.active = false;
// Create explosion effect
createExplosion(bullet.x, bullet.y, 0.5);
// Update score
if (hitResult.type === 'turret') {
updateScore(10);
if (hitResult.destroyed) {
updateScore(50);
createExplosion(bullet.x, bullet.y, 1);
}
} else if (hitResult.type === 'core') {
updateScore(20);
if (hitResult.destroyed) {
// Boss defeated
bossDefeated = true;
updateScore(500);
createExplosion(airshipBoss.x, airshipBoss.y, 3);
// Create multiple explosions
for (var e = 0; e < 10; e++) {
var randomX = airshipBoss.x + (Math.random() * 600 - 300);
var randomY = airshipBoss.y + (Math.random() * 400 - 200);
var randomDelay = Math.floor(Math.random() * 30);
LK.setTimeout(function (posX, posY) {
return function () {
createExplosion(posX, posY, 1 + Math.random());
};
}(randomX, randomY), randomDelay * 100);
}
// Show you win
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
}
}
}
}
// Remove inactive bullets
if (!bullet.active) {
game.removeChild(bullet);
playerBullets.splice(i, 1);
}
}
// Update enemy bullets
for (var j = enemyBullets.length - 1; j >= 0; j--) {
var enemyBullet = enemyBullets[j];
enemyBullet.update();
// Check for collision with player
if (!enemyBullet.lastWasIntersecting && enemyBullet.intersects(player) && enemyBullet.active) {
enemyBullet.active = false;
enemyBullet.lastWasIntersecting = true;
// Player takes hit
if (player.takeHit(enemyBullet.damage)) {
// Player died
gameActive = false;
createExplosion(player.x, player.y, 2);
player.visible = false;
// Show game over
LK.setTimeout(function () {
LK.showGameOver();
}, 1500);
} else {
// Player hit but still alive
createExplosion(player.x, player.y, 0.7);
LK.getSound('hit').play();
}
}
// Mark intersecting state
enemyBullet.lastWasIntersecting = enemyBullet.intersects(player);
// Remove inactive bullets
if (!enemyBullet.active) {
game.removeChild(enemyBullet);
enemyBullets.splice(j, 1);
}
}
// Update explosions
for (var k = explosions.length - 1; k >= 0; k--) {
explosions[k].update();
if (!explosions[k].active) {
game.removeChild(explosions[k]);
explosions.splice(k, 1);
}
}
// Update health bar
healthBar.scale.x = player.health / player.maxHealth;
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,651 @@
-/****
+/****
+* Classes
+****/
+// Complete airship boss class
+var AirshipBoss = Container.expand(function () {
+ var self = Container.call(this);
+ // Create airship body
+ var body = self.attachAsset('airshipBody', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Create wings
+ var leftWing = self.addChild(LK.getAsset('airshipWing', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: -400,
+ y: 0
+ }));
+ var rightWing = self.addChild(LK.getAsset('airshipWing', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 400,
+ y: 0
+ }));
+ // Create core
+ self.core = new AirshipCore();
+ self.core.x = 0;
+ self.core.y = 0;
+ self.addChild(self.core);
+ // Create turrets
+ self.turrets = [];
+ var turretPositions = [{
+ x: -200,
+ y: -100
+ }, {
+ x: 200,
+ y: -100
+ }, {
+ x: -300,
+ y: 100
+ }, {
+ x: 300,
+ y: 100
+ }, {
+ x: 0,
+ y: 200
+ }];
+ for (var i = 0; i < turretPositions.length; i++) {
+ var turret = new AirshipTurret();
+ turret.x = turretPositions[i].x;
+ turret.y = turretPositions[i].y;
+ self.addChild(turret);
+ self.turrets.push(turret);
+ }
+ // Boss properties
+ self.active = true;
+ self.phase = 1;
+ self.moveDirection = 1;
+ self.moveSpeed = 1;
+ self.maxMoveX = 300;
+ self.startingY = 400;
+ self.lastX = 0;
+ // Move pattern
+ self.update = function () {
+ self.lastX = self.x;
+ // Move side to side
+ self.x += self.moveSpeed * self.moveDirection;
+ // Check if we need to change direction
+ if (Math.abs(self.x) > self.maxMoveX) {
+ self.moveDirection *= -1;
+ }
+ // Update core state
+ self.core.update();
+ // Count active turrets
+ var activeTurrets = 0;
+ for (var i = 0; i < self.turrets.length; i++) {
+ if (self.turrets[i].active) {
+ activeTurrets++;
+ // Update turrets and check if they need to fire
+ if (self.turrets[i].update()) {
+ // Signal to create a bullet
+ return {
+ fire: true,
+ x: self.x + self.turrets[i].x,
+ y: self.y + self.turrets[i].y
+ };
+ }
+ }
+ }
+ // Check if we need to expose the core
+ if (activeTurrets === 0 && !self.core.exposed) {
+ self.core.setExposed(true);
+ self.phase = 2;
+ // Increase movement speed in phase 2
+ self.moveSpeed = 2;
+ }
+ return {
+ fire: false
+ };
+ };
+ // Check if a specific part of the airship is hit
+ self.checkHit = function (bullet) {
+ // Try to hit turrets first
+ for (var i = 0; i < self.turrets.length; i++) {
+ if (bullet.intersects(self.turrets[i]) && self.turrets[i].active) {
+ if (self.turrets[i].takeHit(bullet.damage)) {
+ return {
+ hit: true,
+ destroyed: true,
+ type: 'turret'
+ };
+ }
+ return {
+ hit: true,
+ destroyed: false,
+ type: 'turret'
+ };
+ }
+ }
+ // Try to hit core if exposed
+ if (self.core.exposed && bullet.intersects(self.core)) {
+ if (self.core.takeHit(bullet.damage)) {
+ self.active = false;
+ return {
+ hit: true,
+ destroyed: true,
+ type: 'core'
+ };
+ }
+ return {
+ hit: true,
+ destroyed: false,
+ type: 'core'
+ };
+ }
+ // Hit the body but no damage
+ if (bullet.intersects(body)) {
+ return {
+ hit: true,
+ destroyed: false,
+ type: 'body'
+ };
+ }
+ return {
+ hit: false
+ };
+ };
+ return self;
+});
+// Set game background
+// Airship core class
+var AirshipCore = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach core graphics
+ var coreGraphics = self.attachAsset('airshipCore', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Core properties
+ self.health = 200;
+ self.maxHealth = 200;
+ self.active = true;
+ self.exposed = false;
+ self.lastWasIntersecting = false;
+ // Update core state
+ self.update = function () {
+ // Pulsate effect when exposed
+ if (self.exposed) {
+ coreGraphics.alpha = 0.5 + Math.sin(LK.ticks * 0.1) * 0.5;
+ }
+ };
+ // Handle core being hit
+ self.takeHit = function (damage) {
+ if (!self.active || !self.exposed) {
+ return false;
+ }
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xff0000, 300);
+ if (self.health <= 0) {
+ self.health = 0;
+ self.active = false;
+ return true; // Core destroyed
+ }
+ return false; // Core still active
+ };
+ // Expose the core when all turrets are destroyed
+ self.setExposed = function (isExposed) {
+ self.exposed = isExposed;
+ if (isExposed) {
+ coreGraphics.tint = 0xff0000;
+ } else {
+ coreGraphics.tint = 0xffffff;
+ }
+ };
+ return self;
+});
+// Airship turret class
+var AirshipTurret = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach turret graphics
+ var turretGraphics = self.attachAsset('airshipTurret', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Turret properties
+ self.health = 50;
+ self.maxHealth = 50;
+ self.fireRate = 120;
+ self.fireCounter = Math.floor(Math.random() * 60); // Randomize initial fire time
+ self.active = true;
+ self.lastWasIntersecting = false;
+ // Update turret state
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.fireCounter--;
+ // Ready to fire
+ if (self.fireCounter <= 0) {
+ self.fireCounter = self.fireRate;
+ return true; // Signal to create a bullet
+ }
+ return false;
+ };
+ // Handle turret being hit
+ self.takeHit = function (damage) {
+ if (!self.active) {
+ return false;
+ }
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xff0000, 300);
+ if (self.health <= 0) {
+ self.health = 0;
+ self.active = false;
+ turretGraphics.alpha = 0.3;
+ return true; // Turret destroyed
+ }
+ return false; // Turret still active
+ };
+ return self;
+});
+// Enemy bullet class
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach bullet graphics
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Bullet properties
+ self.speed = 8; // Moving downward
+ self.damage = 10;
+ self.active = true;
+ self.lastY = 0;
+ self.lastWasIntersecting = false;
+ // Update bullet position
+ self.update = function () {
+ self.lastY = self.y;
+ self.y += self.speed;
+ // Check if bullet is off-screen
+ if (self.y > 2732 + 50) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+// Explosion effect class
+var Explosion = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach explosion graphics
+ var explosionGraphics = self.attachAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.5,
+ scaleY: 0.5
+ });
+ // Explosion properties
+ self.lifetime = 30; // frames
+ self.active = true;
+ // Update explosion state
+ self.update = function () {
+ self.lifetime--;
+ // Scale and fade explosion
+ explosionGraphics.scaleX += 0.05;
+ explosionGraphics.scaleY += 0.05;
+ explosionGraphics.alpha = self.lifetime / 30;
+ if (self.lifetime <= 0) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+// Player class for the fighter plane
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach player graphics
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Player properties
+ self.speed = 10;
+ self.health = 100;
+ self.maxHealth = 100;
+ self.fireRate = 15;
+ self.lastShot = 0;
+ self.isDragging = false;
+ self.lastX = 0;
+ self.lastY = 0;
+ // Player movement bounds
+ self.minX = 100;
+ self.maxX = 2048 - 100;
+ self.minY = 2732 / 2;
+ self.maxY = 2732 - 100;
+ // Update player position and state
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ // Keep player within bounds
+ if (self.x < self.minX) {
+ self.x = self.minX;
+ }
+ if (self.x > self.maxX) {
+ self.x = self.maxX;
+ }
+ if (self.y < self.minY) {
+ self.y = self.minY;
+ }
+ if (self.y > self.maxY) {
+ self.y = self.maxY;
+ }
+ };
+ // Handle player being hit
+ self.takeHit = function (damage) {
+ self.health -= damage;
+ if (self.health <= 0) {
+ self.health = 0;
+ return true; // Player died
+ }
+ LK.effects.flashObject(self, 0xff0000, 300);
+ return false; // Player still alive
+ };
+ // Event handling for touch/click
+ self.down = function (x, y, obj) {
+ self.isDragging = true;
+ };
+ self.up = function (x, y, obj) {
+ self.isDragging = false;
+ };
+ return self;
+});
+// Player bullet class
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach bullet graphics
+ var bulletGraphics = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Bullet properties
+ self.speed = -15; // Moving upward
+ self.damage = 10;
+ self.active = true;
+ self.lastY = 0;
+ self.lastWasIntersecting = false;
+ // Update bullet position
+ self.update = function () {
+ self.lastY = self.y;
+ self.y += self.speed;
+ // Check if bullet is off-screen
+ if (self.y < -50) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+// Set game background
+// Initialize game assets
+game.setBackgroundColor(0x1a1a2e);
+// Game state variables
+var player;
+var airshipBoss;
+var playerBullets = [];
+var enemyBullets = [];
+var explosions = [];
+var score = 0;
+var gameActive = true;
+var bossDefeated = false;
+// Create UI elements
+var scoreText = new Text2('SCORE: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(scoreText);
+scoreText.x = 120; // Keep away from top-left 100x100 area
+scoreText.y = 50;
+// Create player health bar
+var healthBarBg = game.addChild(LK.getAsset('healthBarBg', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 120,
+ y: 120
+}));
+var healthBar = game.addChild(LK.getAsset('healthBar', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 120,
+ y: 120
+}));
+var healthText = new Text2('HEALTH', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+healthText.anchor.set(0, 0.5);
+healthText.x = 250;
+healthText.y = 120;
+game.addChild(healthText);
+// Create boss health bar (initially hidden)
+var bossHealthBarBg = game.addChild(LK.getAsset('healthBarBg', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 200
+}));
+var bossHealthBar = game.addChild(LK.getAsset('healthBar', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 200,
+ tint: 0xff0000
+}));
+var bossText = new Text2('BOSS', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+bossText.anchor.set(0.5, 0.5);
+bossText.x = 2048 / 2;
+bossText.y = 200;
+game.addChild(bossText);
+// Initially hide boss health
+bossHealthBarBg.alpha = 0;
+bossHealthBar.alpha = 0;
+bossText.alpha = 0;
+// Initialize player
+function initPlayer() {
+ player = new Player();
+ player.x = 2048 / 2;
+ player.y = 2732 - 300;
+ game.addChild(player);
+}
+// Initialize airship boss
+function initBoss() {
+ airshipBoss = new AirshipBoss();
+ airshipBoss.x = 2048 / 2;
+ airshipBoss.y = airshipBoss.startingY;
+ airshipBoss.lastX = airshipBoss.x;
+ game.addChild(airshipBoss);
+ // Show boss health
+ bossHealthBarBg.alpha = 1;
+ bossHealthBar.alpha = 1;
+ bossText.alpha = 1;
+}
+// Create player bullet
+function createPlayerBullet() {
+ var bullet = new PlayerBullet();
+ bullet.x = player.x;
+ bullet.y = player.y - 60;
+ bullet.lastY = bullet.y;
+ bullet.lastWasIntersecting = false;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('playerShoot').play();
+}
+// Create enemy bullet
+function createEnemyBullet(x, y) {
+ var bullet = new EnemyBullet();
+ bullet.x = x;
+ bullet.y = y;
+ bullet.lastY = bullet.y;
+ bullet.lastWasIntersecting = false;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('enemyShoot').play();
+}
+// Create explosion
+function createExplosion(x, y, scale) {
+ var explosion = new Explosion();
+ explosion.x = x;
+ explosion.y = y;
+ if (scale) {
+ explosion.scale.set(scale, scale);
+ }
+ explosions.push(explosion);
+ game.addChild(explosion);
+ LK.getSound('explosion').play();
+}
+// Update score
+function updateScore(points) {
+ score += points;
+ scoreText.setText('SCORE: ' + score);
+}
+// Initialize game
+initPlayer();
+initBoss();
+LK.playMusic('battleMusic');
+// Game input handlers
+game.down = function (x, y, obj) {
+ if (!gameActive) {
+ return;
+ }
+ // Auto-firing is handled in update
+ player.isDragging = true;
+ player.targetX = x;
+ player.targetY = y;
+};
+game.up = function (x, y, obj) {
+ player.isDragging = false;
+};
+game.move = function (x, y, obj) {
+ if (!gameActive || !player.isDragging) {
+ return;
+ }
+ player.x = x;
+ player.y = y;
+};
+// Main game update loop
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Update player
+ player.update();
+ // Auto-fire player bullets
+ if (LK.ticks % player.fireRate === 0) {
+ createPlayerBullet();
+ }
+ // Update boss
+ if (airshipBoss && airshipBoss.active) {
+ var bossUpdate = airshipBoss.update();
+ if (bossUpdate.fire) {
+ createEnemyBullet(bossUpdate.x, bossUpdate.y);
+ }
+ // Update boss health bar
+ var bossHealthPercent = airshipBoss.core.health / airshipBoss.core.maxHealth;
+ bossHealthBar.scale.x = bossHealthPercent;
+ }
+ // Update player bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ bullet.update();
+ // Check for collision with boss
+ if (airshipBoss && airshipBoss.active) {
+ var hitResult = airshipBoss.checkHit(bullet);
+ if (hitResult.hit && bullet.active) {
+ bullet.active = false;
+ // Create explosion effect
+ createExplosion(bullet.x, bullet.y, 0.5);
+ // Update score
+ if (hitResult.type === 'turret') {
+ updateScore(10);
+ if (hitResult.destroyed) {
+ updateScore(50);
+ createExplosion(bullet.x, bullet.y, 1);
+ }
+ } else if (hitResult.type === 'core') {
+ updateScore(20);
+ if (hitResult.destroyed) {
+ // Boss defeated
+ bossDefeated = true;
+ updateScore(500);
+ createExplosion(airshipBoss.x, airshipBoss.y, 3);
+ // Create multiple explosions
+ for (var e = 0; e < 10; e++) {
+ var randomX = airshipBoss.x + (Math.random() * 600 - 300);
+ var randomY = airshipBoss.y + (Math.random() * 400 - 200);
+ var randomDelay = Math.floor(Math.random() * 30);
+ LK.setTimeout(function (posX, posY) {
+ return function () {
+ createExplosion(posX, posY, 1 + Math.random());
+ };
+ }(randomX, randomY), randomDelay * 100);
+ }
+ // Show you win
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 2000);
+ }
+ }
+ }
+ }
+ // Remove inactive bullets
+ if (!bullet.active) {
+ game.removeChild(bullet);
+ playerBullets.splice(i, 1);
+ }
+ }
+ // Update enemy bullets
+ for (var j = enemyBullets.length - 1; j >= 0; j--) {
+ var enemyBullet = enemyBullets[j];
+ enemyBullet.update();
+ // Check for collision with player
+ if (!enemyBullet.lastWasIntersecting && enemyBullet.intersects(player) && enemyBullet.active) {
+ enemyBullet.active = false;
+ enemyBullet.lastWasIntersecting = true;
+ // Player takes hit
+ if (player.takeHit(enemyBullet.damage)) {
+ // Player died
+ gameActive = false;
+ createExplosion(player.x, player.y, 2);
+ player.visible = false;
+ // Show game over
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1500);
+ } else {
+ // Player hit but still alive
+ createExplosion(player.x, player.y, 0.7);
+ LK.getSound('hit').play();
+ }
+ }
+ // Mark intersecting state
+ enemyBullet.lastWasIntersecting = enemyBullet.intersects(player);
+ // Remove inactive bullets
+ if (!enemyBullet.active) {
+ game.removeChild(enemyBullet);
+ enemyBullets.splice(j, 1);
+ }
+ }
+ // Update explosions
+ for (var k = explosions.length - 1; k >= 0; k--) {
+ explosions[k].update();
+ if (!explosions[k].active) {
+ game.removeChild(explosions[k]);
+ explosions.splice(k, 1);
+ }
+ }
+ // Update health bar
+ healthBar.scale.x = player.health / player.maxHealth;
+};
\ 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