User prompt
then make it follow my mouse without clickink
User prompt
Please fix the bug: 'TypeError: LK.isGameOver is not a function' in or related to this line: 'if (!LK.isGameOver()) {' Line Number: 411
User prompt
Please fix the bug: 'TypeError: LK.isGameOver is not a function' in or related to this line: 'if (!LK.isGameOver()) {' Line Number: 411
Code edit (1 edits merged)
Please save this source code
User prompt
Pixel Horde Survivors
Initial prompt
Make me a pixel art game like "Vampire Survivors"
/****
* 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.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 = 6 + Math.random() * 4; // randomize a bit
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;
});
// 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: 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 enemy = new Enemy();
var edge = Math.floor(Math.random() * 4);
var x, y;
if (edge === 0) {
// top
x = Math.random() * 2048;
y = -100;
} else if (edge === 1) {
// right
x = 2048 + 100;
y = Math.random() * 2732;
} else if (edge === 2) {
// bottom
x = Math.random() * 2048;
y = 2732 + 100;
} else {
// left
x = -100;
y = Math.random() * 2732;
}
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;
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 = 24; // ticks between shots
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);
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);
}
}
}
// 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(8, autoAttackInterval - 2);
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;
fireBullet(dx, dy);
} else {
// No enemy, fire random
var dir = randomDir();
fireBullet(dir.x, dir.y);
}
}
// 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
@@ -100,14 +100,14 @@
/****
* Game Code
****/
-// Game state variables
-// Hero
-// Enemy
-// Bullet
-// Experience Gem
// Powerup
+// Experience Gem
+// Bullet
+// Enemy
+// Hero
+// Game state variables
var hero;
var enemies = [];
var bullets = [];
var gems = [];
@@ -234,12 +234,11 @@
hero.targetY = y;
dragging = true;
};
game.move = function (x, y, obj) {
- if (dragging) {
- hero.targetX = x;
- hero.targetY = y;
- }
+ // Always update hero's target position to follow the pointer
+ hero.targetX = x;
+ hero.targetY = y;
};
game.up = function (x, y, obj) {
dragging = false;
};
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