User prompt
make magnet collect all xp in the screen at once and remove the timer
User prompt
make it %1
User prompt
make it %0.5
User prompt
decrease magnet drop rate %500
User prompt
make big xp gems drop often %100
User prompt
magnet asset should not be attracted with magnet effect
User prompt
make the hero glow blue when magnet active
User prompt
show timer for magnet effect
User prompt
increase the size of magnet effect
Code edit (1 edits merged)
Please save this source code
User prompt
add asset for magnet power up when drop
User prompt
hero is invincible now dont lose hp when touch fix that
User prompt
he still dies when touch zombie fix that
User prompt
add 3 lives to hero
Code edit (1 edits merged)
Please save this source code
User prompt
he still dies when I touch to the zombie fix that
User prompt
make 3 lives for hero and show it as text
User prompt
add 3 hitpoint to hero
Code edit (1 edits merged)
Please save this source code
User prompt
remove the assets from corners
User prompt
add zombie bosses which is bigger version of zombie assets at the end of every 5 level
User prompt
no just use one asset but make it fill the screen
User prompt
use the "yol" asset as a background all over the screen
User prompt
remove buildings and building assets
User prompt
make it 6x6
/**** * 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; self.dirX = 1; self.dirY = 0; self.pierce = 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(); self.update = function () { 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; } if (self.children && self.children.length > 0) { var currentSprite = self.children[0]; 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; self.speed = 15; self.targetX = 1024; self.targetY = 1366; self.magnetActive = false; self.magnetDuration = 0; self.magnetRange = 300; self.magnetRangeBoosted = 600; self.update = function () { 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; 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'; } } } if (self.magnetActive) { self.magnetDuration--; if (self.magnetDuration <= 0) { self.magnetActive = false; LK.effects.flashObject(self, 0xff0000, 600); } } }; return self; }); // Powerup class var Powerup = Container.expand(function () { var self = Container.call(this); var powerupSprite = self.attachAsset('big_xp_gem', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 30; self.update = function () {}; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x444444 }); /**** * Game Code ****/ var hero; var enemies = []; var bullets = []; var gems = []; var powerups = []; var spawnTimer = 0; var spawnInterval = 90; var wave = 1; var xp = 0; var xpToLevel = 10; var level = 1; var dragging = false; var lastGameOver = false; var scoreTxt, xpTxt, levelTxt; var centerX = 2048 / 2; var centerY = 2732 / 2; hero = new Hero(); hero.x = centerX; hero.y = centerY; game.addChild(hero); scoreTxt = new Text2('Score: 0', { size: 54, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var timerTxt = new Text2('00:00', { size: 54, fill: "#fff" }); timerTxt.anchor.set(1, 0); LK.gui.topRight.addChild(timerTxt); xpTxt = new Text2('XP: 0/10', { size: 36, fill: 0x7BE495 }); xpTxt.anchor.set(0.5, 0); LK.gui.top.addChild(xpTxt); xpTxt.y = 110; levelTxt = new Text2('Level: 1', { size: 36, fill: 0xF7E967 }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 180; function spawnEnemy() { var edge = Math.floor(Math.random() * 4); var x, y; var useRight = false; if (edge === 0) { x = Math.random() * 2048; y = -100; if (x > 1024) { useRight = true; } } else if (edge === 1) { x = 2048 + 100; y = Math.random() * 2732; useRight = true; } else if (edge === 2) { x = Math.random() * 2048; y = 2732 + 100; if (x > 1024) { useRight = true; } } else { x = -100; y = Math.random() * 2732; } var enemy = new Enemy(); if (useRight && enemy.children && enemy.children.length > 0) { 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); } function spawnGem(x, y) { var gem = new Gem(); gem.x = x; gem.y = y; gems.push(gem); game.addChild(gem); } function spawnMagnetPowerup(x, y) { var powerup = new Powerup(); powerup.x = x; powerup.y = y; powerup.isMagnet = true; powerups.push(powerup); game.addChild(powerup); } function spawnPowerup(x, y) { var powerup = new Powerup(); powerup.x = x; powerup.y = y; powerups.push(powerup); game.addChild(powerup); } 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); } function randomDir() { var angle = Math.random() * Math.PI * 2; return { x: Math.cos(angle), y: Math.sin(angle) }; } function dist2(a, b) { var dx = a.x - b.x; var dy = a.y - b.y; return Math.sqrt(dx * dx + dy * dy); } game.down = function (x, y, obj) { if (x < 100 && y < 100) { return; } hero.targetX = x; hero.targetY = y; dragging = true; }; game.move = function (x, y, obj) { hero.targetX = x; hero.targetY = y; }; game.up = function (x, y, obj) { dragging = false; }; var ticksSurvived = 0; var autoAttackTimer = 0; var autoAttackInterval = 48; game.update = function () { hero.update(); for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.update(); if (dist2(e, hero) < e.radius + hero.radius) { if (!lastGameOver) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); lastGameOver = true; } return; } } for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); if (b.x < -100 || b.x > 2148 || b.y < -100 || b.y > 2832) { b.destroy(); bullets.splice(i, 1); continue; } for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; if (dist2(b, e) < b.radius + e.radius) { spawnGem(e.x, e.y); if (Math.random() < 0.1) { spawnMagnetPowerup(e.x, e.y); } e.destroy(); enemies.splice(j, 1); b.pierce -= 1; if (b.pierce <= 0) { b.destroy(); bullets.splice(i, 1); } break; } } } for (var i = gems.length - 1; i >= 0; i--) { var g = gems[i]; var magnetRange = hero.magnetActive ? hero.magnetRangeBoosted : hero.magnetRange; var d = dist2(g, hero); if (d < magnetRange) { 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; } } if (dist2(g, hero) < g.radius + hero.radius) { xp += 1; g.destroy(); gems.splice(i, 1); if (xp >= xpToLevel) { level += 1; xp = 0; xpToLevel = 10 + level * 4; LK.effects.flashObject(hero, 0xf7e967, 600); spawnPowerup(hero.x + (Math.random() - 0.5) * 200, hero.y + (Math.random() - 0.5) * 200); autoAttackInterval = Math.max(12, autoAttackInterval - 4); Bullet.prototype.pierce = (Bullet.prototype.pierce || 1) + 1; } } } for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; 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; } } if (dist2(p, hero) < p.radius + hero.radius) { if (p.isMagnet) { hero.magnetActive = true; hero.magnetDuration = 300; LK.effects.flashObject(hero, 0x00ffff, 800); } else { if (Math.random() < 0.5) { autoAttackInterval = Math.max(16, autoAttackInterval - 4); LK.effects.flashObject(hero, 0x8e44ad, 400); } else { hero.speed += 2; LK.effects.flashObject(hero, 0x7be495, 400); } xp += 5; } p.destroy(); powerups.splice(i, 1); } } autoAttackTimer++; if (autoAttackTimer >= autoAttackInterval) { autoAttackTimer = 0; 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; var extraBullets = Math.max(0, level - 1); var totalBullets = 1 + extraBullets; 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.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 { var extraBullets = Math.max(0, level - 1); var totalBullets = 1 + extraBullets; 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); } } } spawnTimer++; if (spawnTimer >= spawnInterval) { spawnTimer = 0; var toSpawn = 1 + Math.floor(wave / 3); for (var i = 0; i < toSpawn; i++) { spawnEnemy(); } wave++; spawnInterval = Math.max(24, 90 - Math.floor(wave / 2)); } ticksSurvived++; scoreTxt.setText('Score: ' + Math.floor(ticksSurvived / 60)); xpTxt.setText('XP: ' + xp + '/' + xpToLevel); levelTxt.setText('Level: ' + level); 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); if (hero && hero.parent) { lastGameOver = false; } };
===================================================================
--- original.js
+++ change.js
@@ -13,12 +13,12 @@
anchorX: 0.5,
anchorY: 0.5
});
self.radius = 18;
- self.speed = 19; // Decreased bullet speed by 100%
+ self.speed = 19;
self.dirX = 1;
self.dirY = 0;
- self.pierce = 1; // Number of enemies bullet can hit before being destroyed (default 1)
+ self.pierce = 1;
self.update = function () {
self.x += self.dirX * self.speed;
self.y += self.dirY * self.speed;
};
@@ -31,22 +31,19 @@
anchorX: 0.5,
anchorY: 0.5
});
self.radius = 50;
- self.speed = 1.5 + Math.random(); // Decreased enemy speed by 100%
+ self.speed = 1.5 + Math.random();
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) {
@@ -85,28 +82,25 @@
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.radius = 60;
+ self.speed = 15;
self.targetX = 1024;
self.targetY = 1366;
- // Mıknatıs özellikleri
- self.magnetActive = false; // mıknatıs aktif mi?
- self.magnetDuration = 0; // kalan mıknatıs süresi (tick cinsinden)
- self.magnetRange = 300; // mıknatıs çekim yarıçapı normal
- self.magnetRangeBoosted = 600; // mıknatıs çekim yarıçapı güçlendirmeyle
+ self.magnetActive = false;
+ self.magnetDuration = 0;
+ self.magnetRange = 300;
+ self.magnetRangeBoosted = 600;
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';
@@ -126,14 +120,13 @@
newSprite.assetId = 'hero_right';
}
}
}
- // Mıknatıs süresi varsa azalt
if (self.magnetActive) {
self.magnetDuration--;
if (self.magnetDuration <= 0) {
self.magnetActive = false;
- LK.effects.flashObject(self, 0xff0000, 600); // mıknatıs bittiğinde görsel efekt
+ LK.effects.flashObject(self, 0xff0000, 600);
}
}
};
return self;
@@ -159,109 +152,80 @@
/****
* 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 spawnInterval = 90;
var wave = 1;
var xp = 0;
var xpToLevel = 10;
var level = 1;
var dragging = false;
var lastGameOver = false;
-var scoreTxt, xpTxt, levelTxt, livesTxt;
-// Hero lives
-var heroLives = 3;
-// Center positions
+var scoreTxt, xpTxt, levelTxt;
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: Lives (top center, below score)
-livesTxt = new Text2('Lives: 3', {
- size: 36,
- fill: 0xFF6666
-});
-livesTxt.anchor.set(0.5, 0);
-LK.gui.top.addChild(livesTxt);
-livesTxt.y = 60;
-// GUI: Timer (top right)
var timerTxt = new Text2('00:00', {
size: 54,
fill: "#fff"
});
-timerTxt.anchor.set(1, 0); // right aligned, top
+timerTxt.anchor.set(1, 0);
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,
@@ -272,25 +236,30 @@
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 spawnMagnetPowerup(x, y) {
+ var powerup = new Powerup();
+ powerup.x = x;
+ powerup.y = y;
+ powerup.isMagnet = true;
+ powerups.push(powerup);
+ game.addChild(powerup);
+}
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;
@@ -306,91 +275,69 @@
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%
+var autoAttackInterval = 48;
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 (!e.lastHitHero) {
+ if (!lastGameOver) {
LK.effects.flashScreen(0xff0000, 1000);
- heroLives--;
- livesTxt.setText('Lives: ' + heroLives);
- if (heroLives <= 0) {
- LK.showGameOver();
- lastGameOver = true;
- }
- e.lastHitHero = true;
+ LK.showGameOver();
+ lastGameOver = true;
}
- // Don't return here, allow other enemies to update
- } else {
- e.lastHitHero = false;
+ 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);
+ if (Math.random() < 0.1) {
+ spawnMagnetPowerup(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);
@@ -398,12 +345,10 @@
break;
}
}
}
- // Update gems
for (var i = gems.length - 1; i >= 0; i--) {
var g = gems[i];
- // Mıknatıs aktifse çekim mesafesini artır
var magnetRange = hero.magnetActive ? hero.magnetRangeBoosted : hero.magnetRange;
var d = dist2(g, hero);
if (d < magnetRange) {
var dx = hero.x - g.x;
@@ -413,14 +358,12 @@
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;
@@ -430,12 +373,10 @@
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;
@@ -444,37 +385,30 @@
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);
- LK.effects.flashObject(hero, 0x8e44ad, 400);
+ if (p.isMagnet) {
+ hero.magnetActive = true;
+ hero.magnetDuration = 300;
+ LK.effects.flashObject(hero, 0x00ffff, 800);
} else {
- // Increase move speed
- hero.speed += 2;
- LK.effects.flashObject(hero, 0x7be495, 400);
+ if (Math.random() < 0.5) {
+ autoAttackInterval = Math.max(16, autoAttackInterval - 4);
+ LK.effects.flashObject(hero, 0x8e44ad, 400);
+ } else {
+ hero.speed += 2;
+ LK.effects.flashObject(hero, 0x7be495, 400);
+ }
+ xp += 5;
}
- // %20 şansla mıknatıs ver
- if (Math.random() < 0.2) {
- hero.magnetActive = true;
- hero.magnetDuration = 900; // 15 saniye * 60 tick
- LK.effects.flashObject(hero, 0x00ffff, 800); // mıknatıs aktif efekt (açık mavi)
- }
- // Give 5 xp for purple powerup
- xp += 5;
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];
@@ -486,23 +420,20 @@
}
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
+ spread = Math.PI / 32;
} 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)
+ spread = Math.PI / 32 + (level - 2) * Math.PI / 48;
if (spread > Math.PI / 4) {
spread = Math.PI / 4;
}
} else {
- spread = Math.PI / 16; // default for level 1
+ spread = Math.PI / 16;
}
var baseAngle = Math.atan2(dy, dx);
for (var b = 0; b < totalBullets; b++) {
var angle = baseAngle;
@@ -513,12 +444,10 @@
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) {
@@ -540,38 +469,28 @@
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;
- if (heroLives <= 0) {
- heroLives = 3;
- livesTxt.setText('Lives: ' + heroLives);
- }
}
};
\ No newline at end of file
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