User prompt
oyuna başlar başlamaz müzik çalsın
User prompt
ses yok bu seferde ve yanlarınde level seviyeleri yazsın mor renkle ve dönmesinler level seviyesi yazıları
User prompt
select level kısmında levellerin zorlukları üstlerinde değil yanlarında yazsın
User prompt
tıklayınca bir şey olmuyor level seçtiğimizde
User prompt
oyunda level sistemi olsun ve 3 level olsun 1. level kolay 2. level orta 3. level zor olsun ve leveller için ayrı birmenü olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
ses yok bu arada ve Uiacatminecraft assetlere ben ekledim yani sende gözükür
User prompt
arka plana Uiacatminecraft adlı sesi ekle
User prompt
aşağıyada 'by Muhammed Fatih Özdemir' yaz
User prompt
Her power upta 1 can daha kazanalım ve oyunun başlangıcındaki SPACE FIGHTER yazısı dönmesin sabit kalsın ama her saniye renk değiştirsin. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Oyuna bir başlangıç menüsü ekle
User prompt
planet ve nebula özelliğini sil
User prompt
Oyuna uzay temalı bir arka plan ekle
User prompt
Lives diye yazma 3 kalp simgesi olsun canımız azaldığında onlardan biri yok olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Power Up ları aldıkça uçak büyüsün ve daha çok mermi ve daha büyük mermi atmaya başlasın ve3 can hakkımız olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Oyunu daha zorlaştır
Code edit (1 edits merged)
Please save this source code
User prompt
Sky Fighter - Aerial Combat Adventure
Initial prompt
Bir uçak oyunu yapacağım bana yardımcı olurmusun?
/****
* 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 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);
// Button text
var buttonText = new Text2(levelNames[l], {
size: 60,
fill: 0x000000
});
buttonText.anchor.set(0.5, 0.5);
levelButton.addChild(buttonText);
levelButton.x = 1024;
levelButton.y = 1000 + l * 300;
levelButton.levelIndex = l + 1;
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
// 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.3,
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];
var bounds = button.getBounds();
if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
selectedLevel = button.levelIndex;
// Animate button selection
tween(button, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut
});
tween(button, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200,
easing: tween.easeIn
});
startGame();
return;
}
}
// Check back button click
if (y >= 2150 && y <= 2250) {
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];
button.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;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -11,12 +11,26 @@
var graphics = self.attachAsset('enemyAircraft', {
anchorX: 0.5,
anchorY: 0.5
});
- self.speed = 4 + Math.random() * 4; // Increased from 2-5 to 4-8
+ // 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;
- self.fireRate = 30 + Math.random() * 30; // Increased fire rate from 60-120 to 30-60 ticks
+ // 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) {
@@ -52,9 +66,16 @@
var graphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
- self.speed = 6; // Increased from 4 to 6
+ // 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;
@@ -164,13 +185,16 @@
/****
* Game Code
****/
// Game state
-var gameState = 'menu'; // 'menu', 'playing', 'gameOver'
+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 = [];
@@ -213,10 +237,59 @@
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 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);
+ // Button text
+ var buttonText = new Text2(levelNames[l], {
+ size: 60,
+ fill: 0x000000
+ });
+ buttonText.anchor.set(0.5, 0.5);
+ levelButton.addChild(buttonText);
+ levelButton.x = 1024;
+ levelButton.y = 1000 + l * 300;
+ levelButton.levelIndex = l + 1;
+ 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 START\n\nDrag to move your ship\nCollect power-ups\nAvoid enemies', {
+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);
@@ -250,8 +323,9 @@
// 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;
@@ -263,9 +337,22 @@
scoreTxt.setText('Score: 0');
playerLives = 3;
playerLevel = 1;
difficultyTimer = 0;
- enemySpawnRate = 80;
+ // 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;
@@ -278,15 +365,59 @@
volume: 0.3,
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
- startGame();
+ // 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];
+ var bounds = button.getBounds();
+ if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
+ selectedLevel = button.levelIndex;
+ // Animate button selection
+ tween(button, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ tween(button, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 200,
+ easing: tween.easeIn
+ });
+ startGame();
+ return;
+ }
+ }
+ // Check back button click
+ if (y >= 2150 && y <= 2250) {
+ showMainMenu();
+ }
+ return;
+ }
if (gameState === 'playing') {
dragNode = player;
player.x = x;
player.y = y;
@@ -358,8 +489,34 @@
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];
+ button.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
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