User prompt
make it 6x6
User prompt
make it 5x5
User prompt
make it 10x10
User prompt
make them way bigger
User prompt
add building from assets to the top left and right corner
User prompt
remove building and car assets
User prompt
a bit darker grey
User prompt
make background colour grey
User prompt
dont change its position every game make them stable
User prompt
make them bigger and position randomly the corner areas of screen
User prompt
add buildings from assets to the top left and right corner and car from assets to the bottom left and right corner
User prompt
add some cars and buildings to it
User prompt
Can u add post post-apocalyptic background
User prompt
rename powerup asset as big_xp_gem
User prompt
make purple power ups give hero 5 xp
User prompt
when the herp goes left, use the hero_left asset for hero just like u did on zombies
User prompt
rename hero asset as hero_right
User prompt
Use the appropriate assets according to the hero's position to make sure that the zombies are facing the hero on the horizontal axis.
User prompt
change names of assets with each other enemy_left and enemy_right
User prompt
Use the appropriate assets according to the hero's position to make sure that the zombies are facing the hero on the horizontal axis.
User prompt
If the hero is on the right of the zombie, use the enemy asset, if he is on the left, convert it to the enemy_right asset. In short make them look the side of hero using the correct assets
User prompt
rename enemy asset with enemy_left
User prompt
I cant see the assets while playing
User prompt
If the hero is on the right of the zombie, use the enemy asset, if he is on the left, convert it to the enemy_right asset.(eril)
User prompt
and make the enemies face up to hero on horizontal axis using the right and left assets
/**** * 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 = 19; // Decreased bullet speed by 100% 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_right', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 50; self.speed = 1.5 + Math.random(); // Decreased enemy speed by 100% 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; } // Face the hero horizontally if (self.children && self.children.length > 0) { var currentSprite = self.children[0]; // If hero is to the right of enemy, use enemy_right, else enemy_left var shouldFaceRight = hero.x > self.x; var isLeftSprite = currentSprite.assetId === 'enemy_left'; var isRightSprite = currentSprite.assetId === 'enemy_right'; if (shouldFaceRight && !isRightSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('enemy_right', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'enemy_right'; } else if (!shouldFaceRight && !isLeftSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('enemy_left', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'enemy_left'; } } }; 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_right', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 60; // for collision self.speed = 15; // movement speed per tick (set to 15) 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); var prevX = self.x; self.x += dx / dist * move; self.y += dy / dist * move; // Change hero sprite based on movement direction if (self.children && self.children.length > 0) { var currentSprite = self.children[0]; var isLeftSprite = currentSprite.assetId === 'hero_left'; var isRightSprite = currentSprite.assetId === 'hero_right'; if (self.x < prevX && !isLeftSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('hero_left', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'hero_left'; } else if (self.x > prevX && !isRightSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('hero_right', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'hero_right'; } } } }; return self; }); // Powerup class var Powerup = Container.expand(function () { var self = Container.call(this); var powerupSprite = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 30; self.update = function () {}; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181818 }); /**** * Game Code ****/ // Powerup // Experience Gem // Bullet // Enemy // Hero // Game state variables var hero; var enemies = []; var bullets = []; var gems = []; var powerups = []; 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: 54, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // GUI: Timer (top right) var timerTxt = new Text2('00:00', { size: 54, fill: "#fff" }); timerTxt.anchor.set(1, 0); // right aligned, top LK.gui.topRight.addChild(timerTxt); // GUI: XP xpTxt = new Text2('XP: 0/10', { size: 36, fill: 0x7BE495 }); xpTxt.anchor.set(0.5, 0); LK.gui.top.addChild(xpTxt); xpTxt.y = 110; // GUI: Level levelTxt = new Text2('Level: 1', { size: 36, 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 useRight = false; if (edge === 0) { // top x = Math.random() * 2048; y = -100; if (x > 1024) useRight = true; } else if (edge === 1) { // right x = 2048 + 100; y = Math.random() * 2732; useRight = true; } else if (edge === 2) { // bottom x = Math.random() * 2048; y = 2732 + 100; if (x > 1024) useRight = true; } else { // left x = -100; y = Math.random() * 2732; // useRight remains false } var enemy = new Enemy(); if (useRight && enemy.children && enemy.children.length > 0) { // Replace the enemy's sprite with enemy_left asset var oldSprite = enemy.children[0]; enemy.removeChild(oldSprite); var enemyLeftSprite = enemy.attachAsset('enemy_left', { anchorX: 0.5, anchorY: 0.5 }); } 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: spawn powerup at (x, y) function spawnPowerup(x, y) { var powerup = new Powerup(); powerup.x = x; powerup.y = y; powerups.push(powerup); game.addChild(powerup); } // 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 100% 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); // Chance to spawn powerup if (Math.random() < 0.08) { spawnPowerup(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); // Powerup on level up spawnPowerup(hero.x + (Math.random() - 0.5) * 200, hero.y + (Math.random() - 0.5) * 200); // Attack speed upgrade on level up autoAttackInterval = Math.max(12, autoAttackInterval - 4); // double minimum and decrement for 100% slower attack speed // Bullet pierce upgrade on level up Bullet.prototype.pierce = (Bullet.prototype.pierce || 1) + 1; } } } // Update powerups for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; // Attract if close var d = dist2(p, hero); if (d < 300) { var dx = hero.x - p.x; var dy = hero.y - p.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { p.x += dx / dist * 12; p.y += dy / dist * 12; } } // Collect if (dist2(p, hero) < p.radius + hero.radius) { // Powerup: random effect (for MVP, just increase fire rate or speed) if (Math.random() < 0.5) { // Increase fire rate autoAttackInterval = Math.max(16, autoAttackInterval - 4); // double minimum and decrement for 100% slower attack speed LK.effects.flashObject(hero, 0x8e44ad, 400); } else { // Increase move speed hero.speed += 2; LK.effects.flashObject(hero, 0x7be495, 400); } p.destroy(); powerups.splice(i, 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); // Update timer text (mm:ss) var totalSeconds = Math.floor(ticksSurvived / 60); var minutes = Math.floor(totalSeconds / 60); var seconds = totalSeconds % 60; var minStr = minutes < 10 ? '0' + minutes : '' + minutes; var secStr = seconds < 10 ? '0' + seconds : '' + seconds; timerTxt.setText(minStr + ':' + secStr); // Reset game over flag if game is running if (hero && hero.parent) lastGameOver = false; };
===================================================================
--- original.js
+++ change.js
@@ -96,10 +96,32 @@
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 10) {
var move = Math.min(self.speed, dist);
+ var prevX = self.x;
self.x += dx / dist * move;
self.y += dy / dist * move;
+ // Change hero sprite based on movement direction
+ if (self.children && self.children.length > 0) {
+ var currentSprite = self.children[0];
+ var isLeftSprite = currentSprite.assetId === 'hero_left';
+ var isRightSprite = currentSprite.assetId === 'hero_right';
+ if (self.x < prevX && !isLeftSprite) {
+ self.removeChild(currentSprite);
+ var newSprite = self.attachAsset('hero_left', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ newSprite.assetId = 'hero_left';
+ } else if (self.x > prevX && !isRightSprite) {
+ self.removeChild(currentSprite);
+ var newSprite = self.attachAsset('hero_right', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ newSprite.assetId = 'hero_right';
+ }
+ }
}
};
return self;
});
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