User prompt
все типы врагов могут стрелять в героя
User prompt
все враги могут стрелять
User prompt
увеличь скорость передвижения врагов
User prompt
уменьши интервал времени спавна врагов
User prompt
в 1 волне 10 врагов, в каждой следующей + 1 враг
User prompt
увеличь количество врагов
User prompt
увеличь скорость появления врагов
User prompt
Fix Bug: 'ReferenceError: enemiesSpawnedThisWave is not defined' in this line: 'if (enemiesSpawnedThisWave < waveEnemyCount) {' Line Number: 460
User prompt
Fix Bug: 'ReferenceError: enemiesSpawnedThisWave is not defined' in this line: 'if (enemiesSpawnedThisWave < waveEnemyCount) {' Line Number: 460
User prompt
враги появляются постепенно
User prompt
игра зависает
User prompt
герой может убить снарядами врага после чего они исчезают
User prompt
оптимизируй код
User prompt
враги не могут сталкиваться и пересекать друг с другом
User prompt
оптимизируй количество врагов, придумай оптимальную систему появления врагов с прогрессией
User prompt
враги появляются группами по 10 штук в волне
User prompt
придумай систему спауна врагов с прогрессией
User prompt
оптимизируй количество врагов, придумай систему спауна с прогрессией
User prompt
враги не пересекают друг друга
User prompt
враги не выходят за границы экрана
User prompt
уменьши количество врагов
User prompt
враги не могут пресекаться с друг другом
User prompt
оптимизируй количество врагов, враги не могут пересекаться с друг другом
User prompt
увеличь темп игры
User prompt
увеличь темп игры
/****
* Classes
****/
var LifePowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.createAsset('lifePowerUp', 'Life Power Up', 0.5, 0.5);
self.speed = 2;
self.move = function () {
self.y += self.speed;
if (self.y > 2732 + self.height / 2) {
self.destroy();
}
};
});
// Define the EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', 0.5, 0.5);
self.speed = 5;
self.move = function () {
self.y += self.speed * 1.5;
};
});
// 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.velocity = {
x: 0,
y: 0
};
self.acceleration = {
x: 0,
y: 0
};
self.maxSpeed = 2.5;
self.lives = 6; // Space Ranger starts with 6 lives
self.shootingBonusActive = false;
self.shootingBonusEndTime = 0;
self.applyPhysics = function () {
self.velocity.x += self.acceleration.x;
self.velocity.y += self.acceleration.y;
self.velocity.x = Math.max(-self.maxSpeed, Math.min(self.maxSpeed, self.velocity.x));
self.velocity.y = Math.max(-self.maxSpeed, Math.min(self.maxSpeed, self.velocity.y));
self.x += self.velocity.x;
self.y += self.velocity.y;
self.x = Math.max(self.width / 2, Math.min(2048 - self.width / 2, self.x));
self.y = Math.max(self.height / 2, Math.min(2732 - self.height / 2, self.y));
self.acceleration.x = self.acceleration.y = 0; // Reset acceleration after applying
};
});
// 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.baseSpeed = 3;
self.speedMultiplier = 1;
self.move = function () {
self.y += self.baseSpeed * (1 + waveCount * 0.2);
};
});
// 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 * 1.5;
};
});
// 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 * 1.5;
};
});
// 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.shootInterval = 120; // Enemy shoots every 2 seconds
self.lastShotTick = 0; // Last tick when the enemy shot
self.move = function () {
self.y += self.speed;
};
self.shoot = function () {
if (LK.ticks - self.lastShotTick >= self.shootInterval) {
var newEnemyBullet = new EnemyBullet();
newEnemyBullet.x = self.x;
newEnemyBullet.y = self.y + self.height / 2;
// Calculate the direction to the hero
var direction = {
x: spaceRanger.x - self.x,
y: spaceRanger.y - self.y
};
var magnitude = Math.sqrt(direction.x * direction.x + direction.y * direction.y);
direction.x /= magnitude;
direction.y /= magnitude;
// Set bullet speed to aim at the hero
newEnemyBullet.speedX = direction.x * 5;
newEnemyBullet.speedY = direction.y * 5;
newEnemyBullet.move = function () {
this.x += this.speedX;
this.y += this.speedY;
};
game.addChild(newEnemyBullet);
enemyBullets.push(newEnemyBullet);
self.lastShotTick = LK.ticks;
}
};
});
// 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;
};
});
var ShootingPowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.createAsset('shootingPowerUp', 'Shooting Power Up', 0.5, 0.5);
self.speed = 2;
self.move = function () {
self.y += self.speed;
if (self.y > 2732 + self.height / 2) {
self.destroy();
}
};
});
// 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 - self.width / 2 - 20;
self.y = 50;
};
self.positionAtTopRight();
});
// Define the ScoreDisplay class
var ScoreDisplay = Container.expand(function () {
var self = Container.call(this);
var scoreLabel = new Text2('SCORE', {
size: 50,
fill: "#ffffff"
});
scoreLabel.anchor.set(0.5, 0);
scoreLabel.y = -60;
self.addChild(scoreLabel);
var scoreText = new Text2('Score: 0', {
size: 100,
fill: "#ffffff"
});
scoreText.anchor.set(0.5, 0);
self.addChild(scoreText);
self.updateScore = function (score) {
scoreText.setText('Score: ' + score);
};
self.positionAtTopLeft = function () {
self.x = self.width / 2 + 20;
self.y = 50;
};
self.positionAtTopLeft();
});
// 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: 6', {
size: 100,
fill: "#ffffff"
}); // Include the initial number of lives in the text
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) {
livesText.setText('Lives: ' + lives); // Update the lives text when lives change
for (var i = 0; i < self.livesIcons.length; i++) {
self.livesIcons[i].visible = i < lives;
}
};
self.positionAtTopCenter = function () {
self.x = 2048 / 2 - self.width / 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 ScoreDisplay
var scoreDisplay = new ScoreDisplay();
LK.gui.topLeft.addChild(scoreDisplay);
// 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 = [];
var enemyBullets = [];
// 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 and make them shoot if they are of EnemyType1
for (var j = aliens.length - 1; j >= 0; j--) {
aliens[j].move();
if (aliens[j] instanceof EnemyType1) {
aliens[j].shoot();
}
if (aliens[j].y > 2732 + aliens[j].height / 2) {
aliens[j].destroy();
aliens.splice(j, 1);
}
}
// Move all enemy bullets
for (var p = enemyBullets.length - 1; p >= 0; p--) {
enemyBullets[p].move();
if (enemyBullets[p].y > 2732 + enemyBullets[p].height / 2) {
enemyBullets[p].destroy();
enemyBullets.splice(p, 1);
} else if (spaceRanger.intersects(enemyBullets[p])) {
spaceRanger.lives--;
livesDisplay.updateLives(spaceRanger.lives);
LK.effects.flashScreen(0xff0000, 500);
if (spaceRanger.lives <= 0) {
LK.showGameOver();
return;
}
enemyBullets[p].destroy();
enemyBullets.splice(p, 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])) {
// Decrease alien health and check if it should be destroyed
aliens[m].health--;
if (aliens[m].health <= 0) {
// Update score for destroying an alien
LK.setScore(LK.getScore() + 100);
scoreDisplay.updateScore(LK.getScore());
// Chance to drop a life power-up
if (Math.random() < 0.0667) {
// 1 in 15 chance
var shootingPowerUp = new ShootingPowerUp();
shootingPowerUp.x = aliens[m].x;
shootingPowerUp.y = aliens[m].y;
game.addChild(shootingPowerUp);
}
aliens[m].destroy();
aliens.splice(m, 1);
}
// Destroy the hero bullet
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);
}
}
// Pick up ShootingPowerUp
for (var p = 0; p < game.children.length; p++) {
var obj = game.children[p];
if (obj instanceof ShootingPowerUp && spaceRanger.intersects(obj)) {
spaceRanger.shootingBonusActive = true;
spaceRanger.shootingBonusEndTime = LK.ticks + 600; // 10 seconds at 60FPS
obj.destroy();
}
}
// Pick up LifePowerUp
for (var p = 0; p < game.children.length; p++) {
var obj = game.children[p];
if (obj instanceof LifePowerUp && spaceRanger.intersects(obj)) {
spaceRanger.lives += 1; // Add 1 life to the Space Ranger
livesDisplay.updateLives(spaceRanger.lives);
obj.destroy();
}
}
// Spawn enemies in waves and increase meteor speed
if (LK.ticks % waveInterval === 0 && meteors.length + aliens.length <= 2) {
for (var i = 0; i < meteors.length; i++) {
meteors[i].speedMultiplier = 1 + waveCount * 0.1;
}
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.ceil(waveCount * 0.1);
// Decrease the interval between waves more conservatively to a minimum of 300 ticks
waveInterval = Math.max(200, waveInterval - Math.ceil(waveCount * 0.2));
// Increment wave count
waveCount++;
// Update the wave counter display
waveDisplay.updateWave(waveCount);
}
// Fire hero bullets
if (LK.ticks % 30 == 0) {
var newHeroBullet1 = new HeroBullet();
newHeroBullet1.x = spaceRanger.x - spaceRanger.width / 4;
newHeroBullet1.y = spaceRanger.y - spaceRanger.height / 2;
heroBullets.push(newHeroBullet1);
game.addChild(newHeroBullet1);
var newHeroBullet2 = new HeroBullet();
newHeroBullet2.x = spaceRanger.x + spaceRanger.width / 4;
newHeroBullet2.y = spaceRanger.y - spaceRanger.height / 2;
heroBullets.push(newHeroBullet2);
game.addChild(newHeroBullet2);
if (spaceRanger.shootingBonusActive) {
var leftDiagonalBullet = new HeroBullet();
leftDiagonalBullet.x = spaceRanger.x;
leftDiagonalBullet.y = spaceRanger.y - spaceRanger.height / 2;
leftDiagonalBullet.speedX = -Math.cos(Math.PI / 4) * leftDiagonalBullet.speed;
leftDiagonalBullet.speedY = -Math.sin(Math.PI / 4) * leftDiagonalBullet.speed;
leftDiagonalBullet.move = function () {
this.x += this.speedX;
this.y += this.speedY;
};
var rightDiagonalBullet = new HeroBullet();
rightDiagonalBullet.x = spaceRanger.x;
rightDiagonalBullet.y = spaceRanger.y - spaceRanger.height / 2;
rightDiagonalBullet.speedX = Math.cos(Math.PI / 4) * rightDiagonalBullet.speed;
rightDiagonalBullet.speedY = -Math.sin(Math.PI / 4) * rightDiagonalBullet.speed;
rightDiagonalBullet.move = function () {
this.x += this.speedX;
this.y += this.speedY;
};
heroBullets.push(leftDiagonalBullet);
heroBullets.push(rightDiagonalBullet);
game.addChild(leftDiagonalBullet);
game.addChild(rightDiagonalBullet);
// Activate the move function for diagonal bullets
leftDiagonalBullet.move();
rightDiagonalBullet.move();
}
// Deactivate shooting bonus if time has expired
if (spaceRanger.shootingBonusEndTime && LK.ticks > spaceRanger.shootingBonusEndTime) {
spaceRanger.shootingBonusActive = false;
}
}
});
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.