/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var EnemyAircraft = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('enemyAircraft', { anchorX: 0.5, anchorY: 0.5 }); // Set speed based on selected level if (selectedLevel === 1) { self.speed = 2 + Math.random() * 2; // Easy: 2-4 } else if (selectedLevel === 2) { self.speed = 4 + Math.random() * 4; // Normal: 4-8 } else { self.speed = 6 + Math.random() * 6; // Hard: 6-12 } self.movePattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: sine wave self.startX = 0; // Set fire rate based on selected level if (selectedLevel === 1) { self.fireRate = 60 + Math.random() * 60; // Easy: 60-120 ticks } else if (selectedLevel === 2) { self.fireRate = 30 + Math.random() * 30; // Normal: 30-60 ticks } else { self.fireRate = 15 + Math.random() * 30; // Hard: 15-45 ticks } self.lastFire = 0; self.update = function () { // Movement patterns if (self.movePattern === 0) { // Straight down self.y += self.speed; } else if (self.movePattern === 1) { // Zigzag pattern self.y += self.speed; self.x = self.startX + Math.sin(self.y * 0.01) * 100; } else if (self.movePattern === 2) { // Sine wave pattern self.y += self.speed; self.x = self.startX + Math.sin(self.y * 0.02) * 150; } // Fire bullets occasionally if (LK.ticks - self.lastFire >= self.fireRate) { self.fireBullet(); self.lastFire = LK.ticks; self.fireRate = 60 + Math.random() * 60; // Randomize next fire time } }; self.fireBullet = function () { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 40; enemyBullets.push(bullet); game.addChild(bullet); }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); // Set bullet speed based on selected level if (selectedLevel === 1) { self.speed = 4; // Easy } else if (selectedLevel === 2) { self.speed = 6; // Normal } else { self.speed = 8; // Hard } self.update = function () { self.y += self.speed; }; return self; }); var PlayerAircraft = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('playerAircraft', { anchorX: 0.5, anchorY: 0.5 }); self.health = 1; self.fireRate = 15; // Fire every 15 ticks self.lastFire = 0; self.bulletCount = 1; self.bulletScale = 1; self.update = function () { // Auto-fire bullets if (LK.ticks - self.lastFire >= self.fireRate) { self.fireBullet(); self.lastFire = LK.ticks; } }; self.fireBullet = function () { if (self.bulletCount === 1) { var bullet = new PlayerBullet(); bullet.x = self.x; bullet.y = self.y - 50; bullet.scaleX = self.bulletScale; bullet.scaleY = self.bulletScale; playerBullets.push(bullet); game.addChild(bullet); } else if (self.bulletCount === 2) { for (var i = 0; i < 2; i++) { var bullet = new PlayerBullet(); bullet.x = self.x + (i === 0 ? -30 : 30); bullet.y = self.y - 50; bullet.scaleX = self.bulletScale; bullet.scaleY = self.bulletScale; playerBullets.push(bullet); game.addChild(bullet); } } else { for (var i = 0; i < 3; i++) { var bullet = new PlayerBullet(); bullet.x = self.x + (i === 0 ? -40 : i === 1 ? 0 : 40); bullet.y = self.y - 50; bullet.scaleX = self.bulletScale; bullet.scaleY = self.bulletScale; playerBullets.push(bullet); game.addChild(bullet); } } LK.getSound('shoot').play(); }; return self; }); var PlayerBullet = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.update = function () { self.y += self.speed; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3; self.rotationSpeed = 0.1; self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; }; return self; }); var Star = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('star', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1 + Math.random() * 3; self.twinkleSpeed = 0.02 + Math.random() * 0.03; self.baseAlpha = 0.3 + Math.random() * 0.7; self.update = function () { self.y += self.speed; // Twinkling effect graphics.alpha = self.baseAlpha + Math.sin(LK.ticks * self.twinkleSpeed) * 0.3; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000011 }); /**** * Game Code ****/ // Game state var gameState = 'menu'; // 'menu', 'levelSelect', 'playing', 'gameOver' var menuContainer; var levelSelectContainer; var titleText; var startButton; var instructionsText; var selectedLevel = 1; var levelButtons = []; // Game variables var player; var enemies = []; var playerBullets = []; var enemyBullets = []; var powerUps = []; var stars = []; var enemySpawnRate = 80; // Reduced from 120 to 80 ticks for faster spawning var powerUpSpawnRate = 900; // Increased from 600 to 900 ticks to make power-ups more rare var difficultyTimer = 0; var dragNode = null; var playerLevel = 1; var playerLives = 3; // Create start menu menuContainer = new Container(); game.addChild(menuContainer); // Title titleText = new Text2('SPACE FIGHTER', { size: 120, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 800; menuContainer.addChild(titleText); // Start button (using power-up asset as button) startButton = LK.getAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); startButton.x = 1024; startButton.y = 1400; startButton.scaleX = 1.5; startButton.scaleY = 1.5; menuContainer.addChild(startButton); // Credit text var creditText = new Text2('by Muhammed Fatih Özdemir', { size: 50, fill: 0xCCCCCC }); creditText.anchor.set(0.5, 0.5); creditText.x = 1024; creditText.y = 950; menuContainer.addChild(creditText); // Create level selection menu levelSelectContainer = new Container(); game.addChild(levelSelectContainer); levelSelectContainer.visible = false; // Level select title var levelSelectTitle = new Text2('SELECT LEVEL', { size: 100, fill: 0xFFFFFF }); levelSelectTitle.anchor.set(0.5, 0.5); levelSelectTitle.x = 1024; levelSelectTitle.y = 600; levelSelectContainer.addChild(levelSelectTitle); // Level buttons var levelNames = ['EASY', 'NORMAL', 'HARD']; var levelDifficulties = ['Kolay', 'Orta', 'Zor']; var levelColors = [0x00FF00, 0xFFFF00, 0xFF0000]; for (var l = 0; l < 3; l++) { var levelButton = new Container(); // Button background var buttonBg = LK.getAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); buttonBg.tint = levelColors[l]; buttonBg.scaleX = 1.5; buttonBg.scaleY = 1.5; levelButton.addChild(buttonBg); // Level name text var buttonText = new Text2(levelNames[l], { size: 60, fill: 0x000000 }); buttonText.anchor.set(0.5, 0.5); buttonText.x = -80; levelButton.addChild(buttonText); // Difficulty text in purple var difficultyText = new Text2(levelDifficulties[l], { size: 60, fill: 0x9932CC }); difficultyText.anchor.set(0.5, 0.5); difficultyText.x = 80; levelButton.addChild(difficultyText); levelButton.x = 1024; levelButton.y = 1000 + l * 300; levelButton.levelIndex = l + 1; levelButton.difficultyText = difficultyText; levelButtons.push(levelButton); levelSelectContainer.addChild(levelButton); } // Back button for level select var backButton = new Text2('BACK', { size: 60, fill: 0xCCCCCC }); backButton.anchor.set(0.5, 0.5); backButton.x = 1024; backButton.y = 2200; levelSelectContainer.addChild(backButton); // Instructions instructionsText = new Text2('TAP TO SELECT LEVEL\n\nDrag to move your ship\nCollect power-ups\nAvoid enemies', { size: 60, fill: 0xAAAAFF }); instructionsText.anchor.set(0.5, 0.5); instructionsText.x = 1024; instructionsText.y = 1800; menuContainer.addChild(instructionsText); // UI Setup var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); scoreTxt.visible = false; // Hide initially var hearts = []; for (var h = 0; h < 3; h++) { var heart = LK.getAsset('heart', { anchorX: 0.5, anchorY: 0.5 }); heart.x = 150 + h * 80; heart.y = 60; heart.visible = false; // Hide initially hearts.push(heart); LK.gui.topLeft.addChild(heart); } // Initialize player (but don't add to game yet) player = new PlayerAircraft(); player.x = 1024; // Center horizontally player.y = 2400; // Near bottom of screen // Start background music immediately when game loads LK.playMusic('Uiacatminecraft', { volume: 0.5, loop: true }); // Function to start the game function startGame() { gameState = 'playing'; menuContainer.visible = false; levelSelectContainer.visible = false; scoreTxt.visible = true; // Show hearts for (var h = 0; h < hearts.length; h++) { hearts[h].visible = true; } // Add player to game game.addChild(player); // Reset game variables LK.setScore(0); scoreTxt.setText('Score: 0'); playerLives = 3; playerLevel = 1; difficultyTimer = 0; // Set difficulty based on selected level if (selectedLevel === 1) { // Easy enemySpawnRate = 120; powerUpSpawnRate = 600; } else if (selectedLevel === 2) { // Normal enemySpawnRate = 80; powerUpSpawnRate = 900; } else { // Hard enemySpawnRate = 50; powerUpSpawnRate = 1200; } // Reset player player.scaleX = 1; player.scaleY = 1; player.bulletCount = 1; player.bulletScale = 1; player.fireRate = 15; player.x = 1024; player.y = 2400; // Start background music with proper settings LK.playMusic('Uiacatminecraft', { volume: 0.5, loop: true }); } // Function to show level select function showLevelSelect() { gameState = 'levelSelect'; menuContainer.visible = false; levelSelectContainer.visible = true; } // Function to go back to main menu function showMainMenu() { gameState = 'menu'; menuContainer.visible = true; levelSelectContainer.visible = false; } // Game input handlers game.down = function (x, y, obj) { if (gameState === 'menu') { // Check if clicked on start button or anywhere to start level select showLevelSelect(); return; } if (gameState === 'levelSelect') { // Check level button clicks for (var i = 0; i < levelButtons.length; i++) { var button = levelButtons[i]; // Simple distance-based click detection var buttonY = 1000 + i * 300; if (Math.abs(x - 1024) < 150 && Math.abs(y - buttonY) < 100) { selectedLevel = button.levelIndex; // Quick feedback animation tween(button, { scaleX: 1.8, scaleY: 1.8 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(button, { scaleX: 1.5, scaleY: 1.5 }, { duration: 100, easing: tween.easeIn, onFinish: function onFinish() { startGame(); } }); } }); return; } } // Check back button click if (Math.abs(x - 1024) < 100 && Math.abs(y - 2200) < 50) { showMainMenu(); } return; } if (gameState === 'playing') { dragNode = player; player.x = x; player.y = y; } }; game.move = function (x, y, obj) { if (gameState === 'playing' && dragNode) { dragNode.x = Math.max(60, Math.min(1988, x)); // Keep within screen bounds dragNode.y = Math.max(200, Math.min(2600, y)); // Keep within reasonable bounds } }; game.up = function (x, y, obj) { if (gameState === 'playing') { dragNode = null; } }; // Spawn enemy aircraft function spawnEnemy() { var enemy = new EnemyAircraft(); enemy.x = 200 + Math.random() * 1648; // Random x position enemy.y = -50; // Start above screen enemy.startX = enemy.x; enemies.push(enemy); game.addChild(enemy); } // Spawn power-up function spawnPowerUp() { var powerUp = new PowerUp(); powerUp.x = 200 + Math.random() * 1648; powerUp.y = -50; powerUps.push(powerUp); game.addChild(powerUp); } // Spawn background elements function spawnStar() { var star = new Star(); star.x = Math.random() * 2048; star.y = -20; stars.push(star); game.addChild(star); } // Main game update loop game.update = function () { // Menu state updates if (gameState === 'menu') { // Animate title color change every second (60 ticks) if (LK.ticks % 60 === 0) { var colors = [0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF]; var randomColor = colors[Math.floor(Math.random() * colors.length)]; titleText.tint = randomColor; } // Animate start button startButton.rotation += 0.05; startButton.scaleX = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2; startButton.scaleY = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2; // Spawn background stars even in menu if (LK.ticks % 20 === 0) { spawnStar(); } // Update stars for (var i = stars.length - 1; i >= 0; i--) { var star = stars[i]; if (star.lastY === undefined) star.lastY = star.y; if (star.lastY <= 2762 && star.y > 2762) { star.destroy(); stars.splice(i, 1); continue; } star.lastY = star.y; } return; } // Level select state updates if (gameState === 'levelSelect') { // Animate level buttons for (var i = 0; i < levelButtons.length; i++) { var button = levelButtons[i]; // Only rotate the button background, not the text button.children[0].rotation += 0.02; button.scaleX = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1; button.scaleY = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1; } // Spawn background stars in level select if (LK.ticks % 20 === 0) { spawnStar(); } // Update stars for (var i = stars.length - 1; i >= 0; i--) { var star = stars[i]; if (star.lastY === undefined) star.lastY = star.y; if (star.lastY <= 2762 && star.y > 2762) { star.destroy(); stars.splice(i, 1); continue; } star.lastY = star.y; } return; } // Only run game logic when playing if (gameState !== 'playing') return; difficultyTimer++; // Increase difficulty over time if (difficultyTimer % 900 === 0) { // Every 15 seconds (reduced from 30) enemySpawnRate = Math.max(20, enemySpawnRate - 15); // More aggressive reduction } // Spawn enemies - sometimes spawn multiple at once if (LK.ticks % enemySpawnRate === 0) { spawnEnemy(); // 30% chance to spawn a second enemy if (Math.random() < 0.3) { spawnEnemy(); } // 10% chance for a third enemy after score 500 if (LK.getScore() > 500 && Math.random() < 0.1) { spawnEnemy(); } } // Spawn power-ups if (LK.ticks % powerUpSpawnRate === 0) { spawnPowerUp(); } // Spawn background elements if (LK.ticks % 20 === 0) { spawnStar(); } // 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 enemies var hitEnemy = false; for (var e = enemies.length - 1; e >= 0; e--) { if (bullet.intersects(enemies[e])) { LK.setScore(LK.getScore() + 100); scoreTxt.setText('Score: ' + LK.getScore()); // Flash effect on enemy hit LK.effects.flashObject(enemies[e], 0xFFFFFF, 200); LK.getSound('enemyHit').play(); enemies[e].destroy(); enemies.splice(e, 1); bullet.destroy(); playerBullets.splice(i, 1); hitEnemy = true; break; } } if (hitEnemy) continue; 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 <= 2762 && bullet.y > 2762) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check collision with player if (bullet.intersects(player)) { playerLives--; // Remove a heart with tween animation if (hearts.length > 0) { var heartToRemove = hearts.pop(); tween(heartToRemove, { alpha: 0, scaleX: 0, scaleY: 0 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { heartToRemove.destroy(); } }); } LK.effects.flashObject(player, 0xFF0000, 500); bullet.destroy(); enemyBullets.splice(i, 1); if (playerLives <= 0) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } continue; } 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 <= 2762 && enemy.y > 2762) { enemy.destroy(); enemies.splice(i, 1); continue; } // Check collision with player if (enemy.intersects(player)) { playerLives--; // Remove a heart with tween animation if (hearts.length > 0) { var heartToRemove = hearts.pop(); tween(heartToRemove, { alpha: 0, scaleX: 0, scaleY: 0 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { heartToRemove.destroy(); } }); } LK.effects.flashObject(player, 0xFF0000, 500); enemy.destroy(); enemies.splice(i, 1); if (playerLives <= 0) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } continue; } enemy.lastY = enemy.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 <= 2762 && powerUp.y > 2762) { powerUp.destroy(); powerUps.splice(i, 1); continue; } // Check collision with player if (powerUp.intersects(player)) { LK.setScore(LK.getScore() + 50); scoreTxt.setText('Score: ' + LK.getScore()); // Level up player playerLevel++; // Add one life playerLives++; // Create new heart var newHeart = LK.getAsset('heart', { anchorX: 0.5, anchorY: 0.5 }); newHeart.x = 150 + hearts.length * 80; newHeart.y = 60; newHeart.alpha = 0; newHeart.scaleX = 0; newHeart.scaleY = 0; hearts.push(newHeart); LK.gui.topLeft.addChild(newHeart); // Animate new heart appearing tween(newHeart, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeOut }); // Scale up player aircraft tween(player, { scaleX: 1 + (playerLevel - 1) * 0.2, scaleY: 1 + (playerLevel - 1) * 0.2 }, { duration: 500, easing: tween.easeOut }); // Increase bullet count if (playerLevel === 2) { player.bulletCount = 2; } else if (playerLevel >= 3) { player.bulletCount = 3; } // Scale bullets player.bulletScale = 1 + (playerLevel - 1) * 0.3; // Reduce player fire rate for power-up effect player.fireRate = Math.max(5, player.fireRate - 2); LK.getSound('powerUpCollect').play(); LK.effects.flashObject(player, 0x00FF00, 500); powerUp.destroy(); powerUps.splice(i, 1); continue; } powerUp.lastY = powerUp.y; } // Update and clean up stars for (var i = stars.length - 1; i >= 0; i--) { var star = stars[i]; if (star.lastY === undefined) star.lastY = star.y; if (star.lastY <= 2762 && star.y > 2762) { star.destroy(); stars.splice(i, 1); continue; } star.lastY = star.y; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var EnemyAircraft = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemyAircraft', {
anchorX: 0.5,
anchorY: 0.5
});
// Set speed based on selected level
if (selectedLevel === 1) {
self.speed = 2 + Math.random() * 2; // Easy: 2-4
} else if (selectedLevel === 2) {
self.speed = 4 + Math.random() * 4; // Normal: 4-8
} else {
self.speed = 6 + Math.random() * 6; // Hard: 6-12
}
self.movePattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: sine wave
self.startX = 0;
// Set fire rate based on selected level
if (selectedLevel === 1) {
self.fireRate = 60 + Math.random() * 60; // Easy: 60-120 ticks
} else if (selectedLevel === 2) {
self.fireRate = 30 + Math.random() * 30; // Normal: 30-60 ticks
} else {
self.fireRate = 15 + Math.random() * 30; // Hard: 15-45 ticks
}
self.lastFire = 0;
self.update = function () {
// Movement patterns
if (self.movePattern === 0) {
// Straight down
self.y += self.speed;
} else if (self.movePattern === 1) {
// Zigzag pattern
self.y += self.speed;
self.x = self.startX + Math.sin(self.y * 0.01) * 100;
} else if (self.movePattern === 2) {
// Sine wave pattern
self.y += self.speed;
self.x = self.startX + Math.sin(self.y * 0.02) * 150;
}
// Fire bullets occasionally
if (LK.ticks - self.lastFire >= self.fireRate) {
self.fireBullet();
self.lastFire = LK.ticks;
self.fireRate = 60 + Math.random() * 60; // Randomize next fire time
}
};
self.fireBullet = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 40;
enemyBullets.push(bullet);
game.addChild(bullet);
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Set bullet speed based on selected level
if (selectedLevel === 1) {
self.speed = 4; // Easy
} else if (selectedLevel === 2) {
self.speed = 6; // Normal
} else {
self.speed = 8; // Hard
}
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerAircraft = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('playerAircraft', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 1;
self.fireRate = 15; // Fire every 15 ticks
self.lastFire = 0;
self.bulletCount = 1;
self.bulletScale = 1;
self.update = function () {
// Auto-fire bullets
if (LK.ticks - self.lastFire >= self.fireRate) {
self.fireBullet();
self.lastFire = LK.ticks;
}
};
self.fireBullet = function () {
if (self.bulletCount === 1) {
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
bullet.scaleX = self.bulletScale;
bullet.scaleY = self.bulletScale;
playerBullets.push(bullet);
game.addChild(bullet);
} else if (self.bulletCount === 2) {
for (var i = 0; i < 2; i++) {
var bullet = new PlayerBullet();
bullet.x = self.x + (i === 0 ? -30 : 30);
bullet.y = self.y - 50;
bullet.scaleX = self.bulletScale;
bullet.scaleY = self.bulletScale;
playerBullets.push(bullet);
game.addChild(bullet);
}
} else {
for (var i = 0; i < 3; i++) {
var bullet = new PlayerBullet();
bullet.x = self.x + (i === 0 ? -40 : i === 1 ? 0 : 40);
bullet.y = self.y - 50;
bullet.scaleX = self.bulletScale;
bullet.scaleY = self.bulletScale;
playerBullets.push(bullet);
game.addChild(bullet);
}
}
LK.getSound('shoot').play();
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.rotationSpeed = 0.1;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1 + Math.random() * 3;
self.twinkleSpeed = 0.02 + Math.random() * 0.03;
self.baseAlpha = 0.3 + Math.random() * 0.7;
self.update = function () {
self.y += self.speed;
// Twinkling effect
graphics.alpha = self.baseAlpha + Math.sin(LK.ticks * self.twinkleSpeed) * 0.3;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
// Game state
var gameState = 'menu'; // 'menu', 'levelSelect', 'playing', 'gameOver'
var menuContainer;
var levelSelectContainer;
var titleText;
var startButton;
var instructionsText;
var selectedLevel = 1;
var levelButtons = [];
// Game variables
var player;
var enemies = [];
var playerBullets = [];
var enemyBullets = [];
var powerUps = [];
var stars = [];
var enemySpawnRate = 80; // Reduced from 120 to 80 ticks for faster spawning
var powerUpSpawnRate = 900; // Increased from 600 to 900 ticks to make power-ups more rare
var difficultyTimer = 0;
var dragNode = null;
var playerLevel = 1;
var playerLives = 3;
// Create start menu
menuContainer = new Container();
game.addChild(menuContainer);
// Title
titleText = new Text2('SPACE FIGHTER', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
menuContainer.addChild(titleText);
// Start button (using power-up asset as button)
startButton = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
startButton.x = 1024;
startButton.y = 1400;
startButton.scaleX = 1.5;
startButton.scaleY = 1.5;
menuContainer.addChild(startButton);
// Credit text
var creditText = new Text2('by Muhammed Fatih Özdemir', {
size: 50,
fill: 0xCCCCCC
});
creditText.anchor.set(0.5, 0.5);
creditText.x = 1024;
creditText.y = 950;
menuContainer.addChild(creditText);
// Create level selection menu
levelSelectContainer = new Container();
game.addChild(levelSelectContainer);
levelSelectContainer.visible = false;
// Level select title
var levelSelectTitle = new Text2('SELECT LEVEL', {
size: 100,
fill: 0xFFFFFF
});
levelSelectTitle.anchor.set(0.5, 0.5);
levelSelectTitle.x = 1024;
levelSelectTitle.y = 600;
levelSelectContainer.addChild(levelSelectTitle);
// Level buttons
var levelNames = ['EASY', 'NORMAL', 'HARD'];
var levelDifficulties = ['Kolay', 'Orta', 'Zor'];
var levelColors = [0x00FF00, 0xFFFF00, 0xFF0000];
for (var l = 0; l < 3; l++) {
var levelButton = new Container();
// Button background
var buttonBg = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
buttonBg.tint = levelColors[l];
buttonBg.scaleX = 1.5;
buttonBg.scaleY = 1.5;
levelButton.addChild(buttonBg);
// Level name text
var buttonText = new Text2(levelNames[l], {
size: 60,
fill: 0x000000
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = -80;
levelButton.addChild(buttonText);
// Difficulty text in purple
var difficultyText = new Text2(levelDifficulties[l], {
size: 60,
fill: 0x9932CC
});
difficultyText.anchor.set(0.5, 0.5);
difficultyText.x = 80;
levelButton.addChild(difficultyText);
levelButton.x = 1024;
levelButton.y = 1000 + l * 300;
levelButton.levelIndex = l + 1;
levelButton.difficultyText = difficultyText;
levelButtons.push(levelButton);
levelSelectContainer.addChild(levelButton);
}
// Back button for level select
var backButton = new Text2('BACK', {
size: 60,
fill: 0xCCCCCC
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 1024;
backButton.y = 2200;
levelSelectContainer.addChild(backButton);
// Instructions
instructionsText = new Text2('TAP TO SELECT LEVEL\n\nDrag to move your ship\nCollect power-ups\nAvoid enemies', {
size: 60,
fill: 0xAAAAFF
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1800;
menuContainer.addChild(instructionsText);
// UI Setup
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.visible = false; // Hide initially
var hearts = [];
for (var h = 0; h < 3; h++) {
var heart = LK.getAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
heart.x = 150 + h * 80;
heart.y = 60;
heart.visible = false; // Hide initially
hearts.push(heart);
LK.gui.topLeft.addChild(heart);
}
// Initialize player (but don't add to game yet)
player = new PlayerAircraft();
player.x = 1024; // Center horizontally
player.y = 2400; // Near bottom of screen
// Start background music immediately when game loads
LK.playMusic('Uiacatminecraft', {
volume: 0.5,
loop: true
});
// Function to start the game
function startGame() {
gameState = 'playing';
menuContainer.visible = false;
levelSelectContainer.visible = false;
scoreTxt.visible = true;
// Show hearts
for (var h = 0; h < hearts.length; h++) {
hearts[h].visible = true;
}
// Add player to game
game.addChild(player);
// Reset game variables
LK.setScore(0);
scoreTxt.setText('Score: 0');
playerLives = 3;
playerLevel = 1;
difficultyTimer = 0;
// Set difficulty based on selected level
if (selectedLevel === 1) {
// Easy
enemySpawnRate = 120;
powerUpSpawnRate = 600;
} else if (selectedLevel === 2) {
// Normal
enemySpawnRate = 80;
powerUpSpawnRate = 900;
} else {
// Hard
enemySpawnRate = 50;
powerUpSpawnRate = 1200;
}
// Reset player
player.scaleX = 1;
player.scaleY = 1;
player.bulletCount = 1;
player.bulletScale = 1;
player.fireRate = 15;
player.x = 1024;
player.y = 2400;
// Start background music with proper settings
LK.playMusic('Uiacatminecraft', {
volume: 0.5,
loop: true
});
}
// Function to show level select
function showLevelSelect() {
gameState = 'levelSelect';
menuContainer.visible = false;
levelSelectContainer.visible = true;
}
// Function to go back to main menu
function showMainMenu() {
gameState = 'menu';
menuContainer.visible = true;
levelSelectContainer.visible = false;
}
// Game input handlers
game.down = function (x, y, obj) {
if (gameState === 'menu') {
// Check if clicked on start button or anywhere to start level select
showLevelSelect();
return;
}
if (gameState === 'levelSelect') {
// Check level button clicks
for (var i = 0; i < levelButtons.length; i++) {
var button = levelButtons[i];
// Simple distance-based click detection
var buttonY = 1000 + i * 300;
if (Math.abs(x - 1024) < 150 && Math.abs(y - buttonY) < 100) {
selectedLevel = button.levelIndex;
// Quick feedback animation
tween(button, {
scaleX: 1.8,
scaleY: 1.8
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(button, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 100,
easing: tween.easeIn,
onFinish: function onFinish() {
startGame();
}
});
}
});
return;
}
}
// Check back button click
if (Math.abs(x - 1024) < 100 && Math.abs(y - 2200) < 50) {
showMainMenu();
}
return;
}
if (gameState === 'playing') {
dragNode = player;
player.x = x;
player.y = y;
}
};
game.move = function (x, y, obj) {
if (gameState === 'playing' && dragNode) {
dragNode.x = Math.max(60, Math.min(1988, x)); // Keep within screen bounds
dragNode.y = Math.max(200, Math.min(2600, y)); // Keep within reasonable bounds
}
};
game.up = function (x, y, obj) {
if (gameState === 'playing') {
dragNode = null;
}
};
// Spawn enemy aircraft
function spawnEnemy() {
var enemy = new EnemyAircraft();
enemy.x = 200 + Math.random() * 1648; // Random x position
enemy.y = -50; // Start above screen
enemy.startX = enemy.x;
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn power-up
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = 200 + Math.random() * 1648;
powerUp.y = -50;
powerUps.push(powerUp);
game.addChild(powerUp);
}
// Spawn background elements
function spawnStar() {
var star = new Star();
star.x = Math.random() * 2048;
star.y = -20;
stars.push(star);
game.addChild(star);
}
// Main game update loop
game.update = function () {
// Menu state updates
if (gameState === 'menu') {
// Animate title color change every second (60 ticks)
if (LK.ticks % 60 === 0) {
var colors = [0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF];
var randomColor = colors[Math.floor(Math.random() * colors.length)];
titleText.tint = randomColor;
}
// Animate start button
startButton.rotation += 0.05;
startButton.scaleX = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2;
startButton.scaleY = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2;
// Spawn background stars even in menu
if (LK.ticks % 20 === 0) {
spawnStar();
}
// Update stars
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
if (star.lastY === undefined) star.lastY = star.y;
if (star.lastY <= 2762 && star.y > 2762) {
star.destroy();
stars.splice(i, 1);
continue;
}
star.lastY = star.y;
}
return;
}
// Level select state updates
if (gameState === 'levelSelect') {
// Animate level buttons
for (var i = 0; i < levelButtons.length; i++) {
var button = levelButtons[i];
// Only rotate the button background, not the text
button.children[0].rotation += 0.02;
button.scaleX = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1;
button.scaleY = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1;
}
// Spawn background stars in level select
if (LK.ticks % 20 === 0) {
spawnStar();
}
// Update stars
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
if (star.lastY === undefined) star.lastY = star.y;
if (star.lastY <= 2762 && star.y > 2762) {
star.destroy();
stars.splice(i, 1);
continue;
}
star.lastY = star.y;
}
return;
}
// Only run game logic when playing
if (gameState !== 'playing') return;
difficultyTimer++;
// Increase difficulty over time
if (difficultyTimer % 900 === 0) {
// Every 15 seconds (reduced from 30)
enemySpawnRate = Math.max(20, enemySpawnRate - 15); // More aggressive reduction
}
// Spawn enemies - sometimes spawn multiple at once
if (LK.ticks % enemySpawnRate === 0) {
spawnEnemy();
// 30% chance to spawn a second enemy
if (Math.random() < 0.3) {
spawnEnemy();
}
// 10% chance for a third enemy after score 500
if (LK.getScore() > 500 && Math.random() < 0.1) {
spawnEnemy();
}
}
// Spawn power-ups
if (LK.ticks % powerUpSpawnRate === 0) {
spawnPowerUp();
}
// Spawn background elements
if (LK.ticks % 20 === 0) {
spawnStar();
}
// 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 enemies
var hitEnemy = false;
for (var e = enemies.length - 1; e >= 0; e--) {
if (bullet.intersects(enemies[e])) {
LK.setScore(LK.getScore() + 100);
scoreTxt.setText('Score: ' + LK.getScore());
// Flash effect on enemy hit
LK.effects.flashObject(enemies[e], 0xFFFFFF, 200);
LK.getSound('enemyHit').play();
enemies[e].destroy();
enemies.splice(e, 1);
bullet.destroy();
playerBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (hitEnemy) continue;
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 <= 2762 && bullet.y > 2762) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
playerLives--;
// Remove a heart with tween animation
if (hearts.length > 0) {
var heartToRemove = hearts.pop();
tween(heartToRemove, {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 300,
easing: tween.easeIn,
onFinish: function onFinish() {
heartToRemove.destroy();
}
});
}
LK.effects.flashObject(player, 0xFF0000, 500);
bullet.destroy();
enemyBullets.splice(i, 1);
if (playerLives <= 0) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
continue;
}
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 <= 2762 && enemy.y > 2762) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
playerLives--;
// Remove a heart with tween animation
if (hearts.length > 0) {
var heartToRemove = hearts.pop();
tween(heartToRemove, {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 300,
easing: tween.easeIn,
onFinish: function onFinish() {
heartToRemove.destroy();
}
});
}
LK.effects.flashObject(player, 0xFF0000, 500);
enemy.destroy();
enemies.splice(i, 1);
if (playerLives <= 0) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
continue;
}
enemy.lastY = enemy.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 <= 2762 && powerUp.y > 2762) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
// Check collision with player
if (powerUp.intersects(player)) {
LK.setScore(LK.getScore() + 50);
scoreTxt.setText('Score: ' + LK.getScore());
// Level up player
playerLevel++;
// Add one life
playerLives++;
// Create new heart
var newHeart = LK.getAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
newHeart.x = 150 + hearts.length * 80;
newHeart.y = 60;
newHeart.alpha = 0;
newHeart.scaleX = 0;
newHeart.scaleY = 0;
hearts.push(newHeart);
LK.gui.topLeft.addChild(newHeart);
// Animate new heart appearing
tween(newHeart, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeOut
});
// Scale up player aircraft
tween(player, {
scaleX: 1 + (playerLevel - 1) * 0.2,
scaleY: 1 + (playerLevel - 1) * 0.2
}, {
duration: 500,
easing: tween.easeOut
});
// Increase bullet count
if (playerLevel === 2) {
player.bulletCount = 2;
} else if (playerLevel >= 3) {
player.bulletCount = 3;
}
// Scale bullets
player.bulletScale = 1 + (playerLevel - 1) * 0.3;
// Reduce player fire rate for power-up effect
player.fireRate = Math.max(5, player.fireRate - 2);
LK.getSound('powerUpCollect').play();
LK.effects.flashObject(player, 0x00FF00, 500);
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
powerUp.lastY = powerUp.y;
}
// Update and clean up stars
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
if (star.lastY === undefined) star.lastY = star.y;
if (star.lastY <= 2762 && star.y > 2762) {
star.destroy();
stars.splice(i, 1);
continue;
}
star.lastY = star.y;
}
};
2D Düz bir savaş uçağı. In-Game asset. 2d. High contrast. No shadows
Lazer Işını Mermisi Düz In-Game asset. 2d. High contrast. No shadows
Power Up Simgesi. In-Game asset. 2d. High contrast. No shadows
Enemy Plane. In-Game asset. 2d. High contrast. No shadows
Piksel Kalp Resmi. In-Game asset. 2d. High contrast. No shadows