User prompt
use enemy_right asset for enemies which coming from right half of the screen
User prompt
use enemy_right asset for enemies which coming from right side of the screen
User prompt
use enemy_right asset for enemies which coming from right
User prompt
make enemies face up to hero
User prompt
make texts smaller
User prompt
make hero speed 15
User prompt
add a timer to top right corner
User prompt
decrease hero speed to 5
User prompt
increase hero movement speed %100
User prompt
decrease attack speed by %100
User prompt
decrease attack speed,bullet speed, enemy speed by %100
User prompt
decrease the attack speed rate by %50
User prompt
add auto aim
User prompt
remove autofire
User prompt
fire by clicking
User prompt
use enemy_right asset for the enemies which coming from right side of the screen
User prompt
remove the powerup class thing
User prompt
Add a magnet power-up that appears at a random location on the screen every 10 seconds and attracts XP from further away into the player
User prompt
At level 2 make the bullet spread narrower but make it wider as you level up
User prompt
make enemies slower
User prompt
make it little bit wider
User prompt
decrease bullet spread
User prompt
add extra bullets each level up
User prompt
add bullet pierce
User prompt
add attack speed upgrade each time I level up
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletSprite = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 18; self.speed = 38; self.dirX = 1; self.dirY = 0; self.pierce = 1; // Number of enemies bullet can hit before being destroyed (default 1) self.update = function () { self.x += self.dirX * self.speed; self.y += self.dirY * self.speed; }; return self; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemySprite = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 50; self.speed = 3 + Math.random() * 2; // enemies are slower now self.update = function () { // Move toward hero var dx = hero.x - self.x; var dy = hero.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } }; return self; }); // Experience Gem class var Gem = Container.expand(function () { var self = Container.call(this); var gemSprite = self.attachAsset('xp_gem', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 20; self.update = function () {}; return self; }); // Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroSprite = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 60; // for collision self.speed = 18; // movement speed per tick self.targetX = 1024; self.targetY = 1366; self.update = function () { // Move towards targetX, targetY (set by touch/mouse) var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 10) { var move = Math.min(self.speed, dist); self.x += dx / dist * move; self.y += dy / dist * move; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181818 }); /**** * Game Code ****/ // Game state variables // Hero // Enemy // Bullet // Experience Gem // Powerup var hero; var enemies = []; var bullets = []; var gems = []; var spawnTimer = 0; var spawnInterval = 90; // ticks between spawns, will decrease var wave = 1; var xp = 0; var xpToLevel = 10; var level = 1; var dragging = false; var lastGameOver = false; var scoreTxt, xpTxt, levelTxt; // Center positions var centerX = 2048 / 2; var centerY = 2732 / 2; // Create hero hero = new Hero(); hero.x = centerX; hero.y = centerY; game.addChild(hero); // GUI: Score (time survived) scoreTxt = new Text2('Score: 0', { size: 90, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // GUI: XP xpTxt = new Text2('XP: 0/10', { size: 60, fill: 0x7BE495 }); xpTxt.anchor.set(0.5, 0); LK.gui.top.addChild(xpTxt); xpTxt.y = 110; // GUI: Level levelTxt = new Text2('Level: 1', { size: 60, fill: 0xF7E967 }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 180; // Helper: spawn enemy at random edge function spawnEnemy() { var edge = Math.floor(Math.random() * 4); var x, y; var enemy; if (edge === 0) { // top x = Math.random() * 2048; y = -100; enemy = new Enemy(); } else if (edge === 1) { // right x = 2048 + 100; y = Math.random() * 2732; enemy = new Enemy(); if (enemy.children && enemy.children.length > 0) { // Replace the enemy sprite with enemy_right asset enemy.removeChildAt(0); } var enemyRightSprite = enemy.attachAsset('enemy_right', { anchorX: 0.5, anchorY: 0.5 }); } else if (edge === 2) { // bottom x = Math.random() * 2048; y = 2732 + 100; enemy = new Enemy(); } else { // left x = -100; y = Math.random() * 2732; enemy = new Enemy(); } enemy.x = x; enemy.y = y; enemies.push(enemy); game.addChild(enemy); } // Helper: spawn gem at (x, y) function spawnGem(x, y) { var gem = new Gem(); gem.x = x; gem.y = y; gems.push(gem); game.addChild(gem); } // Helper: fire bullet in direction (dx, dy) function fireBullet(dx, dy) { var bullet = new Bullet(); bullet.x = hero.x; bullet.y = hero.y; bullet.pierce = Bullet.prototype.pierce || 1; var dist = Math.sqrt(dx * dx + dy * dy); if (dist === 0) { bullet.dirX = 1; bullet.dirY = 0; } else { bullet.dirX = dx / dist; bullet.dirY = dy / dist; } bullet.rotation = Math.atan2(bullet.dirY, bullet.dirX); bullets.push(bullet); game.addChild(bullet); } // Helper: get random direction function randomDir() { var angle = Math.random() * Math.PI * 2; return { x: Math.cos(angle), y: Math.sin(angle) }; } // Helper: distance between two objects function dist2(a, b) { var dx = a.x - b.x; var dy = a.y - b.y; return Math.sqrt(dx * dx + dy * dy); } // Handle movement (touch/mouse) game.down = function (x, y, obj) { // Don't allow drag in top left 100x100 if (x < 100 && y < 100) return; hero.targetX = x; hero.targetY = y; dragging = true; }; game.move = function (x, y, obj) { // Always update hero's target position to follow the pointer hero.targetX = x; hero.targetY = y; }; game.up = function (x, y, obj) { dragging = false; }; // Main update loop var ticksSurvived = 0; var autoAttackTimer = 0; var autoAttackInterval = 48; // ticks between shots (decreased attack speed by 50%) game.update = function () { // Update hero hero.update(); // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.update(); // Check collision with hero if (dist2(e, hero) < e.radius + hero.radius) { if (!lastGameOver) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); lastGameOver = true; } return; } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); // Remove if out of bounds if (b.x < -100 || b.x > 2148 || b.y < -100 || b.y > 2832) { b.destroy(); bullets.splice(i, 1); continue; } // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; if (dist2(b, e) < b.radius + e.radius) { // Enemy dies, spawn gem spawnGem(e.x, e.y); e.destroy(); enemies.splice(j, 1); // Bullet pierce logic b.pierce -= 1; if (b.pierce <= 0) { b.destroy(); bullets.splice(i, 1); } break; } } } // Update gems for (var i = gems.length - 1; i >= 0; i--) { var g = gems[i]; // If close to hero, attract var d = dist2(g, hero); if (d < 300) { var dx = hero.x - g.x; var dy = hero.y - g.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { g.x += dx / dist * 18; g.y += dy / dist * 18; } } // Collect if (dist2(g, hero) < g.radius + hero.radius) { xp += 1; g.destroy(); gems.splice(i, 1); // Level up if (xp >= xpToLevel) { level += 1; xp = 0; xpToLevel = 10 + level * 4; // Show level up effect LK.effects.flashObject(hero, 0xf7e967, 600); // Attack speed upgrade on level up autoAttackInterval = Math.max(12, autoAttackInterval - 2); // minimum interval is now 12 ticks (was 6) // Bullet pierce upgrade on level up Bullet.prototype.pierce = (Bullet.prototype.pierce || 1) + 1; } } } // Auto-attack: fire bullet at nearest enemy autoAttackTimer++; if (autoAttackTimer >= autoAttackInterval) { autoAttackTimer = 0; // Find nearest enemy var nearest = null, minDist = 99999; for (var i = 0; i < enemies.length; i++) { var e = enemies[i]; var d = dist2(hero, e); if (d < minDist) { minDist = d; nearest = e; } } if (nearest) { var dx = nearest.x - hero.x; var dy = nearest.y - hero.y; // Fire multiple bullets in a spread, based on level var extraBullets = Math.max(0, level - 1); var totalBullets = 1 + extraBullets; // At level 2, spread is narrower, then increases as you level up var spread; if (level === 2) { spread = Math.PI / 32; // narrower at level 2 } else if (level > 2) { spread = Math.PI / 32 + (level - 2) * Math.PI / 48; // increases with level // Cap spread to a reasonable max (e.g. 45 degrees) if (spread > Math.PI / 4) spread = Math.PI / 4; } else { spread = Math.PI / 16; // default for level 1 } var baseAngle = Math.atan2(dy, dx); for (var b = 0; b < totalBullets; b++) { var angle = baseAngle; if (totalBullets > 1) { angle = baseAngle - spread / 2 + spread * b / (totalBullets - 1); } var dirX = Math.cos(angle); var dirY = Math.sin(angle); fireBullet(dirX, dirY); } } else { // No enemy, fire random var extraBullets = Math.max(0, level - 1); var totalBullets = 1 + extraBullets; // At level 2, spread is narrower, then increases as you level up var spread; if (level === 2) { spread = Math.PI / 32; } else if (level > 2) { spread = Math.PI / 32 + (level - 2) * Math.PI / 48; if (spread > Math.PI / 4) spread = Math.PI / 4; } else { spread = Math.PI / 16; } var baseAngle = Math.random() * Math.PI * 2; for (var b = 0; b < totalBullets; b++) { var angle = baseAngle; if (totalBullets > 1) { angle = baseAngle - spread / 2 + spread * b / (totalBullets - 1); } var dirX = Math.cos(angle); var dirY = Math.sin(angle); fireBullet(dirX, dirY); } } } // Enemy spawn logic spawnTimer++; if (spawnTimer >= spawnInterval) { spawnTimer = 0; // Spawn more enemies as time goes on var toSpawn = 1 + Math.floor(wave / 3); for (var i = 0; i < toSpawn; i++) { spawnEnemy(); } wave++; // Decrease interval to increase difficulty, min 24 spawnInterval = Math.max(24, 90 - Math.floor(wave / 2)); } // Update GUI ticksSurvived++; scoreTxt.setText('Score: ' + Math.floor(ticksSurvived / 60)); xpTxt.setText('XP: ' + xp + '/' + xpToLevel); levelTxt.setText('Level: ' + level); // Reset game over flag if game is running if (hero && hero.parent) lastGameOver = false; };
===================================================================
--- original.js
+++ change.js
@@ -90,38 +90,14 @@
/****
* Game Code
****/
-// Auto-aim: fire at nearest enemy if one exists
-autoAttackTimer++;
-if (autoAttackTimer >= autoAttackInterval && enemies.length > 0) {
- autoAttackTimer = 0;
- // Find nearest enemy
- var nearest = null;
- var minDist = Infinity;
- for (var i = 0; i < enemies.length; i++) {
- var e = enemies[i];
- var d = dist2(hero, e);
- if (d < minDist) {
- minDist = d;
- nearest = e;
- }
- }
- if (nearest) {
- var dx = nearest.x - hero.x;
- var dy = nearest.y - hero.y;
- // Only fire if the enemy is not exactly on the hero
- if (dx !== 0 || dy !== 0) {
- fireBullet(dx, dy);
- }
- }
-}
-// Autofire removed
-// Experience Gem
-// Bullet
-// Enemy
-// Hero
// Game state variables
+// Hero
+// Enemy
+// Bullet
+// Experience Gem
+// Powerup
var hero;
var enemies = [];
var bullets = [];
var gems = [];
@@ -250,15 +226,8 @@
if (x < 100 && y < 100) return;
hero.targetX = x;
hero.targetY = y;
dragging = true;
- // Fire a bullet in the direction of the pointer
- var dx = x - hero.x;
- var dy = y - hero.y;
- // Only fire if the tap/click is not directly on the hero (avoid zero direction)
- if (dx !== 0 || dy !== 0) {
- fireBullet(dx, dy);
- }
};
game.move = function (x, y, obj) {
// Always update hero's target position to follow the pointer
hero.targetX = x;
@@ -269,9 +238,9 @@
};
// Main update loop
var ticksSurvived = 0;
var autoAttackTimer = 0;
-var autoAttackInterval = 24; // ticks between shots
+var autoAttackInterval = 48; // ticks between shots (decreased attack speed by 50%)
game.update = function () {
// Update hero
hero.update();
// Update enemies
@@ -342,15 +311,82 @@
xpToLevel = 10 + level * 4;
// Show level up effect
LK.effects.flashObject(hero, 0xf7e967, 600);
// Attack speed upgrade on level up
- autoAttackInterval = Math.max(6, autoAttackInterval - 2);
+ autoAttackInterval = Math.max(12, autoAttackInterval - 2); // minimum interval is now 12 ticks (was 6)
// Bullet pierce upgrade on level up
Bullet.prototype.pierce = (Bullet.prototype.pierce || 1) + 1;
}
}
}
- // Autofire removed
+ // Auto-attack: fire bullet at nearest enemy
+ autoAttackTimer++;
+ if (autoAttackTimer >= autoAttackInterval) {
+ autoAttackTimer = 0;
+ // Find nearest enemy
+ var nearest = null,
+ minDist = 99999;
+ for (var i = 0; i < enemies.length; i++) {
+ var e = enemies[i];
+ var d = dist2(hero, e);
+ if (d < minDist) {
+ minDist = d;
+ nearest = e;
+ }
+ }
+ if (nearest) {
+ var dx = nearest.x - hero.x;
+ var dy = nearest.y - hero.y;
+ // Fire multiple bullets in a spread, based on level
+ var extraBullets = Math.max(0, level - 1);
+ var totalBullets = 1 + extraBullets;
+ // At level 2, spread is narrower, then increases as you level up
+ var spread;
+ if (level === 2) {
+ spread = Math.PI / 32; // narrower at level 2
+ } else if (level > 2) {
+ spread = Math.PI / 32 + (level - 2) * Math.PI / 48; // increases with level
+ // Cap spread to a reasonable max (e.g. 45 degrees)
+ if (spread > Math.PI / 4) spread = Math.PI / 4;
+ } else {
+ spread = Math.PI / 16; // default for level 1
+ }
+ var baseAngle = Math.atan2(dy, dx);
+ for (var b = 0; b < totalBullets; b++) {
+ var angle = baseAngle;
+ if (totalBullets > 1) {
+ angle = baseAngle - spread / 2 + spread * b / (totalBullets - 1);
+ }
+ var dirX = Math.cos(angle);
+ var dirY = Math.sin(angle);
+ fireBullet(dirX, dirY);
+ }
+ } else {
+ // No enemy, fire random
+ var extraBullets = Math.max(0, level - 1);
+ var totalBullets = 1 + extraBullets;
+ // At level 2, spread is narrower, then increases as you level up
+ var spread;
+ if (level === 2) {
+ spread = Math.PI / 32;
+ } else if (level > 2) {
+ spread = Math.PI / 32 + (level - 2) * Math.PI / 48;
+ if (spread > Math.PI / 4) spread = Math.PI / 4;
+ } else {
+ spread = Math.PI / 16;
+ }
+ var baseAngle = Math.random() * Math.PI * 2;
+ for (var b = 0; b < totalBullets; b++) {
+ var angle = baseAngle;
+ if (totalBullets > 1) {
+ angle = baseAngle - spread / 2 + spread * b / (totalBullets - 1);
+ }
+ var dirX = Math.cos(angle);
+ var dirY = Math.sin(angle);
+ fireBullet(dirX, dirY);
+ }
+ }
+ }
// Enemy spawn logic
spawnTimer++;
if (spawnTimer >= spawnInterval) {
spawnTimer = 0;
16x16 pixel wounded guy holding pistol. In-Game asset. 2d. High contrast. No shadows. pixel art. retro arcade game
3x3 pixel green coin. In-Game asset. 2d. High contrast. No shadows. retro arcade. Pixel art
3x3 pixel blue coin. In-Game asset. 2d. High contrast. No shadows. Pixel art. retro arcade
4x4 pixel art heart. In-Game asset. 2d. High contrast. No shadows. retro arcade. Pixel art. 8 bit
fill the circle with yellow colour
remove cars and buildings
Create an 8-bit style effect representing a magnetic power-up area. The effect should be a circular, glowing field with a soft, pulsing light. The colors should be green and blue, with a slight gradient effect to indicate the area where objects (such as coins or experience points) are attracted towards the character. The circle should have a subtle flicker to show the magnetic pull, and it should be designed to fit within the retro, pixel-art aesthetic of an 8-bit game. In-Game asset. 2d. High contrast. No shadows
Vertical windowed filled rectangle HUD for the 2d zombie theme game. Use green colours. Do not make it too much pixelated. In-Game asset. 2d. High contrast. No shadows. No text. No icon. No background Transparent.Retro arcade theme.
windowed filled rectangle HUD button for the 2d pixel art zombie theme game. Use dark green colours. In-Game asset. 2d. High contrast. No shadows. No text. No icon. No background Transparent.Retro arcade theme.
pixelart magnet In-Game asset. 2d. High contrast. No shadows. Pixel art
pixelart red circular enemy projectile to dodge In-Game asset. 2d. High contrast. No shadows. Pixel art
pixelart yellow circular bullet to shoot enemies In-Game asset. 2d. High contrast. No shadows. Pixel art
pixelart blue circular enemy projectile to dodge In-Game asset. 2d. High contrast. No shadows. Pixel art
4x4pixel bow and arrow. In-Game asset. 2d. High contrast. No shadows. Black outline
8x8 pixel movement speed powerup icon. boot with wings. In-Game asset. 2d. High contrast. No shadows. Black outline