User prompt
Yine eklenmedi. O zaman oynadığımız tuş ile ard arda çift tıklayınca mermiyi durdursun eğer tekrar ard arda çift tıklarsak tekrar başlatsın.
User prompt
mermiyi durdurup başlatma mekaniği oyuna gelmedi. bunu ekler misin?
User prompt
mermiler çoğu zaman boşa gidiyor. right click ile mermileri durdurup başlatabilelim.
User prompt
kamera oyuncuyu takip etsin
User prompt
Tamamdır. o zaman uygun bir şekilde yapalım
User prompt
rastgele yerlerde %25 ihtimalle ammo spawnlansın
User prompt
HUD yazılarını zombi temasına daha uygun bir font ile değiştir.
User prompt
Difficult 2. seviye olduğu zaman rapid fire çıkma ihtimali %10 olsun, Healt pack çıkma ihtimali ise %15 olsun
User prompt
tamamdır. Bekliyorum.
User prompt
Texture görseli çok karanlık gözüküyor. onu normal kendi renkleri ile görelim ve görsel arkaplana tam oturmuyor onu da düzeltelim.
User prompt
arkaplan görseli çoklu kareler şeklinde gözüküyor. tek bir görsel şeklinde gözüksün.
User prompt
o zaman sen nasıl uygun görüyorsan onu yap
User prompt
oyun gittikçe adım adım daha da zorlaşsın
User prompt
fare ile sağ tıkladığımız zaman mermi atışını durdurup başlatabilelim.
User prompt
zombie walker ın canını biraz arttıralım, zombie brute un canını ise bayağı arttıralım
User prompt
o zaman buna benzer bu işlevi gören alternatif bir sistem yapalım
User prompt
rapid fire düşme ihtimalini %5 yapalım ve healt pack düşme ihtimali de %10 olsun
User prompt
Canavarlardan %50 olasılıkla ammo düşsün ve canavarlardan %15 ihtimalle rapid fire düşsün.
Code edit (1 edits merged)
Please save this source code
User prompt
Zombie Shooter
Initial prompt
zombilerle silah ile savaştığımız bir oyun yapar mısın?
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.ammo = 50;
self.maxAmmo = 100;
self.shootCooldown = 0;
self.shootRate = 15; // shoots every 15 ticks
self.rapidFireBonus = 0;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
return true; // player died
}
return false;
};
self.addHealth = function (amount) {
self.health = Math.min(self.health + amount, self.maxHealth);
};
self.addAmmo = function (amount) {
self.ammo = Math.min(self.ammo + amount, self.maxAmmo);
};
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
if (self.rapidFireBonus > 0) {
self.rapidFireBonus--;
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
self.type = 'health';
self.lifetime = 600; // 10 seconds at 60fps
self.update = function () {
self.lifetime--;
if (self.lifetime <= 0) {
return true; // should be removed
}
return false;
};
return self;
});
var RapidFire = PowerUp.expand(function () {
var self = PowerUp.call(this);
var packGraphics = self.attachAsset('rapidFire', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'rapidfire';
self.value = 300; // 5 seconds of rapid fire
return self;
});
var HealthPack = PowerUp.expand(function () {
var self = PowerUp.call(this);
var packGraphics = self.attachAsset('healthPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'health';
self.value = 30;
return self;
});
var AmmoPack = PowerUp.expand(function () {
var self = PowerUp.call(this);
var packGraphics = self.attachAsset('ammoPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'ammo';
self.value = 25;
return self;
});
var PowerUpManager = Container.expand(function () {
var self = Container.call(this);
// Drop table configuration - weights determine relative probability
self.dropTables = {
zombie: [{
type: 'ammo',
weight: 50,
"class": AmmoPack
}, {
type: 'health',
weight: 10,
"class": HealthPack
}, {
type: 'rapidfire',
weight: 5,
"class": RapidFire
}, {
type: 'nothing',
weight: 35,
"class": null
}],
wave: [{
type: 'ammo',
weight: 30,
"class": AmmoPack
}, {
type: 'health',
weight: 20,
"class": HealthPack
}, {
type: 'rapidfire',
weight: 15,
"class": RapidFire
}, {
type: 'nothing',
weight: 35,
"class": null
}]
};
self.getWeightedDrop = function (dropTable) {
var totalWeight = 0;
for (var i = 0; i < dropTable.length; i++) {
totalWeight += dropTable[i].weight;
}
var random = Math.random() * totalWeight;
var currentWeight = 0;
for (var i = 0; i < dropTable.length; i++) {
currentWeight += dropTable[i].weight;
if (random <= currentWeight) {
return dropTable[i];
}
}
return dropTable[dropTable.length - 1]; // fallback
};
self.spawnDrop = function (x, y, tableType) {
var dropConfig = self.getWeightedDrop(self.dropTables[tableType || 'zombie']);
if (dropConfig["class"]) {
var powerUp = new dropConfig["class"]();
powerUp.x = x;
powerUp.y = y;
powerUps.push(powerUp);
game.addChild(powerUp);
return powerUp;
}
return null; // no drop
};
// Modify drop rates dynamically based on game state
self.adjustDropRates = function () {
var survivalTime = gameTime / 3600; // minutes survived
var difficultyMultiplier = 1 + survivalTime * 0.1;
// Increase health drops as game gets harder
if (player.health < 30) {
self.dropTables.zombie[1].weight = 20; // increase health drop chance
} else {
self.dropTables.zombie[1].weight = 10; // normal health drop chance
}
// Increase ammo drops if low on ammo
if (player.ammo < 10) {
self.dropTables.zombie[0].weight = 70; // increase ammo drop chance
} else {
self.dropTables.zombie[0].weight = 50; // normal ammo drop chance
}
};
return self;
});
var Zombie = Container.expand(function () {
var self = Container.call(this);
self.health = 50;
self.maxHealth = 50;
self.speed = 2;
self.damage = 20;
self.scoreValue = 10;
self.type = 'walker';
self.takeDamage = function (damage) {
self.health -= damage;
return self.health <= 0;
};
self.update = function () {
// Move toward player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var ZombieWalker = Zombie.expand(function () {
var self = Zombie.call(this);
var zombieGraphics = self.attachAsset('zombieWalker', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 50;
self.maxHealth = 50;
self.speed = 2;
self.damage = 20;
self.scoreValue = 10;
self.type = 'walker';
return self;
});
var ZombieRunner = Zombie.expand(function () {
var self = Zombie.call(this);
var zombieGraphics = self.attachAsset('zombieRunner', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 30;
self.maxHealth = 30;
self.speed = 4;
self.damage = 15;
self.scoreValue = 15;
self.type = 'runner';
return self;
});
var ZombieBrute = Zombie.expand(function () {
var self = Zombie.call(this);
var zombieGraphics = self.attachAsset('zombieBrute', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.speed = 1;
self.damage = 35;
self.scoreValue = 25;
self.type = 'brute';
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2d2d2d
});
/****
* Game Code
****/
// Game variables
var player;
var bullets = [];
var zombies = [];
var powerUps = [];
var powerUpManager;
var waveNumber = 1;
var zombiesKilled = 0;
var gameTime = 0;
var spawnTimer = 0;
var powerUpTimer = 0;
var dragNode = null;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 40,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 120;
scoreText.y = 20;
LK.gui.topLeft.addChild(scoreText);
var healthText = new Text2('Health: 100', {
size: 40,
fill: 0xFF0000
});
healthText.anchor.set(0.5, 0);
LK.gui.top.addChild(healthText);
var ammoText = new Text2('Ammo: 50', {
size: 40,
fill: 0xFFFF00
});
ammoText.anchor.set(1, 0);
ammoText.x = -20;
ammoText.y = 20;
LK.gui.topRight.addChild(ammoText);
var waveText = new Text2('Wave: 1', {
size: 40,
fill: 0x00FF00
});
waveText.anchor.set(0.5, 0);
waveText.y = 80;
LK.gui.top.addChild(waveText);
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
// Initialize power-up manager
powerUpManager = new PowerUpManager();
// Helper functions
function updateUI() {
scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + player.health);
ammoText.setText('Ammo: ' + player.ammo);
waveText.setText('Wave: ' + waveNumber);
}
function getRandomSpawnPosition() {
var side = Math.floor(Math.random() * 4);
var x, y;
switch (side) {
case 0:
// top
x = Math.random() * 2048;
y = -50;
break;
case 1:
// right
x = 2098;
y = Math.random() * 2732;
break;
case 2:
// bottom
x = Math.random() * 2048;
y = 2782;
break;
case 3:
// left
x = -50;
y = Math.random() * 2732;
break;
}
return {
x: x,
y: y
};
}
function spawnZombie() {
var pos = getRandomSpawnPosition();
var zombie;
var rand = Math.random();
if (rand < 0.6) {
zombie = new ZombieWalker();
} else if (rand < 0.85) {
zombie = new ZombieRunner();
} else {
zombie = new ZombieBrute();
}
zombie.x = pos.x;
zombie.y = pos.y;
zombies.push(zombie);
game.addChild(zombie);
}
function spawnPowerUp() {
var x = Math.random() * 1800 + 124; // Keep away from edges
var y = Math.random() * 2400 + 166;
var powerUp;
var rand = Math.random();
if (rand < 0.4) {
powerUp = new HealthPack();
} else if (rand < 0.7) {
powerUp = new AmmoPack();
} else {
powerUp = new RapidFire();
}
powerUp.x = x;
powerUp.y = y;
powerUps.push(powerUp);
game.addChild(powerUp);
}
function findNearestZombie() {
var nearestZombie = null;
var minDistance = Infinity;
for (var i = 0; i < zombies.length; i++) {
var zombie = zombies[i];
var dx = zombie.x - player.x;
var dy = zombie.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < minDistance) {
minDistance = distance;
nearestZombie = zombie;
}
}
return nearestZombie;
}
function shootAtZombie() {
if (player.ammo <= 0 || player.shootCooldown > 0) {
return;
}
var target = findNearestZombie();
if (!target) {
return;
}
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.setTarget(target.x, target.y);
bullets.push(bullet);
game.addChild(bullet);
player.ammo--;
player.shootCooldown = player.rapidFireBonus > 0 ? 5 : player.shootRate;
LK.getSound('shoot').play();
}
// Event handlers
game.down = function (x, y, obj) {
dragNode = player;
player.x = x;
player.y = y;
};
game.move = function (x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
gameTime++;
// Update spawn rate based on wave
var baseSpawnRate = Math.max(120 - waveNumber * 10, 30);
if (gameTime % baseSpawnRate === 0) {
spawnZombie();
}
// Adjust drop rates based on game state
powerUpManager.adjustDropRates();
// Spawn wave-based power-ups occasionally
powerUpTimer++;
if (powerUpTimer >= 2400) {
// Every 40 seconds, spawn from wave table
var centerX = 1024 + (Math.random() - 0.5) * 800;
var centerY = 1366 + (Math.random() - 0.5) * 800;
powerUpManager.spawnDrop(centerX, centerY, 'wave');
powerUpTimer = 0;
}
// Try to shoot
shootAtZombie();
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Check if bullet is off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-zombie collisions
var hitZombie = false;
for (var j = zombies.length - 1; j >= 0; j--) {
var zombie = zombies[j];
if (bullet.intersects(zombie)) {
if (zombie.takeDamage(bullet.damage)) {
// Zombie is dead
LK.setScore(LK.getScore() + zombie.scoreValue);
zombiesKilled++;
// Use PowerUpManager for dynamic drops
powerUpManager.spawnDrop(zombie.x, zombie.y, 'zombie');
zombie.destroy();
zombies.splice(j, 1);
LK.getSound('zombieHit').play();
// Check for wave progression
if (zombiesKilled >= waveNumber * 10) {
waveNumber++;
zombiesKilled = 0;
}
}
bullet.destroy();
bullets.splice(i, 1);
hitZombie = true;
break;
}
}
if (hitZombie) continue;
}
// Update zombies and check player collision
for (var i = zombies.length - 1; i >= 0; i--) {
var zombie = zombies[i];
if (zombie.intersects(player)) {
if (player.takeDamage(zombie.damage)) {
// Player died
LK.showGameOver();
return;
}
LK.getSound('damage').play();
LK.effects.flashScreen(0xff0000, 500);
zombie.destroy();
zombies.splice(i, 1);
}
}
// Update power-ups and check collection
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.update()) {
// Power-up expired
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
if (powerUp.intersects(player)) {
LK.getSound('powerup').play();
switch (powerUp.type) {
case 'health':
player.addHealth(powerUp.value);
break;
case 'ammo':
player.addAmmo(powerUp.value);
break;
case 'rapidfire':
player.rapidFireBonus = powerUp.value;
break;
}
powerUp.destroy();
powerUps.splice(i, 1);
}
}
// Update UI
updateUI();
// Check win condition (survive for 10 minutes)
if (gameTime >= 36000) {
// 10 minutes at 60fps
LK.showYouWin();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -112,8 +112,93 @@
self.type = 'ammo';
self.value = 25;
return self;
});
+var PowerUpManager = Container.expand(function () {
+ var self = Container.call(this);
+ // Drop table configuration - weights determine relative probability
+ self.dropTables = {
+ zombie: [{
+ type: 'ammo',
+ weight: 50,
+ "class": AmmoPack
+ }, {
+ type: 'health',
+ weight: 10,
+ "class": HealthPack
+ }, {
+ type: 'rapidfire',
+ weight: 5,
+ "class": RapidFire
+ }, {
+ type: 'nothing',
+ weight: 35,
+ "class": null
+ }],
+ wave: [{
+ type: 'ammo',
+ weight: 30,
+ "class": AmmoPack
+ }, {
+ type: 'health',
+ weight: 20,
+ "class": HealthPack
+ }, {
+ type: 'rapidfire',
+ weight: 15,
+ "class": RapidFire
+ }, {
+ type: 'nothing',
+ weight: 35,
+ "class": null
+ }]
+ };
+ self.getWeightedDrop = function (dropTable) {
+ var totalWeight = 0;
+ for (var i = 0; i < dropTable.length; i++) {
+ totalWeight += dropTable[i].weight;
+ }
+ var random = Math.random() * totalWeight;
+ var currentWeight = 0;
+ for (var i = 0; i < dropTable.length; i++) {
+ currentWeight += dropTable[i].weight;
+ if (random <= currentWeight) {
+ return dropTable[i];
+ }
+ }
+ return dropTable[dropTable.length - 1]; // fallback
+ };
+ self.spawnDrop = function (x, y, tableType) {
+ var dropConfig = self.getWeightedDrop(self.dropTables[tableType || 'zombie']);
+ if (dropConfig["class"]) {
+ var powerUp = new dropConfig["class"]();
+ powerUp.x = x;
+ powerUp.y = y;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+ return powerUp;
+ }
+ return null; // no drop
+ };
+ // Modify drop rates dynamically based on game state
+ self.adjustDropRates = function () {
+ var survivalTime = gameTime / 3600; // minutes survived
+ var difficultyMultiplier = 1 + survivalTime * 0.1;
+ // Increase health drops as game gets harder
+ if (player.health < 30) {
+ self.dropTables.zombie[1].weight = 20; // increase health drop chance
+ } else {
+ self.dropTables.zombie[1].weight = 10; // normal health drop chance
+ }
+ // Increase ammo drops if low on ammo
+ if (player.ammo < 10) {
+ self.dropTables.zombie[0].weight = 70; // increase ammo drop chance
+ } else {
+ self.dropTables.zombie[0].weight = 50; // normal ammo drop chance
+ }
+ };
+ return self;
+});
var Zombie = Container.expand(function () {
var self = Container.call(this);
self.health = 50;
self.maxHealth = 50;
@@ -194,8 +279,9 @@
var player;
var bullets = [];
var zombies = [];
var powerUps = [];
+var powerUpManager;
var waveNumber = 1;
var zombiesKilled = 0;
var gameTime = 0;
var spawnTimer = 0;
@@ -234,8 +320,10 @@
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
+// Initialize power-up manager
+powerUpManager = new PowerUpManager();
// Helper functions
function updateUI() {
scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + player.health);
@@ -360,13 +448,17 @@
var baseSpawnRate = Math.max(120 - waveNumber * 10, 30);
if (gameTime % baseSpawnRate === 0) {
spawnZombie();
}
- // Spawn power-ups occasionally
+ // Adjust drop rates based on game state
+ powerUpManager.adjustDropRates();
+ // Spawn wave-based power-ups occasionally
powerUpTimer++;
- if (powerUpTimer >= 1800) {
- // Every 30 seconds
- spawnPowerUp();
+ if (powerUpTimer >= 2400) {
+ // Every 40 seconds, spawn from wave table
+ var centerX = 1024 + (Math.random() - 0.5) * 800;
+ var centerY = 1366 + (Math.random() - 0.5) * 800;
+ powerUpManager.spawnDrop(centerX, centerY, 'wave');
powerUpTimer = 0;
}
// Try to shoot
shootAtZombie();
@@ -387,32 +479,10 @@
if (zombie.takeDamage(bullet.damage)) {
// Zombie is dead
LK.setScore(LK.getScore() + zombie.scoreValue);
zombiesKilled++;
- // Drop power-ups with specified chances
- var dropChance = Math.random();
- if (dropChance < 0.05) {
- // 5% chance for rapid fire
- var rapidFireDrop = new RapidFire();
- rapidFireDrop.x = zombie.x;
- rapidFireDrop.y = zombie.y;
- powerUps.push(rapidFireDrop);
- game.addChild(rapidFireDrop);
- } else if (dropChance < 0.15) {
- // 10% chance for health pack (5% + 10% = 15% total)
- var healthDrop = new HealthPack();
- healthDrop.x = zombie.x;
- healthDrop.y = zombie.y;
- powerUps.push(healthDrop);
- game.addChild(healthDrop);
- } else if (dropChance < 0.65) {
- // 50% chance for ammo (15% + 50% = 65% total)
- var ammoDrop = new AmmoPack();
- ammoDrop.x = zombie.x;
- ammoDrop.y = zombie.y;
- powerUps.push(ammoDrop);
- game.addChild(ammoDrop);
- }
+ // Use PowerUpManager for dynamic drops
+ powerUpManager.spawnDrop(zombie.x, zombie.y, 'zombie');
zombie.destroy();
zombies.splice(j, 1);
LK.getSound('zombieHit').play();
// Check for wave progression
Ammo pack. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Bullet. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Healt pack. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
üstten görünümlü yuvarlak asker. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
rapid fire. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
üsttem görünümlü yuvarlak zombi. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
üsttem görünümlü yuvarlak zombi. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
üsttem görünümlü yuvarlak zombi büyük kolları var tek gözünde göz maskesi var ve elinde bir sopa var. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat