User prompt
hızlı tıklayabilelim
User prompt
ilk başladığımızda çok yavaş olmasınlar
User prompt
bir başlama ekranı olsun
User prompt
dinozorlar daha yavaş olsun
User prompt
kılıcı arkamıza savurduğumuzda arkamızdaki dinozorda ölsün
User prompt
kılıçı arkamızada savurabilelim
User prompt
kılıçı hızlı savurabilelim
User prompt
kılıçı istediğimiz her yöne savurabilelim
User prompt
kılıçı hızlı hızlı savurabilelim
User prompt
etrafımızdaki her yöne kılıçla vurabilelim
User prompt
dinozorlar farklı hızlarda olsun
User prompt
kılıcı her yöne sallayabilelim
User prompt
kılıç tıkladığımız yöne savrulsun
User prompt
arka plan adında yeni bir asset oluştur ve tüm arkaplanı kaplasın
User prompt
dinazorlar dört bir taraftan sıralı gelmesin rastgele oluşsun
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var local = warrior.toLocal(obj.parent.toGlobal({' Line Number: 313
Code edit (1 edits merged)
Please save this source code
User prompt
Dinozor Savaşçısı
Initial prompt
2d bir oyun yapalım bir savaşçımız olsun ortada ona dinozorlar gelsin ve onları kılıcıyla öldürsün
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Dinozor (Dino) class var Dino = Container.expand(function () { var self = Container.call(this); // Dinozor gövdesi var dino = self.attachAsset('dino', { anchorX: 0.5, anchorY: 0.5 }); // Hedef koordinat (savaşçı) self.targetX = 0; self.targetY = 0; self.speed = 3; // Dalga ile artacak // Son öldürülme/temas durumu self.isDead = false; // Her frame hareket self.update = function () { if (self.isDead) return; var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > self.speed) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } else { self.x = self.targetX; self.y = self.targetY; } }; // Dinozoru öldür self.kill = function () { if (self.isDead) return; self.isDead = true; // Küçülerek yok olma animasyonu tween(self, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 200, easing: tween.cubicIn, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); // Savaşçı (Warrior) class var Warrior = Container.expand(function () { var self = Container.call(this); // Savaşçı gövdesi var body = self.attachAsset('warriorBody', { anchorX: 0.5, anchorY: 0.5 }); // Kılıç (Sword) var sword = self.attachAsset('warriorSword', { anchorX: 0.1, anchorY: 0.5, x: body.width * 0.5, y: 0 }); // Kılıç salınımı için parametreler self.sword = sword; self.swordSwinging = false; self.swordAngle = 0; // Radyan cinsinden self.swordSwingDir = 1; // 1: sağ, -1: sol // Kılıç salınımı fonksiyonu (her yöne sallanabilir) self.swingSword = function (targetAngle, _onFinish) { if (self.swordSwinging) return; self.swordSwinging = true; // Kılıç salınımı animasyonu var startAngle = 0; var endAngle = targetAngle; self.sword.rotation = startAngle; tween(self.sword, { rotation: endAngle }, { duration: 180, easing: tween.cubicOut, onFinish: function onFinish() { tween(self.sword, { rotation: 0 }, { duration: 120, easing: tween.cubicIn, onFinish: function onFinish() { self.swordSwinging = false; if (_onFinish) _onFinish(); } }); } }); }; // Savaşçıya tıklama ile kılıç salınımı (her yöne) self.down = function (x, y, obj) { // Savaşçının merkezine göre tıklanan noktanın açısını bul var dx = x - self.x; var dy = y - self.y; var angle = Math.atan2(dy, dx); self.swingSword(angle); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222831 }); /**** * Game Code ****/ // Arka plan asset'i (tüm alanı kaplayacak şekilde) // Oyun alanı merkezi var centerX = 2048 / 2; var centerY = 2732 / 2; // Arka planı ekle (en arkada olacak şekilde) var arkaplan = LK.getAsset('arkaplan', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(arkaplan); // Savaşçı oluştur ve ortala var warrior = new Warrior(); warrior.x = centerX; warrior.y = centerY; game.addChild(warrior); // Skor var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFF700 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Dalga (wave) ve zorluk var wave = 1; var dinoSpeed = 3; var dinosPerWave = 4; var dinos = []; var spawning = false; // Dalga başlatıcı function startWave() { spawning = true; var count = dinosPerWave + (wave - 1) * 2; for (var i = 0; i < count; i++) { // Rastgele bir açı (0-2PI) ve rastgele bir mesafe (900-1200px arası) seç var angle = Math.random() * Math.PI * 2; var radius = 900 + Math.random() * 300; var spawnX = centerX + Math.cos(angle) * radius; var spawnY = centerY + Math.sin(angle) * radius; var dino = new Dino(); dino.x = spawnX; dino.y = spawnY; dino.targetX = centerX; dino.targetY = centerY; // Her dinozora rastgele bir hız ver (ör: 2.5 ile 5.5 arasında, dalga ile artan taban hız) var minSpeed = dinoSpeed + wave * 0.3; var maxSpeed = dinoSpeed + wave * 0.5 + 2; dino.speed = minSpeed + Math.random() * (maxSpeed - minSpeed); dinos.push(dino); game.addChild(dino); } spawning = false; } // Kılıç çarpışma kutusu (sanal, yay şeklinde alan) function getSwordHitBox() { var sword = warrior.sword; var swordLength = sword.width * 0.9; var angle = sword.rotation; // Yayın merkezi savaşçının merkezi, yarıçapı kılıç uzunluğu return { cx: warrior.x, cy: warrior.y, r: swordLength, angle: angle, spread: Math.PI / 2 // 90 derece yay (dilersen artırılabilir) }; } // Dinozor öldürme kontrolü function checkSwordHits() { if (!warrior.swordSwinging) return; var hitbox = getSwordHitBox(); for (var i = dinos.length - 1; i >= 0; i--) { var dino = dinos[i]; if (dino.isDead) continue; // Dino ile savaşçı merkezi arası mesafe var dx = dino.x - hitbox.cx; var dy = dino.y - hitbox.cy; var dist = Math.sqrt(dx * dx + dy * dy); // Dino yay alanı içinde mi? if (dist < hitbox.r + dino.height * 0.45) { // Açısal kontrol: Dino'nun açısı ile kılıç açısı farkı yay içinde mi? var dinoAngle = Math.atan2(dy, dx); // Farkı -PI ile PI arasına getir var diff = dinoAngle - hitbox.angle; while (diff > Math.PI) diff -= 2 * Math.PI; while (diff < -Math.PI) diff += 2 * Math.PI; if (Math.abs(diff) <= hitbox.spread / 2) { dino.kill(); dinos.splice(i, 1); score += 1; LK.setScore(score); scoreTxt.setText(score); } } } } // Dinozor savaşçıya değdi mi? function checkDinoCollisions() { for (var i = 0; i < dinos.length; i++) { var dino = dinos[i]; if (dino.isDead) continue; var dx = dino.x - warrior.x; var dy = dino.y - warrior.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < dino.height * 0.45 + 60) { // Oyun bitti LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } } // Oyun güncelleme döngüsü game.update = function () { // Kılıç çarpışma kontrolü checkSwordHits(); // Dinozor savaşçıya değdi mi? checkDinoCollisions(); // Dalga bitti mi? if (!spawning && dinos.length === 0) { wave += 1; startWave(); } }; // Oyun başlangıcı startWave(); // Oyun alanına tıklama ile de kılıç salınımı game.down = function (x, y, obj) { // Savaşçının merkezine göre tıklanan noktanın açısını bul var dx = x - warrior.x; var dy = y - warrior.y; var angle = Math.atan2(dy, dx); warrior.swingSword(angle); }; /**** * Asset tanımları (LK otomatik oluşturur, burada sadece referans için) * - 'warriorBody': Savaşçı gövdesi (box veya ellipse) * - 'warriorSword': Savaşçı kılıcı (box, uzun ince) * - 'dino': Dinozor (ellipse veya box) ****/
===================================================================
--- original.js
+++ change.js
@@ -175,20 +175,20 @@
game.addChild(dino);
}
spawning = false;
}
-// Kılıç çarpışma kutusu (sanal)
+// Kılıç çarpışma kutusu (sanal, yay şeklinde alan)
function getSwordHitBox() {
- // Kılıç ucunun pozisyonunu hesapla
var sword = warrior.sword;
var swordLength = sword.width * 0.9;
var angle = sword.rotation;
- var sx = warrior.x + Math.cos(angle) * swordLength;
- var sy = warrior.y + Math.sin(angle) * swordLength;
+ // Yayın merkezi savaşçının merkezi, yarıçapı kılıç uzunluğu
return {
- x: sx,
- y: sy,
- r: sword.height * 0.6 // Kılıç ucunda küçük bir daire
+ cx: warrior.x,
+ cy: warrior.y,
+ r: swordLength,
+ angle: angle,
+ spread: Math.PI / 2 // 90 derece yay (dilersen artırılabilir)
};
}
// Dinozor öldürme kontrolü
function checkSwordHits() {
@@ -196,17 +196,27 @@
var hitbox = getSwordHitBox();
for (var i = dinos.length - 1; i >= 0; i--) {
var dino = dinos[i];
if (dino.isDead) continue;
- var dx = dino.x - hitbox.x;
- var dy = dino.y - hitbox.y;
+ // Dino ile savaşçı merkezi arası mesafe
+ var dx = dino.x - hitbox.cx;
+ var dy = dino.y - hitbox.cy;
var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist < dino.height * 0.45 + hitbox.r) {
- dino.kill();
- dinos.splice(i, 1);
- score += 1;
- LK.setScore(score);
- scoreTxt.setText(score);
+ // Dino yay alanı içinde mi?
+ if (dist < hitbox.r + dino.height * 0.45) {
+ // Açısal kontrol: Dino'nun açısı ile kılıç açısı farkı yay içinde mi?
+ var dinoAngle = Math.atan2(dy, dx);
+ // Farkı -PI ile PI arasına getir
+ var diff = dinoAngle - hitbox.angle;
+ while (diff > Math.PI) diff -= 2 * Math.PI;
+ while (diff < -Math.PI) diff += 2 * Math.PI;
+ if (Math.abs(diff) <= hitbox.spread / 2) {
+ dino.kill();
+ dinos.splice(i, 1);
+ score += 1;
+ LK.setScore(score);
+ scoreTxt.setText(score);
+ }
}
}
}
// Dinozor savaşçıya değdi mi?
ihtişamlı gerçekçi bir kılıç. In-Game asset. 2d. High contrast. No shadows
kuşbakışı bir mağaranın içi. In-Game asset. 2d. High contrast. No shadows
gerçekçi bir dinazor. In-Game asset. 2d. High contrast. No shadows
kılıçsız karanlık ve gizemli insansı bir kahraman şapkalı ve tüm vücudu görünüyor. In-Game asset. 2d. High contrast. No shadows