User prompt
Baja un poco la posición del jugador y de los enemigos.
User prompt
Bajar el volumen de sonido de fondo a la mitad.
User prompt
El sonido de golpear sonará siempre que el jugador presione los botones de golpe y patada. El sonido de espada sonará siempre que el jugador presione el botón espada.
User prompt
El sonidofondo comenzará a escucharse en cuanto comience el juego.
Code edit (1 edits merged)
Please save this source code
User prompt
haz que el jefe final tenga varias fases: en la primera, ataca con golpes cuerpo a cuerpo si el jugador esta cerca. en la segunda fase (cuando queda la mitad de la vida), comienza a tirar patadas. agraga una barra de salud visible para el jefe. que tenga una animacion de muerte al ser derrotado. agrega sonidos y efectos visuales para cada ataque del jefe y de los enemigos. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
el ataque con la espada debe dañar el enemigo al contacto. el jugador debe tener una barra de energia que se consume al usar la espada. la barra de la espada se recarga luego de 3 segundos. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
agrega sistema de combo de 3 golpes para los botones golpe y patada. el primer clic hace un golpe corto, el segundo un golpe giratorio y el tercero un golpe fuerte. si el jugador espera mas de un segundo entre golpes reinicia. lo mismo para el boton de patada. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
mejora los controles de movimiento del personaje para que sean mas suaves y responsivos. agrega aceleracion y desaceleracion al moverse hacia la izquierda y derecha, y un salto mas fluido con la flecha hacia arriba. que la gravedad sea realista. haz que el personaje pueda correr si se mantienen presionadas las flechas izquierda o derecha. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
el jefe aparecera despues de 2 minutos de juego.
User prompt
agrega salto con gravedad realista. los enemigos atacan cuando estan cerca.
User prompt
el personaje principal se mueve lateralmente, puede saltar, atacar con combos cuerpo a cuerpo y luchar contra los enemigos, el jugador debe poder avanzar por un nivel hasta vencer a un jefe. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
habra 3 tipos diferentes de enemigos.
User prompt
al principio apareceran 2 enemigos y por cada enemigo derrotado aparecera otro.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 1.0 }); self.health = 50; self.damage = 20; self.moveSpeed = -2; self.lastDamageTime = 0; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFFFFFF, 100); if (self.health <= 0) { self.destroy(); for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i] === self) { enemies.splice(i, 1); break; } } LK.setScore(LK.getScore() + 10); scoreTxt.setText(LK.getScore()); // Spawn a new enemy when this one is defeated spawnEnemy(); } }; self.update = function () { if (player) { // Simple movement towards player var moveX = player.x - self.x; var moveY = player.y - self.y; // Normalize movement speed var distance = Math.sqrt(moveX * moveX + moveY * moveY); if (distance > 0) { moveX = moveX / distance * Math.abs(self.moveSpeed); moveY = moveY / distance * Math.abs(self.moveSpeed); } self.x += moveX; self.y += moveY; } else { self.x += self.moveSpeed; } if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { self.destroy(); for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i] === self) { enemies.splice(i, 1); break; } } } }; return self; }); var FastEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 1.0, tint: 0x00FF00 // Green tint to distinguish from regular enemy }); self.health = 25; // Lower health self.damage = 15; // Lower damage self.moveSpeed = -4; // Faster movement self.lastDamageTime = 0; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFFFFFF, 100); if (self.health <= 0) { self.destroy(); for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i] === self) { enemies.splice(i, 1); break; } } LK.setScore(LK.getScore() + 15); // More points for faster enemy scoreTxt.setText(LK.getScore()); // Spawn a new enemy when this one is defeated spawnEnemy(); } }; self.update = function () { if (player) { // Simple movement towards player var moveX = player.x - self.x; var moveY = player.y - self.y; // Normalize movement speed var distance = Math.sqrt(moveX * moveX + moveY * moveY); if (distance > 0) { moveX = moveX / distance * Math.abs(self.moveSpeed); moveY = moveY / distance * Math.abs(self.moveSpeed); } self.x += moveX; self.y += moveY; } else { self.x += self.moveSpeed; } if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { self.destroy(); for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i] === self) { enemies.splice(i, 1); break; } } } }; return self; }); var HealthPickup = Container.expand(function () { var self = Container.call(this); self.isLarge = false; self.healAmount = 0; self.init = function (isLarge) { self.isLarge = isLarge; if (isLarge) { var graphics = self.attachAsset('largeHealthPickup', { anchorX: 0.5, anchorY: 0.5 }); self.healAmount = 100; // Full heal } else { var graphics = self.attachAsset('smallHealthPickup', { anchorX: 0.5, anchorY: 0.5 }); self.healAmount = 50; // Half heal } }; self.update = function () { // Simple floating animation self.y += Math.sin(LK.ticks * 0.1) * 0.5; }; return self; }); var HeavyAttack = Container.expand(function () { var self = Container.call(this); var attackGraphics = self.attachAsset('heavyAttack', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 50; self.lifetime = 25; // Slightly longer than quick attack self.hasHit = false; self.update = function () { self.lifetime--; if (self.lifetime <= 0) { self.destroy(); for (var i = attacks.length - 1; i >= 0; i--) { if (attacks[i] === self) { attacks.splice(i, 1); break; } } } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 1.0 }); self.health = 100; self.maxHealth = 100; self.moveSpeed = 3; self.isAttacking = false; self.attackCooldown = 0; self.specialCooldown = 0; self.maxSpecialCooldown = 180; // 3 seconds at 60fps self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } else { LK.effects.flashObject(self, 0xFF0000, 300); } }; self.quickAttack = function () { if (self.attackCooldown > 0 || self.isAttacking) return; self.isAttacking = true; self.attackCooldown = 20; // 1/3 second cooldown // Punch animation - quick forward movement tween(playerGraphics, { x: 15 }, { duration: 100, easing: tween.easeOut }); tween(playerGraphics, { x: 0 }, { duration: 100, easing: tween.easeIn }); var attack = new QuickAttack(); // Find closest enemy to determine attack direction var closestEnemy = null; var closestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var distance = Math.sqrt(Math.pow(enemy.x - self.x, 2) + Math.pow(enemy.y - self.y, 2)); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } if (closestEnemy) { if (closestEnemy.x < self.x) { // Enemy is to the left, attack left attack.x = self.x - 60; } else { // Enemy is to the right, attack right attack.x = self.x + 60; } } else { attack.x = self.x + 60; } attack.y = self.y - 40; attacks.push(attack); game.addChild(attack); LK.getSound('slash').play(); LK.setTimeout(function () { self.isAttacking = false; }, 200); }; self.heavyAttack = function () { if (self.attackCooldown > 0 || self.isAttacking) return; self.isAttacking = true; self.attackCooldown = 45; // 3/4 second cooldown // Kick animation - leg extension with rotation tween(playerGraphics, { rotation: 0.2 }, { duration: 150, easing: tween.easeOut }); tween(playerGraphics, { rotation: 0 }, { duration: 250, easing: tween.easeIn }); var attack = new HeavyAttack(); // Find closest enemy to determine attack direction var closestEnemy = null; var closestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var distance = Math.sqrt(Math.pow(enemy.x - self.x, 2) + Math.pow(enemy.y - self.y, 2)); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } if (closestEnemy) { if (closestEnemy.x < self.x) { // Enemy is to the left, attack left attack.x = self.x - 75; } else { // Enemy is to the right, attack right attack.x = self.x + 75; } } else { attack.x = self.x + 75; } attack.y = self.y - 50; attacks.push(attack); game.addChild(attack); LK.getSound('hit').play(); LK.setTimeout(function () { self.isAttacking = false; }, 400); }; self.specialAttack = function () { if (self.specialCooldown > 0 || self.isAttacking) return; self.isAttacking = true; self.specialCooldown = self.maxSpecialCooldown; // Sword swing animation - dramatic sweep tween(playerGraphics, { rotation: -0.5, scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut }); tween(playerGraphics, { rotation: 0.5 }, { duration: 200, easing: tween.easeInOut }); tween(playerGraphics, { rotation: 0, scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeIn }); var attack = new SpecialAttack(); // Find closest enemy to determine attack direction var closestEnemy = null; var closestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var distance = Math.sqrt(Math.pow(enemy.x - self.x, 2) + Math.pow(enemy.y - self.y, 2)); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } if (closestEnemy) { if (closestEnemy.x < self.x) { // Enemy is to the left, attack left attack.x = self.x - 100; attack.flipLeft = true; } else { // Enemy is to the right, attack right attack.x = self.x + 100; attack.flipLeft = false; } } else { attack.x = self.x + 100; attack.flipLeft = false; } attack.y = self.y - 60; attacks.push(attack); game.addChild(attack); LK.getSound('special').play(); LK.setTimeout(function () { self.isAttacking = false; }, 600); }; self.moveUp = function () { self.y -= self.moveSpeed * 3; if (self.y < 120) self.y = 120; }; self.moveDown = function () { self.y += self.moveSpeed * 3; if (self.y > 2612) self.y = 2612; }; self.moveLeft = function () { self.x -= self.moveSpeed * 3; if (self.x < 40) self.x = 40; }; self.moveRight = function () { self.x += self.moveSpeed * 3; if (self.x > 2008) self.x = 2008; }; self.update = function () { if (self.attackCooldown > 0) { self.attackCooldown--; } if (self.specialCooldown > 0) { self.specialCooldown--; } // Simple movement without obstacle checking if (isUpPressed) { self.y -= self.moveSpeed * 3; if (self.y < 120) self.y = 120; } if (isDownPressed) { self.y += self.moveSpeed * 3; if (self.y > 2612) self.y = 2612; } if (isLeftPressed) { self.x -= self.moveSpeed * 3; if (self.x < 40) self.x = 40; } if (isRightPressed) { self.x += self.moveSpeed * 3; if (self.x > 2008) self.x = 2008; } }; return self; }); var QuickAttack = Container.expand(function () { var self = Container.call(this); var attackGraphics = self.attachAsset('quickAttack', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 25; self.lifetime = 15; // Quarter second at 60fps self.hasHit = false; self.update = function () { self.lifetime--; if (self.lifetime <= 0) { self.destroy(); for (var i = attacks.length - 1; i >= 0; i--) { if (attacks[i] === self) { attacks.splice(i, 1); break; } } } }; return self; }); var SpecialAttack = Container.expand(function () { var self = Container.call(this); self.attackGraphics = null; self.flipLeft = false; self.damage = 100; self.lifetime = 35; // Longest lasting attack self.hasHit = false; self.setDirection = function (flipLeft) { if (self.attackGraphics) { self.removeChild(self.attackGraphics); } if (flipLeft) { self.attackGraphics = self.attachAsset('specialAttack', { anchorX: 0.5, anchorY: 0.5, flipX: 0 }); } else { self.attackGraphics = self.attachAsset('specialAttack', { anchorX: 0.5, anchorY: 0.5, flipX: 1 }); } }; // Initialize with default direction (right) self.setDirection(false); self.update = function () { // Update direction if flipLeft property changes if (self.flipLeft !== undefined && self.attackGraphics) { self.setDirection(self.flipLeft); self.flipLeft = undefined; // Reset to avoid repeated updates } self.lifetime--; if (self.lifetime <= 0) { self.destroy(); for (var i = attacks.length - 1; i >= 0; i--) { if (attacks[i] === self) { attacks.splice(i, 1); break; } } } }; return self; }); var TankEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 1.0, tint: 0xFF0000, // Red tint to distinguish from regular enemy scaleX: 1.3, // Larger size scaleY: 1.3 }); self.health = 100; // Higher health self.damage = 35; // Higher damage self.moveSpeed = -1; // Slower movement self.lastDamageTime = 0; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFFFFFF, 100); if (self.health <= 0) { self.destroy(); for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i] === self) { enemies.splice(i, 1); break; } } LK.setScore(LK.getScore() + 25); // More points for tough enemy scoreTxt.setText(LK.getScore()); // Spawn a new enemy when this one is defeated spawnEnemy(); } }; self.update = function () { if (player) { // Simple movement towards player var moveX = player.x - self.x; var moveY = player.y - self.y; // Normalize movement speed var distance = Math.sqrt(moveX * moveX + moveY * moveY); if (distance > 0) { moveX = moveX / distance * Math.abs(self.moveSpeed); moveY = moveY / distance * Math.abs(self.moveSpeed); } self.x += moveX; self.y += moveY; } else { self.x += self.moveSpeed; } if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { self.destroy(); for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i] === self) { enemies.splice(i, 1); break; } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2F4F4F }); /**** * Game Code ****/ // Create background - only bottom background covering full screen var bottomBackground = LK.getAsset('backgroundBottom', { width: 2048, height: 2732, // Full screen height color: 0x228B22, shape: 'box', x: 0, y: 0 }); game.addChild(bottomBackground); var player; var enemies = []; var attacks = []; var spawnTimer = 0; var gameSpeed = 1; var isUpPressed = false; var isDownPressed = false; var isLeftPressed = false; var isRightPressed = false; var healthPickups = []; // UI Elements var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(1, 0); LK.gui.topRight.addChild(scoreTxt); scoreTxt.x = -50; scoreTxt.y = 50; var healthBarBg = LK.getAsset('healthBarBg', { width: 300, height: 30, color: 0xFF0000, shape: 'box', x: 150, y: 80 }); LK.gui.topLeft.addChild(healthBarBg); var healthBar = LK.getAsset('healthBar', { width: 300, height: 30, color: 0x00FF00, shape: 'box', x: 150, y: 80 }); LK.gui.topLeft.addChild(healthBar); var healthTxt = new Text2('Health', { size: 40, fill: 0xFFFFFF }); healthTxt.anchor.set(0, 0); healthTxt.x = 150; healthTxt.y = 50; LK.gui.topLeft.addChild(healthTxt); var specialCooldownTxt = new Text2('Special Ready', { size: 40, fill: 0x9932CC }); specialCooldownTxt.anchor.set(0, 0); specialCooldownTxt.x = 50; specialCooldownTxt.y = 170; LK.gui.topLeft.addChild(specialCooldownTxt); // Movement arrow buttons (bottom left) var upBtn = new Text2('↑', { size: 200, fill: 0xFFFFFF }); upBtn.anchor.set(0.5, 1); LK.gui.bottomLeft.addChild(upBtn); upBtn.x = 120; upBtn.y = -180; var downBtn = new Text2('↓', { size: 200, fill: 0xFFFFFF }); downBtn.anchor.set(0.5, 1); LK.gui.bottomLeft.addChild(downBtn); downBtn.x = 120; downBtn.y = -50; var leftBtn = new Text2('←', { size: 200, fill: 0xFFFFFF }); leftBtn.anchor.set(0.5, 1); LK.gui.bottomLeft.addChild(leftBtn); leftBtn.x = 50; leftBtn.y = -115; var rightBtn = new Text2('→', { size: 200, fill: 0xFFFFFF }); rightBtn.anchor.set(0.5, 1); LK.gui.bottomLeft.addChild(rightBtn); rightBtn.x = 190; rightBtn.y = -115; // Attack buttons (bottom right) var quickBtn = new Text2('Golpe', { size: 80, fill: 0xFFD700 }); quickBtn.anchor.set(1, 1); LK.gui.bottomRight.addChild(quickBtn); quickBtn.x = -50; quickBtn.y = -50; var heavyBtn = new Text2('Patada', { size: 80, fill: 0xFF6347 }); heavyBtn.anchor.set(1, 1); LK.gui.bottomRight.addChild(heavyBtn); heavyBtn.x = -50; heavyBtn.y = -150; var specialBtn = new Text2('Espada', { size: 80, fill: 0x9932CC }); specialBtn.anchor.set(1, 1); LK.gui.bottomRight.addChild(specialBtn); specialBtn.x = -50; specialBtn.y = -250; // Initialize player player = game.addChild(new Player()); player.x = 1024; // Center horizontally (2048/2) player.y = 1366; // Center vertically (2732/2) // Button event handlers quickBtn.down = function (x, y, obj) { if (player) { player.quickAttack(); } }; heavyBtn.down = function (x, y, obj) { if (player) { player.heavyAttack(); } }; specialBtn.down = function (x, y, obj) { if (player) { player.specialAttack(); } }; // Movement button event handlers - single press movement upBtn.down = function (x, y, obj) { if (player) { var newY = player.y - player.moveSpeed * 10; if (newY < 120) newY = 120; player.y = newY; } }; downBtn.down = function (x, y, obj) { if (player) { var newY = player.y + player.moveSpeed * 10; if (newY > 2612) newY = 2612; player.y = newY; } }; leftBtn.down = function (x, y, obj) { if (player) { var newX = player.x - player.moveSpeed * 10; if (newX < 40) newX = 40; player.x = newX; } }; rightBtn.down = function (x, y, obj) { if (player) { var newX = player.x + player.moveSpeed * 10; if (newX > 2008) newX = 2008; player.x = newX; } }; // Spawn enemies only function spawnEnemy() { // Randomly choose enemy type var enemyType = Math.random(); var enemy; if (enemyType < 0.5) { enemy = new Enemy(); // Regular enemy - 50% chance } else if (enemyType < 0.8) { enemy = new FastEnemy(); // Fast enemy - 30% chance } else { enemy = new TankEnemy(); // Tank enemy - 20% chance } // Spawn enemy from right side if (Math.random() < 0.8) { enemy.x = 2048 + 100; enemy.y = 1366 - Math.random() * 600 + 300; // Center area spawn // Start enemy invisible and fade in gradually enemy.alpha = 0; tween(enemy, { alpha: 1 }, { duration: 1000, easing: tween.easeIn }); enemies.push(enemy); game.addChild(enemy); } else { // Spawn enemy from left side enemy.x = -100; enemy.y = 1366 - Math.random() * 600 + 300; // Center area spawn enemy.moveSpeed = Math.abs(enemy.moveSpeed); // Make moveSpeed positive for left-to-right movement // Start enemy invisible and fade in gradually enemy.alpha = 0; tween(enemy, { alpha: 1 }, { duration: 1000, easing: tween.easeIn }); enemies.push(enemy); game.addChild(enemy); } } // Spawn initial enemies at game start function spawnInitialEnemies() { for (var i = 0; i < 2; i++) { spawnEnemy(); } } // Call initial enemy spawn spawnInitialEnemies(); game.update = function () { // Update game speed over time gameSpeed += 0.001; // Enemy spawning is now handled when enemies are defeated (see Enemy class takeDamage method) // Update UI if (player) { // Update health bar var healthPercent = player.health / player.maxHealth; healthBar.width = 300 * healthPercent; healthBar.tint = healthPercent > 0.5 ? 0x00FF00 : healthPercent > 0.25 ? 0xFFFF00 : 0xFF0000; if (player.specialCooldown > 0) { specialCooldownTxt.setText('Special: ' + Math.ceil(player.specialCooldown / 60) + 's'); } else { specialCooldownTxt.setText('Special Ready'); } // Check if health is zero for game over if (player.health <= 0) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } } // Check collisions between player and enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; if (player && player.intersects(enemy)) { if (LK.ticks - enemy.lastDamageTime > 60) { // Damage once per second player.takeDamage(enemy.damage); enemy.lastDamageTime = LK.ticks; } } } // Spawn health pickups when player health is low if (player && player.health < 30 && Math.random() < 0.002) { var isLarge = Math.random() < 0.3; // 30% chance for large pickup var pickup = new HealthPickup(); pickup.init(isLarge); pickup.x = 200 + Math.random() * 1600; pickup.y = 200 + Math.random() * 2200; healthPickups.push(pickup); game.addChild(pickup); } // Check collisions between player and health pickups for (var i = healthPickups.length - 1; i >= 0; i--) { var pickup = healthPickups[i]; if (player && player.intersects(pickup)) { if (pickup.isLarge) { player.health = player.maxHealth; // Full heal } else { player.health = Math.min(player.maxHealth, player.health + 50); // Half heal } pickup.destroy(); healthPickups.splice(i, 1); } } // Check collisions between attacks and enemies for (var i = attacks.length - 1; i >= 0; i--) { var attack = attacks[i]; if (attack.hasHit) continue; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (attack.intersects(enemy)) { enemy.takeDamage(attack.damage); attack.hasHit = true; break; } } } // Score is only updated when enemies are defeated };
===================================================================
--- original.js
+++ change.js
@@ -60,8 +60,64 @@
}
};
return self;
});
+var FastEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 1.0,
+ tint: 0x00FF00 // Green tint to distinguish from regular enemy
+ });
+ self.health = 25; // Lower health
+ self.damage = 15; // Lower damage
+ self.moveSpeed = -4; // Faster movement
+ self.lastDamageTime = 0;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xFFFFFF, 100);
+ if (self.health <= 0) {
+ self.destroy();
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ if (enemies[i] === self) {
+ enemies.splice(i, 1);
+ break;
+ }
+ }
+ LK.setScore(LK.getScore() + 15); // More points for faster enemy
+ scoreTxt.setText(LK.getScore());
+ // Spawn a new enemy when this one is defeated
+ spawnEnemy();
+ }
+ };
+ self.update = function () {
+ if (player) {
+ // Simple movement towards player
+ var moveX = player.x - self.x;
+ var moveY = player.y - self.y;
+ // Normalize movement speed
+ var distance = Math.sqrt(moveX * moveX + moveY * moveY);
+ if (distance > 0) {
+ moveX = moveX / distance * Math.abs(self.moveSpeed);
+ moveY = moveY / distance * Math.abs(self.moveSpeed);
+ }
+ self.x += moveX;
+ self.y += moveY;
+ } else {
+ self.x += self.moveSpeed;
+ }
+ if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
+ self.destroy();
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ if (enemies[i] === self) {
+ enemies.splice(i, 1);
+ break;
+ }
+ }
+ }
+ };
+ return self;
+});
var HealthPickup = Container.expand(function () {
var self = Container.call(this);
self.isLarge = false;
self.healAmount = 0;
@@ -401,8 +457,68 @@
}
};
return self;
});
+var TankEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 1.0,
+ tint: 0xFF0000,
+ // Red tint to distinguish from regular enemy
+ scaleX: 1.3,
+ // Larger size
+ scaleY: 1.3
+ });
+ self.health = 100; // Higher health
+ self.damage = 35; // Higher damage
+ self.moveSpeed = -1; // Slower movement
+ self.lastDamageTime = 0;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xFFFFFF, 100);
+ if (self.health <= 0) {
+ self.destroy();
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ if (enemies[i] === self) {
+ enemies.splice(i, 1);
+ break;
+ }
+ }
+ LK.setScore(LK.getScore() + 25); // More points for tough enemy
+ scoreTxt.setText(LK.getScore());
+ // Spawn a new enemy when this one is defeated
+ spawnEnemy();
+ }
+ };
+ self.update = function () {
+ if (player) {
+ // Simple movement towards player
+ var moveX = player.x - self.x;
+ var moveY = player.y - self.y;
+ // Normalize movement speed
+ var distance = Math.sqrt(moveX * moveX + moveY * moveY);
+ if (distance > 0) {
+ moveX = moveX / distance * Math.abs(self.moveSpeed);
+ moveY = moveY / distance * Math.abs(self.moveSpeed);
+ }
+ self.x += moveX;
+ self.y += moveY;
+ } else {
+ self.x += self.moveSpeed;
+ }
+ if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
+ self.destroy();
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ if (enemies[i] === self) {
+ enemies.splice(i, 1);
+ break;
+ }
+ }
+ }
+ };
+ return self;
+});
/****
* Initialize Game
****/
@@ -585,11 +701,20 @@
}
};
// Spawn enemies only
function spawnEnemy() {
+ // Randomly choose enemy type
+ var enemyType = Math.random();
+ var enemy;
+ if (enemyType < 0.5) {
+ enemy = new Enemy(); // Regular enemy - 50% chance
+ } else if (enemyType < 0.8) {
+ enemy = new FastEnemy(); // Fast enemy - 30% chance
+ } else {
+ enemy = new TankEnemy(); // Tank enemy - 20% chance
+ }
// Spawn enemy from right side
if (Math.random() < 0.8) {
- var enemy = new Enemy();
enemy.x = 2048 + 100;
enemy.y = 1366 - Math.random() * 600 + 300; // Center area spawn
// Start enemy invisible and fade in gradually
enemy.alpha = 0;
@@ -602,12 +727,11 @@
enemies.push(enemy);
game.addChild(enemy);
} else {
// Spawn enemy from left side
- var enemy = new Enemy();
enemy.x = -100;
enemy.y = 1366 - Math.random() * 600 + 300; // Center area spawn
- enemy.moveSpeed = 2; // Move right instead of left
+ enemy.moveSpeed = Math.abs(enemy.moveSpeed); // Make moveSpeed positive for left-to-right movement
// Start enemy invisible and fade in gradually
enemy.alpha = 0;
tween(enemy, {
alpha: 1
pandillero que quiere pelear a puño limpio. In-Game asset. 2d. High contrast. No shadows
cristal verde de tamaño grande. In-Game asset. 2d. High contrast. No shadows
una calle de una ciudad peligrosa con edificios viejos en la parte de arriba. In-Game asset. 2d. High contrast. No shadows
barra de salud de color verde. In-Game asset. 2d. High contrast. No shadows
hombre con camisa negra de manga larga, pantalones negros, botas negras y guantes negros y un pasamontañas negro dando un puñetazo.. In-Game asset. 2d. High contrast. No shadows
hombre con camisa negra de manga larga, pantalones negros, botas negras y guantes negros y un pasamontañas negro dando una patada de artes marciales In-Game asset. 2d. High contrast. No shadows
hombre con camisa negra de manga larga, pantalones negros, botas negras y guantes negros y un pasamontañas negro atacando con una katana con un mango negro. In-Game asset. 2d. High contrast. No shadows
hombre con camisa negra de manga larga, pantalones negros, botas negras y guantes negros y un pasamontañas negro en posicion de combate. In-Game asset. 2d. High contrast. No shadows