User prompt
герой стреляет снарядами в 2 ряда
User prompt
бонус скорости не рабоате
User prompt
шанс выпадения бонуса скорости 1 к 15
User prompt
не работает бонус стрельбы
User prompt
с каждой волной метеориты двигаются быстрее
User prompt
бонус жизни добавляет герою 1 жизнь
User prompt
не работает бонусная жизнь
User prompt
не работает механика бонуса стрельбы
User prompt
добавь "бонус стрельбы", он выпадает с убитых врагов с шансом 1 к 15, время действия бонуса 10 секунд, во время действия "бонуса стрельбы" герой стреляет еще в два дополнительных направлении по диагонали влево вверх, вправо вверх; после поднятия "бонуса стрельбы" он пропадает с экрана и активируется
User prompt
из врагов может выпадать дополнительная жизнь с шансом 1 к 50, после поднятия жизни она пропадает с карты и добавляется 1 жизнь
User prompt
уменьши скорость героя
User prompt
уменьши скорость героя на 30%
User prompt
добавь физику герою
User prompt
следующая волна врагов появляется когда остается 2 врага из предыдущей волны
User prompt
количество врагов увеличивается постепенно
User prompt
добавь счетчик жизней
User prompt
интерфейс не выходит за границы эрана
User prompt
добавь в интерфейс счетчик очков и жизней
User prompt
добавь систему очков за убийство врагов
User prompt
отображать количестве жизней на экране в верхней части
User prompt
во врагов разного типа нужно разное количество попаданий для их уничтожения
User prompt
враги целятся в героя
User prompt
враги стреляю в героя, пуля летит прямо
User prompt
добобавь стреляющих врагов
User prompt
ускорь звезды на фоне
/****
* Classes
****/
// Define the DimStar class for stars with lower brightness
var DimStar = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.createAsset('dimStar', 'Dim Star', 0.5, 0.5);
starGraphics.alpha = Math.random() * 0.5 + 0.1; // Random alpha between 0.1 and 0.6
self.speed = Math.random() * 4 + 2; // Random speed between 2 and 6
self.move = function () {
self.y += self.speed;
if (self.y > 2732 + self.height / 2) {
self.y = -self.height / 2;
}
};
});
// Define the Space Ranger class
var SpaceRanger = Container.expand(function () {
var self = Container.call(this);
var rangerGraphics = self.createAsset('spaceRanger', 'Space Ranger', 0.5, 0.5);
self.speed = 5;
self.lives = 6; // Space Ranger starts with 6 lives
self.moveLeft = function () {
self.x = Math.max(self.width / 2, self.x - self.speed);
};
self.moveRight = function () {
self.x = Math.min(2048 - self.width / 2, self.x + self.speed);
};
self.moveUp = function () {
self.y = Math.max(self.height / 2, self.y - self.speed);
};
self.moveDown = function () {
self.y = Math.min(2732 - self.height / 2, self.y + self.speed);
};
});
// Define the Meteor class
var Meteor = Container.expand(function () {
var self = Container.call(this);
var meteorGraphics = self.createAsset('meteor', 'Meteor', 0.5, 0.5);
self.speed = 3;
self.move = function () {
self.y += self.speed;
};
});
// Define the Alien class
var Alien = Container.expand(function () {
var self = Container.call(this);
var alienGraphics = self.createAsset('alien', 'Alien', 0.5, 0.5);
self.speed = 2;
self.health = 5; // Aliens can take 5 hits before being destroyed
self.move = function () {
self.y += self.speed;
};
});
// Define the HeroBullet class
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', 0.5, 0.5);
self.speed = -10;
self.move = function () {
self.y += self.speed;
};
});
// Define the EnemyType1 class
var EnemyType1 = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemyType1', 'Enemy Type 1', 0.5, 0.5);
self.speed = 2;
self.health = 3;
self.move = function () {
self.y += self.speed;
};
});
// Define the EnemyType2 class
var EnemyType2 = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemyType2', 'Enemy Type 2', 0.5, 0.5);
self.speed = 4;
self.health = 2;
self.move = function () {
self.y += self.speed;
};
});
// Define the EnemyType3 class
var EnemyType3 = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemyType3', 'Enemy Type 3', 0.5, 0.5);
self.speed = 1;
self.health = 7;
self.move = function () {
self.y += self.speed;
};
});
// Define the EnemyType4 class
var EnemyType4 = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemyType4', 'Enemy Type 4', 0.5, 0.5);
self.speed = 3;
self.health = 4;
self.move = function () {
self.x += Math.sin(self.y / 100) * 10; // Sine wave movement
self.y += self.speed;
};
});
// Define the EnemyType5 class
var EnemyType5 = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemyType5', 'Enemy Type 5', 0.5, 0.5);
self.speed = 5;
self.health = 1;
self.move = function () {
if (self.x < 1024) {
self.x += self.speed;
} else {
self.x -= self.speed;
}
self.y += self.speed / 2;
};
});
// Define the WaveDisplay class
var WaveDisplay = Container.expand(function () {
var self = Container.call(this);
self.waveCount = 1;
var waveLabel = new Text2('WAVE', {
size: 50,
fill: "#ffffff"
});
waveLabel.anchor.set(0.5, 0);
waveLabel.y = -60;
self.addChild(waveLabel);
var waveText = new Text2('Wave: 1', {
size: 100,
fill: "#ffffff"
});
waveText.anchor.set(0.5, 0);
self.addChild(waveText);
self.updateWave = function (wave) {
waveText.setText('Wave: ' + wave);
};
self.positionAtTopRight = function () {
self.x = 2048 - waveText.width / 2 - 20;
self.y = 50;
};
self.positionAtTopRight();
});
// Define the LivesDisplay class
var LivesDisplay = Container.expand(function () {
var self = Container.call(this);
self.lives = 6;
var livesLabel = new Text2('LIVES', {
size: 50,
fill: "#ffffff"
});
livesLabel.anchor.set(0.5, 0);
livesLabel.y = -60;
self.addChild(livesLabel);
var livesText = new Text2('Lives: ', {
size: 100,
fill: "#ffffff"
});
self.livesIcons = [];
for (var i = 0; i < self.lives; i++) {
var heartIcon = self.createAsset('heartIcon', 'Heart Icon', 0, 0);
heartIcon.x = livesText.width + 10 + i * (heartIcon.width + 10);
heartIcon.y = livesText.height / 2;
self.livesIcons.push(heartIcon);
self.addChild(heartIcon);
}
livesText.anchor.set(0.5, 0);
self.addChild(livesText);
self.updateLives = function (lives) {
for (var i = 0; i < self.livesIcons.length; i++) {
self.livesIcons[i].visible = i < lives;
}
};
self.positionAtTopCenter = function () {
self.x = 2048 / 2;
self.y = 50;
};
self.positionAtTopCenter();
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Initialize background stars with a mix of Star and DimStar
var stars = [];
for (var i = 0; i < 100; i++) {
var starType = DimStar; // Use only DimStar class for star creation
var star = new starType();
star.x = Math.random() * 2048;
star.y = Math.random() * 2732;
stars.push(star);
game.addChild(star);
}
// Instantiate LivesDisplay
var livesDisplay = new LivesDisplay();
// Instantiate WaveDisplay
var waveDisplay = new WaveDisplay();
// Initialize wave properties
var waveCount = 1;
var waveInterval = 600; // Initial interval for spawning waves
var enemiesPerWave = 10; // Initial number of enemies per wave
LK.gui.topRight.addChild(waveDisplay);
// Add lives display to the GUI overlay at the top center of the screen
LK.gui.top.addChild(livesDisplay);
// Initialize important asset arrays
var meteors = [];
var aliens = [];
var heroBullets = [];
// Create the Space Ranger
var spaceRanger = game.addChild(new SpaceRanger());
spaceRanger.x = 2048 / 2;
spaceRanger.y = 2732 - 200; // Start position near the bottom of the screen
// Touch event handling
function handleTouchMove(obj) {
var touchPos = obj.event.getLocalPosition(game);
spaceRanger.x = touchPos.x;
spaceRanger.y = touchPos.y;
}
game.on('move', handleTouchMove);
// Game tick event
LK.on('tick', function () {
// Move all stars
for (var s = stars.length - 1; s >= 0; s--) {
stars[s].move();
}
// Move all meteors
for (var i = meteors.length - 1; i >= 0; i--) {
meteors[i].move();
if (meteors[i].y > 2732 + meteors[i].height / 2) {
meteors[i].destroy();
meteors.splice(i, 1);
}
}
// Move all aliens
for (var j = aliens.length - 1; j >= 0; j--) {
aliens[j].move();
if (aliens[j].y > 2732 + aliens[j].height / 2) {
aliens[j].destroy();
aliens.splice(j, 1);
}
}
// Move all hero bullets
for (var k = heroBullets.length - 1; k >= 0; k--) {
heroBullets[k].move();
if (heroBullets[k].y < -heroBullets[k].height / 2) {
heroBullets[k].destroy();
heroBullets.splice(k, 1);
}
}
// Collision detection between hero bullets and aliens
for (var l = heroBullets.length - 1; l >= 0; l--) {
for (var m = aliens.length - 1; m >= 0; m--) {
if (heroBullets[l].intersects(aliens[m])) {
// Aliens are now destroyed immediately upon collision with a hero bullet
aliens[m].destroy();
aliens.splice(m, 1);
heroBullets[l].destroy();
heroBullets.splice(l, 1);
break;
}
}
}
// Collision detection between space ranger and meteors/aliens
for (var n = 0; n < meteors.length; n++) {
if (spaceRanger.intersects(meteors[n])) {
spaceRanger.lives--;
livesDisplay.updateLives(spaceRanger.lives);
LK.effects.flashScreen(0xff0000, 500);
if (spaceRanger.lives <= 0) {
LK.showGameOver();
return;
}
meteors[n].destroy();
meteors.splice(n, 1);
}
}
for (var o = 0; o < aliens.length; o++) {
if (spaceRanger.intersects(aliens[o])) {
spaceRanger.lives--;
LK.effects.flashScreen(0xff0000, 500);
if (spaceRanger.lives <= 0) {
LK.showGameOver();
return;
}
aliens[o].destroy();
aliens.splice(o, 1);
}
}
// Spawn enemies in waves
if (LK.ticks % waveInterval === 0 && meteors.length === 0 && aliens.length === 0) {
for (var i = 0; i < enemiesPerWave; i++) {
var enemyTypes = [Meteor, Alien, EnemyType1, EnemyType2, EnemyType3, EnemyType4, EnemyType5];
var randomTypeIndex = Math.floor(Math.random() * enemyTypes.length);
var EnemyClass = enemyTypes[randomTypeIndex];
var newEnemy = new EnemyClass();
newEnemy.x = Math.random() * 2048;
newEnemy.y = -newEnemy.height / 2;
game.addChild(newEnemy);
if (newEnemy instanceof Meteor) {
meteors.push(newEnemy);
} else {
aliens.push(newEnemy);
}
}
// Increase the number of enemies for the next wave more conservatively
enemiesPerWave += Math.floor(waveCount * 0.2);
// Decrease the interval between waves more conservatively to a minimum of 300 ticks
waveInterval = Math.max(300, waveInterval - 20);
// Increment wave count
waveCount++;
// Update the wave counter display
waveDisplay.updateWave(waveCount);
}
// Fire hero bullets
if (LK.ticks % 30 == 0) {
var newHeroBullet = new HeroBullet();
newHeroBullet.x = spaceRanger.x;
newHeroBullet.y = spaceRanger.y - spaceRanger.height / 2;
heroBullets.push(newHeroBullet);
game.addChild(newHeroBullet);
}
});
military spaceship flies upward. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
meteorite. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
ракета, снаряд летит вверх. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
energy ball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
alien ship, flying saucer. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
alien spaceship heading down. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
alien spaceship heading down. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
alien spaceship heading down. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
alien spaceship heading down. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
сердце. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
lightning. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.