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) { // Kılıç hızlı hızlı savrulabilsin: Animasyon devam ederken tekrar çağrılırsa önceki animasyonu iptal et if (self._swordTween) { if (typeof self._swordTween.cancel === "function") self._swordTween.cancel(); self._swordTween = null; } if (self._swordTweenBack) { if (typeof self._swordTweenBack.cancel === "function") self._swordTweenBack.cancel(); self._swordTweenBack = null; } self.swordSwinging = true; // Kılıç salınımı animasyonu var startAngle = 0; var endAngle = targetAngle; self.sword.rotation = startAngle; self._swordTween = tween(self.sword, { rotation: endAngle }, { duration: 120, easing: tween.cubicOut, onFinish: function onFinish() { self._swordTween = null; self._swordTweenBack = tween(self.sword, { rotation: 0 }, { duration: 80, easing: tween.cubicIn, onFinish: function onFinish() { self._swordTweenBack = null; 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); // Her yöne (ön, arka, yan) kılıç savurabilsin self.swingSword(angle); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222831 }); /**** * Game Code ****/ // Oyun alanı merkezi // Arka plan asset'i (tüm alanı kaplayacak şekilde) var centerX = 2048 / 2; var centerY = 2732 / 2; // Başlama ekranı için değişkenler var startScreen = new Container(); var startBg = LK.getAsset('arkaplan', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); startScreen.addChild(startBg); var titleText = new Text2("Dino Savaşçı", { size: 180, fill: 0xFFF700 }); titleText.anchor.set(0.5, 0.5); titleText.x = centerX; titleText.y = centerY - 300; startScreen.addChild(titleText); var startBtn = new Text2("Başla", { size: 120, fill: 0xFFFFFF }); startBtn.anchor.set(0.5, 0.5); startBtn.x = centerX; startBtn.y = centerY + 200; startScreen.addChild(startBtn); game.addChild(startScreen); // Oyun başlatıldı mı? var gameStarted = false; // Oyun elemanları (oyun başladığında oluşturulacak) var arkaplan, warrior, score, scoreTxt, wave, dinoSpeed, dinosPerWave, dinos, spawning; // Başlat butonuna tıklama startScreen.down = function (x, y, obj) { // Sadece butonun üstüne tıklanırsa başlat var dx = x - startBtn.x; var dy = y - startBtn.y; if (Math.abs(dx) < startBtn.width / 2 && Math.abs(dy) < startBtn.height / 2) { startScreen.visible = false; startScreen.interactive = false; startGame(); } }; startScreen.interactive = true; // Oyun başlatma fonksiyonu function startGame() { gameStarted = true; // Arka planı ekle (en arkada olacak şekilde) arkaplan = LK.getAsset('arkaplan', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(arkaplan); // Savaşçı oluştur ve ortala warrior = new Warrior(); warrior.x = centerX; warrior.y = centerY; game.addChild(warrior); // Skor score = 0; scoreTxt = new Text2('0', { size: 120, fill: 0xFFF700 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Dalga (wave) ve zorluk wave = 1; dinoSpeed = 2.7; // Daha hızlı başlangıç hızı dinosPerWave = 4; dinos = []; spawning = false; // İlk dalgayı başlat startWave(); } // 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: 1.5 ile 3 arasında, dalga ile artan taban hız) var minSpeed = dinoSpeed + wave * 0.15; var maxSpeed = dinoSpeed + wave * 0.25 + 1; 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 // Arka dahil savurabilmek için yay açısını 180 dereceye çıkarıyoruz return { cx: warrior.x, cy: warrior.y, r: swordLength, angle: angle, spread: Math.PI // 180 derece yay (arka dahil) }; } // 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) { // Arka dahil: açısal kontrolü kaldır, tüm 180 derece (arka dahil) vuruş alanında öldür 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 () { if (!gameStarted) return; // 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 alanına tıklama ile de kılıç salınımı game.down = function (x, y, obj) { if (!gameStarted) return; // 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); // Her yöne (ön, arka, yan) kılıç savurabilsin 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
@@ -203,9 +203,9 @@
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Dalga (wave) ve zorluk
wave = 1;
- dinoSpeed = 1.5; // Daha yavaş başlangıç hızı
+ dinoSpeed = 2.7; // Daha hızlı başlangıç hızı
dinosPerWave = 4;
dinos = [];
spawning = false;
// İlk dalgayı başlat
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