/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Enemy Type 1: Basic Enemy - moves straight down var BasicEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0xff0000 }); self.speed = 2; self.points = 10; self.health = 1; self.type = 'basic'; self.update = function () { self.y += self.speed; }; return self; }); // Enemy Type 6: Boss Enemy - large, slow, high health var BossEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0xffff00, scaleX: 2, scaleY: 2 }); self.speed = 0.5; self.points = 200; self.health = 10; self.type = 'boss'; self.update = function () { self.y += self.speed; }; return self; }); // Legacy Enemy for compatibility // Enemy Type 2: Fast Enemy - moves faster var FastEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0x00ff00, scaleX: 0.8, scaleY: 0.8 }); self.speed = 5; self.points = 20; self.health = 1; self.type = 'fast'; self.update = function () { self.y += self.speed; }; return self; }); // Flying Bird - moves horizontally across screen var FlyingBird = Container.expand(function () { var self = Container.call(this); var birdGraphics = self.attachAsset('bird', { anchorX: 0.5, anchorY: 0.5 }); self.speedX = 3; self.speedY = Math.random() * 2 - 1; // Random vertical movement self.update = function () { self.x += self.speedX; self.y += self.speedY; // Simple flapping animation self.rotation = Math.sin(LK.ticks * 0.2) * 0.2; }; return self; }); // Set background var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('heroBox', { anchorX: 0.5, anchorY: 0.5 }); self.fireRate = 5; // Fire every 5 ticks (4x faster) self.lastFire = 0; self.barrels = 1; // Start with 1 barrel self.isFiring = false; // Track if hero is currently being touched for firing // Add fire method to be called when touching the hero self.fire = function () { if (LK.ticks - self.lastFire > self.fireRate) { self.lastFire = LK.ticks; // Fire bullets from multiple barrels for (var b = 0; b < self.barrels; b++) { var bullet = new HeroBullet(); // Calculate bullet position to spread horizontally toward top of screen var totalWidth = (self.barrels - 1) * 80; // 80 pixels apart horizontally var offsetX = b * 80 - totalWidth / 2; // Center the spread bullet.x = self.x + offsetX; bullet.y = self.y - 50; heroBullets.push(bullet); game.addChild(bullet); } } }; self.update = function () { // Continuous firing while being touched if (self.isFiring) { self.fire(); } }; // Touch event handler for hero - fire when touched self.down = function (x, y, obj) { self.fire(); }; return self; }); var HeroBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('heroBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -60; self.update = function () { self.y += self.speed; }; return self; }); // Enemy Type 5: Spinner Enemy - rotates while moving var SpinnerEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0xff00ff }); self.speed = 2.5; self.points = 25; self.health = 2; self.type = 'spinner'; self.rotationSpeed = 0.1; self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; }; return self; }); // Enemy Type 3: Tank Enemy - slow but strong var TankEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0x888888, scaleX: 1.5, scaleY: 1.5 }); self.speed = 1; self.points = 50; self.health = 3; self.type = 'tank'; self.update = function () { self.y += self.speed; }; return self; }); // Enemy Type 4: Zigzag Enemy - moves in zigzag pattern var ZigzagEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0x0000ff }); self.speed = 2; self.points = 30; self.health = 1; self.type = 'zigzag'; self.direction = 1; self.zigzagSpeed = 3; self.update = function () { self.y += self.speed; self.x += self.direction * self.zigzagSpeed; // Change direction if hitting screen edges if (self.x <= 100 || self.x >= 1948) { self.direction *= -1; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Set background // Legacy Enemy for compatibility var Enemy = BasicEnemy; game.setBackgroundColor(0x4488cc); // Add gradient background var backgroundGradient = LK.getAsset('manzara', { width: 2048, height: 2732, scaleX: 20.48, scaleY: 27.32, alpha: 0.3 }); game.addChildAt(backgroundGradient, 0); // Game variables var hero; var enemies = []; var heroBullets = []; var waveNumber = 1; var enemiesSpawned = 0; var enemiesPerWave = 5; var spawnTimer = 0; var spawnRate = 60; // Spawn every 60 ticks initially var dragNode = null; var lastScoreCheck = 0; // Track last score when landscape was added var landscapeElements = []; // Track all landscape elements // Create hero hero = new Hero(); hero.x = 2048 / 2; hero.y = 2732 - 200; game.addChild(hero); // Score display var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Wave display var waveTxt = new Text2('Wave: 1', { size: 60, fill: 0xFFFF00 }); waveTxt.anchor.set(0, 0); waveTxt.x = 50; waveTxt.y = 50; LK.gui.topLeft.addChild(waveTxt); // Touch controls game.down = function (x, y, obj) { // Check if touching the hero using direct coordinate comparison var heroHalfWidth = hero.width / 2; var heroHalfHeight = hero.height / 2; var touchingHero = x >= hero.x - heroHalfWidth && x <= hero.x + heroHalfWidth && y >= hero.y - heroHalfHeight && y <= hero.y + heroHalfHeight; if (touchingHero) { // Start continuous firing when touching hero hero.isFiring = true; hero.fire(); // Fire immediately } // Always allow dragging dragNode = hero; hero.x = x; hero.y = y; }; game.move = function (x, y, obj) { if (dragNode) { // Apply smooth movement with speed multiplier for faster response var speedMultiplier = 1.5; var targetX = x; var targetY = y; // Calculate direction and apply speed var deltaX = targetX - dragNode.x; var deltaY = targetY - dragNode.y; dragNode.x += deltaX * speedMultiplier; dragNode.y += deltaY * speedMultiplier; } }; game.up = function (x, y, obj) { dragNode = null; // Stop continuous firing when touch is released hero.isFiring = false; }; // Main game loop game.update = function () { // Spawn enemies spawnTimer++; if (spawnTimer >= spawnRate && enemiesSpawned < enemiesPerWave) { spawnTimer = 0; var enemy; var enemyType = Math.random(); // Spawn different enemy types based on wave number and random chance if (waveNumber >= 10 && enemyType < 0.1) { // Boss enemy (10% chance after wave 10) enemy = new BossEnemy(); } else if (waveNumber >= 7 && enemyType < 0.25) { // Spinner enemy (15% chance after wave 7) enemy = new SpinnerEnemy(); } else if (waveNumber >= 5 && enemyType < 0.4) { // Zigzag enemy (15% chance after wave 5) enemy = new ZigzagEnemy(); } else if (waveNumber >= 3 && enemyType < 0.6) { // Tank enemy (20% chance after wave 3) enemy = new TankEnemy(); } else if (waveNumber >= 2 && enemyType < 0.8) { // Fast enemy (20% chance after wave 2) enemy = new FastEnemy(); } else { // Basic enemy (always available, 20% chance in later waves) enemy = new BasicEnemy(); } enemy.x = Math.random() * (2048 - 200) + 100; enemy.y = -100; // Apply wave speed modifier to base speed enemy.speed = enemy.speed + waveNumber * 0.3; enemies.push(enemy); game.addChild(enemy); enemiesSpawned++; } // Update and check bullet collisions for (var i = heroBullets.length - 1; i >= 0; i--) { var bullet = heroBullets[i]; // Remove bullets that go off screen if (bullet.y < -50) { bullet.destroy(); heroBullets.splice(i, 1); continue; } // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Enemy hit - reduce health enemy.health--; // Remove bullet bullet.destroy(); heroBullets.splice(i, 1); // Create smoke and flame effect on hit var smokeEffect = LK.getAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0x666666, scaleX: 0.3, scaleY: 0.3, alpha: 0.8 }); smokeEffect.x = enemy.x; smokeEffect.y = enemy.y; game.addChild(smokeEffect); var flameEffect = LK.getAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0xff4400, scaleX: 0.2, scaleY: 0.2, alpha: 1.0 }); flameEffect.x = enemy.x; flameEffect.y = enemy.y; game.addChild(flameEffect); // Animate smoke effect tween(smokeEffect, { scaleX: 1.2, scaleY: 1.2, alpha: 0, y: smokeEffect.y - 100 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { smokeEffect.destroy(); } }); // Animate flame effect tween(flameEffect, { scaleX: 0.8, scaleY: 0.8, alpha: 0, rotation: Math.PI * 2 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { flameEffect.destroy(); } }); // Play explosion sound LK.getSound('explosion').play(); // Check if enemy is destroyed if (enemy.health <= 0) { LK.setScore(LK.getScore() + enemy.points); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(j, 1); } else { // Enemy damaged but not destroyed - flash red LK.effects.flashObject(enemy, 0xff0000, 200); } break; } } } // Update and check enemy collisions with hero for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; // Check if enemy reached hero if (enemy.intersects(hero)) { LK.showGameOver(); return; } // Remove enemies that go off screen if (enemy.y > 2732 + 100) { enemy.destroy(); enemies.splice(k, 1); } } // Check if wave is complete if (enemies.length === 0 && enemiesSpawned >= enemiesPerWave) { waveNumber++; waveTxt.setText('Wave: ' + waveNumber); enemiesSpawned = 0; enemiesPerWave = Math.min(5 + waveNumber, 15); // Increase enemies per wave spawnRate = Math.max(30, 60 - waveNumber * 2); // Decrease spawn rate // Increase barrels every 5 waves hero.barrels = Math.floor(waveNumber / 5) + 1; } // Generate landscape elements at specific score milestones var currentScore = LK.getScore(); // Grass at 200 points if (currentScore >= 200 && lastScoreCheck < 200) { lastScoreCheck = 200; for (var gr = 0; gr < 5; gr++) { var grass = LK.getAsset('grass', { anchorX: 0.5, anchorY: 1.0 }); grass.x = Math.random() * 1800 + 124; // Random x position grass.y = 2732 - 15; // Just above terrain landscapeElements.push(grass); game.addChild(grass); } } // Cows at 200 points if (currentScore >= 200 && lastScoreCheck < 200) { for (var c = 0; c < 2; c++) { var cow = LK.getAsset('cow', { anchorX: 0.5, anchorY: 1.0 }); cow.x = Math.random() * 1600 + 224; // Random x position with more margin cow.y = 2732 - 40; // Above ground level landscapeElements.push(cow); game.addChild(cow); } } // Sheep at 300 points if (currentScore >= 300 && lastScoreCheck < 300) { lastScoreCheck = 300; for (var s = 0; s < 3; s++) { var sheep = LK.getAsset('sheep', { anchorX: 0.5, anchorY: 1.0 }); sheep.x = Math.random() * 1600 + 224; // Random x position with more margin sheep.y = 2732 - 35; // Above ground level landscapeElements.push(sheep); game.addChild(sheep); } } // Flying birds at 400 points if (currentScore >= 400 && lastScoreCheck < 400) { lastScoreCheck = 400; for (var b = 0; b < 3; b++) { var bird = new FlyingBird(); bird.x = -50; // Start from left edge bird.y = Math.random() * 400 + 200; // Random height in upper area landscapeElements.push(bird); game.addChild(bird); } } // Trees at 500 points if (currentScore >= 500 && lastScoreCheck < 500) { lastScoreCheck = 500; for (var t = 0; t < 2; t++) { var tree = LK.getAsset('tree', { anchorX: 0.5, anchorY: 1.0 }); tree.x = Math.random() * 1800 + 124; // Random x position tree.y = 2732 - 60; // Above ground level landscapeElements.push(tree); game.addChild(tree); } } // Clean up birds that have flown off screen for (var bird_i = landscapeElements.length - 1; bird_i >= 0; bird_i--) { var element = landscapeElements[bird_i]; if (element.speedX && element.x > 2100) { element.destroy(); landscapeElements.splice(bird_i, 1); } } }; // Start background music LK.playMusic('1a439');
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Type 1: Basic Enemy - moves straight down
var BasicEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff0000
});
self.speed = 2;
self.points = 10;
self.health = 1;
self.type = 'basic';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Type 6: Boss Enemy - large, slow, high health
var BossEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xffff00,
scaleX: 2,
scaleY: 2
});
self.speed = 0.5;
self.points = 200;
self.health = 10;
self.type = 'boss';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Legacy Enemy for compatibility
// Enemy Type 2: Fast Enemy - moves faster
var FastEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x00ff00,
scaleX: 0.8,
scaleY: 0.8
});
self.speed = 5;
self.points = 20;
self.health = 1;
self.type = 'fast';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Flying Bird - moves horizontally across screen
var FlyingBird = Container.expand(function () {
var self = Container.call(this);
var birdGraphics = self.attachAsset('bird', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = 3;
self.speedY = Math.random() * 2 - 1; // Random vertical movement
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
// Simple flapping animation
self.rotation = Math.sin(LK.ticks * 0.2) * 0.2;
};
return self;
});
// Set background
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('heroBox', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 5; // Fire every 5 ticks (4x faster)
self.lastFire = 0;
self.barrels = 1; // Start with 1 barrel
self.isFiring = false; // Track if hero is currently being touched for firing
// Add fire method to be called when touching the hero
self.fire = function () {
if (LK.ticks - self.lastFire > self.fireRate) {
self.lastFire = LK.ticks;
// Fire bullets from multiple barrels
for (var b = 0; b < self.barrels; b++) {
var bullet = new HeroBullet();
// Calculate bullet position to spread horizontally toward top of screen
var totalWidth = (self.barrels - 1) * 80; // 80 pixels apart horizontally
var offsetX = b * 80 - totalWidth / 2; // Center the spread
bullet.x = self.x + offsetX;
bullet.y = self.y - 50;
heroBullets.push(bullet);
game.addChild(bullet);
}
}
};
self.update = function () {
// Continuous firing while being touched
if (self.isFiring) {
self.fire();
}
};
// Touch event handler for hero - fire when touched
self.down = function (x, y, obj) {
self.fire();
};
return self;
});
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('heroBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -60;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Type 5: Spinner Enemy - rotates while moving
var SpinnerEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff00ff
});
self.speed = 2.5;
self.points = 25;
self.health = 2;
self.type = 'spinner';
self.rotationSpeed = 0.1;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
};
return self;
});
// Enemy Type 3: Tank Enemy - slow but strong
var TankEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x888888,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 1;
self.points = 50;
self.health = 3;
self.type = 'tank';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Type 4: Zigzag Enemy - moves in zigzag pattern
var ZigzagEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x0000ff
});
self.speed = 2;
self.points = 30;
self.health = 1;
self.type = 'zigzag';
self.direction = 1;
self.zigzagSpeed = 3;
self.update = function () {
self.y += self.speed;
self.x += self.direction * self.zigzagSpeed;
// Change direction if hitting screen edges
if (self.x <= 100 || self.x >= 1948) {
self.direction *= -1;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Set background
// Legacy Enemy for compatibility
var Enemy = BasicEnemy;
game.setBackgroundColor(0x4488cc);
// Add gradient background
var backgroundGradient = LK.getAsset('manzara', {
width: 2048,
height: 2732,
scaleX: 20.48,
scaleY: 27.32,
alpha: 0.3
});
game.addChildAt(backgroundGradient, 0);
// Game variables
var hero;
var enemies = [];
var heroBullets = [];
var waveNumber = 1;
var enemiesSpawned = 0;
var enemiesPerWave = 5;
var spawnTimer = 0;
var spawnRate = 60; // Spawn every 60 ticks initially
var dragNode = null;
var lastScoreCheck = 0; // Track last score when landscape was added
var landscapeElements = []; // Track all landscape elements
// Create hero
hero = new Hero();
hero.x = 2048 / 2;
hero.y = 2732 - 200;
game.addChild(hero);
// Score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Wave display
var waveTxt = new Text2('Wave: 1', {
size: 60,
fill: 0xFFFF00
});
waveTxt.anchor.set(0, 0);
waveTxt.x = 50;
waveTxt.y = 50;
LK.gui.topLeft.addChild(waveTxt);
// Touch controls
game.down = function (x, y, obj) {
// Check if touching the hero using direct coordinate comparison
var heroHalfWidth = hero.width / 2;
var heroHalfHeight = hero.height / 2;
var touchingHero = x >= hero.x - heroHalfWidth && x <= hero.x + heroHalfWidth && y >= hero.y - heroHalfHeight && y <= hero.y + heroHalfHeight;
if (touchingHero) {
// Start continuous firing when touching hero
hero.isFiring = true;
hero.fire(); // Fire immediately
}
// Always allow dragging
dragNode = hero;
hero.x = x;
hero.y = y;
};
game.move = function (x, y, obj) {
if (dragNode) {
// Apply smooth movement with speed multiplier for faster response
var speedMultiplier = 1.5;
var targetX = x;
var targetY = y;
// Calculate direction and apply speed
var deltaX = targetX - dragNode.x;
var deltaY = targetY - dragNode.y;
dragNode.x += deltaX * speedMultiplier;
dragNode.y += deltaY * speedMultiplier;
}
};
game.up = function (x, y, obj) {
dragNode = null;
// Stop continuous firing when touch is released
hero.isFiring = false;
};
// Main game loop
game.update = function () {
// Spawn enemies
spawnTimer++;
if (spawnTimer >= spawnRate && enemiesSpawned < enemiesPerWave) {
spawnTimer = 0;
var enemy;
var enemyType = Math.random();
// Spawn different enemy types based on wave number and random chance
if (waveNumber >= 10 && enemyType < 0.1) {
// Boss enemy (10% chance after wave 10)
enemy = new BossEnemy();
} else if (waveNumber >= 7 && enemyType < 0.25) {
// Spinner enemy (15% chance after wave 7)
enemy = new SpinnerEnemy();
} else if (waveNumber >= 5 && enemyType < 0.4) {
// Zigzag enemy (15% chance after wave 5)
enemy = new ZigzagEnemy();
} else if (waveNumber >= 3 && enemyType < 0.6) {
// Tank enemy (20% chance after wave 3)
enemy = new TankEnemy();
} else if (waveNumber >= 2 && enemyType < 0.8) {
// Fast enemy (20% chance after wave 2)
enemy = new FastEnemy();
} else {
// Basic enemy (always available, 20% chance in later waves)
enemy = new BasicEnemy();
}
enemy.x = Math.random() * (2048 - 200) + 100;
enemy.y = -100;
// Apply wave speed modifier to base speed
enemy.speed = enemy.speed + waveNumber * 0.3;
enemies.push(enemy);
game.addChild(enemy);
enemiesSpawned++;
}
// Update and check bullet collisions
for (var i = heroBullets.length - 1; i >= 0; i--) {
var bullet = heroBullets[i];
// Remove bullets that go off screen
if (bullet.y < -50) {
bullet.destroy();
heroBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Enemy hit - reduce health
enemy.health--;
// Remove bullet
bullet.destroy();
heroBullets.splice(i, 1);
// Create smoke and flame effect on hit
var smokeEffect = LK.getAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x666666,
scaleX: 0.3,
scaleY: 0.3,
alpha: 0.8
});
smokeEffect.x = enemy.x;
smokeEffect.y = enemy.y;
game.addChild(smokeEffect);
var flameEffect = LK.getAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff4400,
scaleX: 0.2,
scaleY: 0.2,
alpha: 1.0
});
flameEffect.x = enemy.x;
flameEffect.y = enemy.y;
game.addChild(flameEffect);
// Animate smoke effect
tween(smokeEffect, {
scaleX: 1.2,
scaleY: 1.2,
alpha: 0,
y: smokeEffect.y - 100
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
smokeEffect.destroy();
}
});
// Animate flame effect
tween(flameEffect, {
scaleX: 0.8,
scaleY: 0.8,
alpha: 0,
rotation: Math.PI * 2
}, {
duration: 400,
easing: tween.easeOut,
onFinish: function onFinish() {
flameEffect.destroy();
}
});
// Play explosion sound
LK.getSound('explosion').play();
// Check if enemy is destroyed
if (enemy.health <= 0) {
LK.setScore(LK.getScore() + enemy.points);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
} else {
// Enemy damaged but not destroyed - flash red
LK.effects.flashObject(enemy, 0xff0000, 200);
}
break;
}
}
}
// Update and check enemy collisions with hero
for (var k = enemies.length - 1; k >= 0; k--) {
var enemy = enemies[k];
// Check if enemy reached hero
if (enemy.intersects(hero)) {
LK.showGameOver();
return;
}
// Remove enemies that go off screen
if (enemy.y > 2732 + 100) {
enemy.destroy();
enemies.splice(k, 1);
}
}
// Check if wave is complete
if (enemies.length === 0 && enemiesSpawned >= enemiesPerWave) {
waveNumber++;
waveTxt.setText('Wave: ' + waveNumber);
enemiesSpawned = 0;
enemiesPerWave = Math.min(5 + waveNumber, 15); // Increase enemies per wave
spawnRate = Math.max(30, 60 - waveNumber * 2); // Decrease spawn rate
// Increase barrels every 5 waves
hero.barrels = Math.floor(waveNumber / 5) + 1;
}
// Generate landscape elements at specific score milestones
var currentScore = LK.getScore();
// Grass at 200 points
if (currentScore >= 200 && lastScoreCheck < 200) {
lastScoreCheck = 200;
for (var gr = 0; gr < 5; gr++) {
var grass = LK.getAsset('grass', {
anchorX: 0.5,
anchorY: 1.0
});
grass.x = Math.random() * 1800 + 124; // Random x position
grass.y = 2732 - 15; // Just above terrain
landscapeElements.push(grass);
game.addChild(grass);
}
}
// Cows at 200 points
if (currentScore >= 200 && lastScoreCheck < 200) {
for (var c = 0; c < 2; c++) {
var cow = LK.getAsset('cow', {
anchorX: 0.5,
anchorY: 1.0
});
cow.x = Math.random() * 1600 + 224; // Random x position with more margin
cow.y = 2732 - 40; // Above ground level
landscapeElements.push(cow);
game.addChild(cow);
}
}
// Sheep at 300 points
if (currentScore >= 300 && lastScoreCheck < 300) {
lastScoreCheck = 300;
for (var s = 0; s < 3; s++) {
var sheep = LK.getAsset('sheep', {
anchorX: 0.5,
anchorY: 1.0
});
sheep.x = Math.random() * 1600 + 224; // Random x position with more margin
sheep.y = 2732 - 35; // Above ground level
landscapeElements.push(sheep);
game.addChild(sheep);
}
}
// Flying birds at 400 points
if (currentScore >= 400 && lastScoreCheck < 400) {
lastScoreCheck = 400;
for (var b = 0; b < 3; b++) {
var bird = new FlyingBird();
bird.x = -50; // Start from left edge
bird.y = Math.random() * 400 + 200; // Random height in upper area
landscapeElements.push(bird);
game.addChild(bird);
}
}
// Trees at 500 points
if (currentScore >= 500 && lastScoreCheck < 500) {
lastScoreCheck = 500;
for (var t = 0; t < 2; t++) {
var tree = LK.getAsset('tree', {
anchorX: 0.5,
anchorY: 1.0
});
tree.x = Math.random() * 1800 + 124; // Random x position
tree.y = 2732 - 60; // Above ground level
landscapeElements.push(tree);
game.addChild(tree);
}
}
// Clean up birds that have flown off screen
for (var bird_i = landscapeElements.length - 1; bird_i >= 0; bird_i--) {
var element = landscapeElements[bird_i];
if (element.speedX && element.x > 2100) {
element.destroy();
landscapeElements.splice(bird_i, 1);
}
}
};
// Start background music
LK.playMusic('1a439');
uzay aracı olsun . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
ahtapot şekilli canavar olsun. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
uzay aracı olsun . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
sky
ağaç. In-Game asset. 2d. High contrast. No shadows
çimen uzun. In-Game asset. 2d. High contrast. No shadows
koyun beyaz. In-Game asset. 2d. High contrast. No shadows
inek kahverengi beyaz.. In-Game asset. 2d. High contrast. No shadows