User prompt
переделай систему спавна врагов, что бы они появлялись в разное время
User prompt
из убитых врагов может выпасть дополнительная жизнь с шансом 1 к 100, игрок может подобрать жизнь восстановив себе 1 единицу жизни, после подбора значок жизни исчезает с карты
User prompt
Fix Bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in this line: 'powerUp.x = enemies[j].x;' Line Number: 258
User prompt
игрок может поднимать бонусы прикоснувшись к нему
User prompt
из убитых врагов может с небольшим шансом выпасть бонус. добавь 3 вида бонусов например: временное увеличение скорости передвижения героя", увеличение скорости стрельбы
User prompt
Fix Bug: 'ReferenceError: ShootingEnemy is not defined' in this line: 'enemy = new ShootingEnemy();' Line Number: 156
/**** * Classes ****/ var PowerUp = Container.expand(function () { var self = Container.call(this); self.type = Math.floor(Math.random() * 3); var powerUpGraphics = self.createAsset('powerUp' + self.type, 'PowerUp Graphics', 0.5, 0.5); self.speed = 2; self.move = function () { self.y += self.speed; }; }); // HealthBar class var LivesDisplay = Container.expand(function () { var self = Container.call(this); self.lives = 3; self.livesText = new Text2('Lives: ' + self.lives, { size: 100, fill: '#ffffff' }); self.livesText.anchor.set(0, 0); LK.gui.topLeft.addChild(self.livesText); self.updateLives = function (newLives) { self.lives = newLives; self.livesText.setText('Lives: ' + self.lives); }; }); // ScoreDisplay class var ScoreDisplay = Container.expand(function () { var self = Container.call(this); self.scoreText = new Text2('Score: 0', { size: 100, fill: "#ffffff" }); self.scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(self.scoreText); self.updateScore = function (score) { self.scoreText.setText('Score: ' + score); }; }); // Hero class var Hero = Container.expand(function () { var self = Container.call(this); self.updateRotation = function (angle) { self.rotation = angle; }; var heroGraphics = self.createAsset('hero', 'Hero character', 0.5, 0.5); self.x = 2048 / 2; self.y = 2732 / 2; self.lives = 3; // Hero starts with 3 lives }); // Base Enemy class var BaseEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('enemy', 'Base Enemy character', 0.5, 0.5); self.enemyType = 'base'; self.setGraphics = function () { if (self.enemyType === 'shooting') { self.createAsset('shootingEnemy', 'Shooting Enemy character', 0.5, 0.5); } }; self.speed = 2; self.move = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var angle = Math.atan2(dy, dx); self.x += Math.cos(angle) * self.speed; self.y += Math.sin(angle) * self.speed; }; }); // KamikazeEnemy class var KamikazeEnemy = Container.expand(function () { var self = Container.call(this); var kamikazeEnemyGraphics = self.createAsset('kamikazeEnemy', 'Kamikaze Enemy character', 0.5, 0.5); self.speed = 4; self.move = function () { // Movement towards the hero's position var dx = hero.x - self.x; var dy = hero.y - self.y; var angle = Math.atan2(dy, dx); self.x += Math.cos(angle) * self.speed; self.y += Math.sin(angle) * self.speed; }; }); // ShootingEnemy class var ShootingEnemy = Container.expand(function () { var self = Container.call(this); var shootingEnemyGraphics = self.createAsset('shootingEnemy', 'Shooting Enemy character', 0.5, 0.5); self.speed = 3; self.shootingRate = 120; // Shoot every 2 seconds self.lastShotTick = 0; self.move = function () { // Movement towards the hero's position var dx = hero.x - self.x; var dy = hero.y - self.y; var angle = Math.atan2(dy, dx); self.x += Math.cos(angle) * self.speed; self.y += Math.sin(angle) * self.speed; }; self.shoot = function () { if (LK.ticks - self.lastShotTick >= self.shootingRate) { var bullet = new EnemyBullet(); // Calculate the direction towards the hero at the time of shooting var dx = hero.x - self.x; var dy = hero.y - self.y; var magnitude = Math.sqrt(dx * dx + dy * dy); bullet.direction = { x: dx / magnitude, y: dy / magnitude }; bullet.x = self.x; bullet.y = self.y; enemyBullets.push(bullet); game.addChild(bullet); self.lastShotTick = LK.ticks; } }; }); // EnemyBullet class var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet Graphics', 0.5, 0.5); self.speed = 5; self.move = function () { // Movement in a straight line towards the hero's last known position self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; }; }); // HeroBullet class var HeroBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet Graphics', 0.5, 0.5); self.speed = 10; self.move = function () { // Movement logic for the bullet will be defined in the fireBullet function }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x003300 // Init game with a darker green background }); /**** * Game Code ****/ // Initialize hero, lives display, and score display var hero = game.addChild(new Hero()); var livesDisplay = game.addChild(new LivesDisplay()); var scoreDisplay = game.addChild(new ScoreDisplay()); var score = 0; // Global score variable // Initialize enemies and bullets arrays var enemies = []; var bullets = []; var enemyBullets = []; // Array for bullets shot by ShootingEnemy var powerUps = []; // Array for power-ups that are currently in the game // Initialize firing rate, enemy spawn rate, and wave system var firingRate = 30; // Increased firing rate (ticks) var spawnRate = 180; // Increased enemy spawn rate (ticks) to decrease intensity var waveCount = 0; // Number of waves that have passed var enemiesPerWave = 10; // Base number of enemies per wave var enemySpeedIncrease = 0.01; // Speed increase per wave var waveCounterDisplay = new Text2('Wave: 1', { size: 100, fill: "#ffffff" }); waveCounterDisplay.anchor.set(1, 0); LK.gui.topRight.addChild(waveCounterDisplay); var score = 0; // Global score variable // Function to spawn enemies function spawnEnemy() { waveCount++; waveCounterDisplay.setText('Wave: ' + waveCount); var initialEnemies = 10; var additionalEnemies = waveCount - 1; // Additional enemies spawned gradually var enemiesToSpawn = initialEnemies + additionalEnemies; var spawnInterval = 300; // Spawn an enemy every 0.3 seconds var spawnEnemyAtIndex = function spawnEnemyAtIndex(index) { if (index < enemiesToSpawn) { var angle = Math.random() * Math.PI * 2; // Random angle var radius = 1200; // Spawn circle radius var enemyType = Math.random(); var enemy = enemyType < 0.33 ? new BaseEnemy() : enemyType < 0.66 ? new ShootingEnemy() : new KamikazeEnemy(); enemy.speed += enemy.speed * waveCount * enemySpeedIncrease; // Increase speed by 1% per wave enemy.x = 1024 + radius * Math.cos(angle); enemy.y = 1366 + radius * Math.sin(angle); enemies.push(enemy); game.addChild(enemy); LK.setTimeout(function () { spawnEnemyAtIndex(index + 1); }, spawnInterval); } }; spawnEnemyAtIndex(0); } // Function to fire a bullet function fireBullet() { if (enemies.length === 0) { return; } // No enemies to shoot at var nearestEnemy = enemies.reduce(function (closest, enemy) { var closestDist = Math.sqrt(Math.pow(closest.x - hero.x, 2) + Math.pow(closest.y - hero.y, 2)); var enemyDist = Math.sqrt(Math.pow(enemy.x - hero.x, 2) + Math.pow(enemy.y - hero.y, 2)); return enemyDist < closestDist ? enemy : closest; }, enemies[0]); var angleToNearestEnemy = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x); var bullet = new HeroBullet(); bullet.x = hero.x; bullet.y = hero.y; hero.updateRotation(angleToNearestEnemy); bullet.move = function () { this.x += Math.cos(angleToNearestEnemy) * this.speed; this.y += Math.sin(angleToNearestEnemy) * this.speed; }; bullets.push(bullet); game.addChild(bullet); } // Game tick event LK.on('tick', function () { // Move the hero towards the touch position with limited maximum speed var maxSpeed = 5; if (game.touchPosition) { var dx = (game.touchPosition.x - hero.x) * 0.1; var dy = (game.touchPosition.y - hero.y) * 0.1; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > maxSpeed) { dx = dx / dist * maxSpeed; dy = dy / dist * maxSpeed; } hero.x += dx; hero.y += dy; } // Move bullets and check for collisions with enemies for (var i = bullets.length - 1; i >= 0; i--) { bullets[i].move(); // Check for bullet-enemy collisions for (var j = enemies.length - 1; j >= 0; j--) { if (bullets[i] && bullets[i].intersects(enemies[j])) { // Destroy enemy and update score score += 1; // Increment score scoreDisplay.updateScore(score); // Update score display spawnRate = Math.max(30, spawnRate - 5); // Decrease spawn rate by 5 ticks to a minimum of 30 ticks enemies[j].destroy(); enemies.splice(j, 1); // 20% chance to spawn a power-up if (Math.random() < 0.2) { var powerUp = new PowerUp(); powerUp.x = enemies[j].x; powerUp.y = enemies[j].y; powerUps.push(powerUp); game.addChild(powerUp); } // Destroy bullet bullets[i].destroy(); bullets.splice(i, 1); break; // Break out of the enemies loop since the bullet is destroyed } } // Remove bullets that are off-screen if (bullets[i] && bullets[i].y < 0) { bullets[i].destroy(); bullets.splice(i, 1); } } // Move enemies for (var j = enemies.length - 1; j >= 0; j--) { enemies[j].move(); if (enemies[j].intersects(hero)) { if (enemies[j] instanceof KamikazeEnemy) { hero.lives -= 1; // Decrease hero's lives by one livesDisplay.updateLives(hero.lives); // Update the lives display LK.effects.flashScreen(0xff0000, 500); // Flash screen red for half a second if (hero.lives <= 0) { LK.showGameOver(); // If no lives left, show game over return; } // Move power-ups and check for collisions with the hero for (var i = powerUps.length - 1; i >= 0; i--) { powerUps[i].move(); if (powerUps[i].intersects(hero)) { // Apply power-up effect based on its type switch (powerUps[i].type) { case 0: // Increase hero's movement speed temporarily hero.speed += 2; LK.setTimeout(function () { hero.speed -= 2; }, 5000); break; case 1: // Increase hero's firing rate temporarily firingRate = Math.max(10, firingRate - 10); LK.setTimeout(function () { firingRate = Math.min(30, firingRate + 10); }, 5000); break; case 2: // Increase hero's lives hero.lives = Math.min(5, hero.lives + 1); livesDisplay.updateLives(hero.lives); break; } powerUps[i].destroy(); powerUps.splice(i, 1); } } } enemies[j].destroy(); // Destroy the enemy that collided with the hero enemies.splice(j, 1); } } // Make ShootingEnemy instances shoot at the hero for (var i = 0; i < enemies.length; i++) { if (enemies[i] instanceof ShootingEnemy) { enemies[i].shoot(); } } // Spawn enemies only if the previous wave has been cleared if (LK.ticks % spawnRate === 0 && enemies.length === 0) { spawnEnemy(); } // Move enemy bullets and check for collisions with the hero for (var i = enemyBullets.length - 1; i >= 0; i--) { enemyBullets[i].move(); if (enemyBullets[i].intersects(hero)) { hero.lives -= 1; // Decrease hero's lives by one livesDisplay.updateLives(hero.lives); // Update the lives display if (hero.lives <= 0) { LK.showGameOver(); // If no lives left, show game over return; } LK.effects.flashScreen(0xff0000, 500); // Flash screen red for half a second enemyBullets[i].destroy(); enemyBullets.splice(i, 1); } // Remove enemy bullets that are off-screen if (enemyBullets[i] && (enemyBullets[i].y < 0 || enemyBullets[i].y > 2732)) { enemyBullets[i].destroy(); enemyBullets.splice(i, 1); } } // Fire bullets if (LK.ticks % firingRate === 0) { fireBullet(); } }); // Track touch position var touchPosition = null; game.on('move', function (obj) { var event = obj.event; touchPosition = event.getLocalPosition(game); game.touchPosition = touchPosition; });
===================================================================
--- original.js
+++ change.js
@@ -1,42 +1,16 @@
/****
* Classes
****/
-// Base Enemy class
-var BaseEnemy = Container.expand(function () {
+var PowerUp = Container.expand(function () {
var self = Container.call(this);
- var enemyGraphics = self.createAsset('enemy', 'Base Enemy character', 0.5, 0.5);
+ self.type = Math.floor(Math.random() * 3);
+ var powerUpGraphics = self.createAsset('powerUp' + self.type, 'PowerUp Graphics', 0.5, 0.5);
self.speed = 2;
- self.shootingRate = 120; // Shoot every 2 seconds
self.move = function () {
- var dx = hero.x - self.x;
- var dy = hero.y - self.y;
- var angle = Math.atan2(dy, dx);
- self.x += Math.cos(angle) * self.speed;
- self.y += Math.sin(angle) * self.speed;
+ self.y += self.speed;
};
});
-// StrongEnemy class
-var StrongEnemy = BaseEnemy.expand(function () {
- var self = BaseEnemy.call(this);
- self.createAsset('strongEnemy', 'Strong Enemy character', 0.5, 0.5);
- self.speed = 2;
- self.health = 3; // StrongEnemy has more health
- self.takeDamage = function () {
- self.health--;
- if (self.health <= 0) {
- self.destroy();
- }
- };
- return self;
-});
-// FastEnemy class
-var FastEnemy = BaseEnemy.expand(function () {
- var self = BaseEnemy.call(this);
- self.createAsset('fastEnemy', 'Fast Enemy character', 0.5, 0.5);
- self.speed = 5;
- return self;
-});
// HealthBar class
var LivesDisplay = Container.expand(function () {
var self = Container.call(this);
self.lives = 3;
@@ -74,8 +48,75 @@
self.x = 2048 / 2;
self.y = 2732 / 2;
self.lives = 3; // Hero starts with 3 lives
});
+// Base Enemy class
+var BaseEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.createAsset('enemy', 'Base Enemy character', 0.5, 0.5);
+ self.enemyType = 'base';
+ self.setGraphics = function () {
+ if (self.enemyType === 'shooting') {
+ self.createAsset('shootingEnemy', 'Shooting Enemy character', 0.5, 0.5);
+ }
+ };
+ self.speed = 2;
+ self.move = function () {
+ var dx = hero.x - self.x;
+ var dy = hero.y - self.y;
+ var angle = Math.atan2(dy, dx);
+ self.x += Math.cos(angle) * self.speed;
+ self.y += Math.sin(angle) * self.speed;
+ };
+});
+// KamikazeEnemy class
+var KamikazeEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var kamikazeEnemyGraphics = self.createAsset('kamikazeEnemy', 'Kamikaze Enemy character', 0.5, 0.5);
+ self.speed = 4;
+ self.move = function () {
+ // Movement towards the hero's position
+ var dx = hero.x - self.x;
+ var dy = hero.y - self.y;
+ var angle = Math.atan2(dy, dx);
+ self.x += Math.cos(angle) * self.speed;
+ self.y += Math.sin(angle) * self.speed;
+ };
+});
+// ShootingEnemy class
+var ShootingEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var shootingEnemyGraphics = self.createAsset('shootingEnemy', 'Shooting Enemy character', 0.5, 0.5);
+ self.speed = 3;
+ self.shootingRate = 120; // Shoot every 2 seconds
+ self.lastShotTick = 0;
+ self.move = function () {
+ // Movement towards the hero's position
+ var dx = hero.x - self.x;
+ var dy = hero.y - self.y;
+ var angle = Math.atan2(dy, dx);
+ self.x += Math.cos(angle) * self.speed;
+ self.y += Math.sin(angle) * self.speed;
+ };
+ self.shoot = function () {
+ if (LK.ticks - self.lastShotTick >= self.shootingRate) {
+ var bullet = new EnemyBullet();
+ // Calculate the direction towards the hero at the time of shooting
+ var dx = hero.x - self.x;
+ var dy = hero.y - self.y;
+ var magnitude = Math.sqrt(dx * dx + dy * dy);
+ bullet.direction = {
+ x: dx / magnitude,
+ y: dy / magnitude
+ };
+ bullet.x = self.x;
+ bullet.y = self.y;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ self.lastShotTick = LK.ticks;
+ }
+ };
+});
// EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet Graphics', 0.5, 0.5);
@@ -94,27 +135,8 @@
self.move = function () {
// Movement logic for the bullet will be defined in the fireBullet function
};
});
-// ShootingEnemy class
-var ShootingEnemy = BaseEnemy.expand(function () {
- var self = BaseEnemy.call(this);
- self.createAsset('shootingEnemy', 'Shooting Enemy character', 0.5, 0.5);
- self.shootingRate = 60; // Shoot every second
- self.shoot = function () {
- var bullet = new EnemyBullet();
- var angle = Math.atan2(hero.y - self.y, hero.x - self.x);
- bullet.direction = {
- x: Math.cos(angle),
- y: Math.sin(angle)
- };
- bullet.x = self.x;
- bullet.y = self.y;
- enemyBullets.push(bullet);
- game.addChild(bullet);
- };
- return self;
-});
/****
* Initialize Game
****/
@@ -134,8 +156,9 @@
// Initialize enemies and bullets arrays
var enemies = [];
var bullets = [];
var enemyBullets = []; // Array for bullets shot by ShootingEnemy
+var powerUps = []; // Array for power-ups that are currently in the game
// Initialize firing rate, enemy spawn rate, and wave system
var firingRate = 30; // Increased firing rate (ticks)
var spawnRate = 180; // Increased enemy spawn rate (ticks) to decrease intensity
var waveCount = 0; // Number of waves that have passed
@@ -160,19 +183,10 @@
var spawnEnemyAtIndex = function spawnEnemyAtIndex(index) {
if (index < enemiesToSpawn) {
var angle = Math.random() * Math.PI * 2; // Random angle
var radius = 1200; // Spawn circle radius
- var enemyType = Math.random() * 4;
- var enemy;
- if (enemyType < 1) {
- enemy = new BaseEnemy();
- } else if (enemyType < 2) {
- enemy = new FastEnemy();
- } else if (enemyType < 3) {
- enemy = new StrongEnemy();
- } else {
- enemy = new ShootingEnemy();
- }
+ var enemyType = Math.random();
+ var enemy = enemyType < 0.33 ? new BaseEnemy() : enemyType < 0.66 ? new ShootingEnemy() : new KamikazeEnemy();
enemy.speed += enemy.speed * waveCount * enemySpeedIncrease; // Increase speed by 1% per wave
enemy.x = 1024 + radius * Math.cos(angle);
enemy.y = 1366 + radius * Math.sin(angle);
enemies.push(enemy);
@@ -235,8 +249,16 @@
scoreDisplay.updateScore(score); // Update score display
spawnRate = Math.max(30, spawnRate - 5); // Decrease spawn rate by 5 ticks to a minimum of 30 ticks
enemies[j].destroy();
enemies.splice(j, 1);
+ // 20% chance to spawn a power-up
+ if (Math.random() < 0.2) {
+ var powerUp = new PowerUp();
+ powerUp.x = enemies[j].x;
+ powerUp.y = enemies[j].y;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+ }
// Destroy bullet
bullets[i].destroy();
bullets.splice(i, 1);
break; // Break out of the enemies loop since the bullet is destroyed
@@ -260,8 +282,38 @@
if (hero.lives <= 0) {
LK.showGameOver(); // If no lives left, show game over
return;
}
+ // Move power-ups and check for collisions with the hero
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ powerUps[i].move();
+ if (powerUps[i].intersects(hero)) {
+ // Apply power-up effect based on its type
+ switch (powerUps[i].type) {
+ case 0:
+ // Increase hero's movement speed temporarily
+ hero.speed += 2;
+ LK.setTimeout(function () {
+ hero.speed -= 2;
+ }, 5000);
+ break;
+ case 1:
+ // Increase hero's firing rate temporarily
+ firingRate = Math.max(10, firingRate - 10);
+ LK.setTimeout(function () {
+ firingRate = Math.min(30, firingRate + 10);
+ }, 5000);
+ break;
+ case 2:
+ // Increase hero's lives
+ hero.lives = Math.min(5, hero.lives + 1);
+ livesDisplay.updateLives(hero.lives);
+ break;
+ }
+ powerUps[i].destroy();
+ powerUps.splice(i, 1);
+ }
+ }
}
enemies[j].destroy(); // Destroy the enemy that collided with the hero
enemies.splice(j, 1);
}
hero with a gun, shoots forward, top view, topdown. Single Game Texture. In-Game asset. 2d.TopDown. Blank background. High contrast. No shadows.
metal ball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A fireball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
heart. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
zombie kamikaze, vertical top view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
opponent for the game, zombie kamikaze, vertical top view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.