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; dino.speed = dinoSpeed + wave * 0.5; dinos.push(dino); game.addChild(dino); } spawning = false; } // Kılıç çarpışma kutusu (sanal) 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; return { x: sx, y: sy, r: sword.height * 0.6 // Kılıç ucunda küçük bir daire }; } // 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; var dx = dino.x - hitbox.x; var dy = dino.y - hitbox.y; 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); } } } // 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
@@ -72,16 +72,15 @@
self.sword = sword;
self.swordSwinging = false;
self.swordAngle = 0; // Radyan cinsinden
self.swordSwingDir = 1; // 1: sağ, -1: sol
- // Kılıç salınımı fonksiyonu
- self.swingSword = function (dir, _onFinish) {
+ // Kılıç salınımı fonksiyonu (her yöne sallanabilir)
+ self.swingSword = function (targetAngle, _onFinish) {
if (self.swordSwinging) return;
self.swordSwinging = true;
- self.swordSwingDir = dir;
// Kılıç salınımı animasyonu
var startAngle = 0;
- var endAngle = dir === 1 ? Math.PI / 2 : -Math.PI / 2;
+ var endAngle = targetAngle;
self.sword.rotation = startAngle;
tween(self.sword, {
rotation: endAngle
}, {
@@ -100,126 +99,15 @@
});
}
});
};
- // Savaşçıya tıklama ile kılıç salınımı
+ // Savaşçıya tıklama ile kılıç salınımı (her yöne)
self.down = function (x, y, obj) {
- // Tıklanan noktaya göre sağ/sol/üst/alt salınımı
- var local = self.toLocal(obj.parent.toGlobal({
- x: x,
- y: y
- }));
- var dx = local.x;
- var dy = local.y;
- var dir = 1;
- if (Math.abs(dx) > Math.abs(dy)) {
- dir = dx > 0 ? 1 : -1;
- } else {
- dir = dy > 0 ? 2 : -2;
- }
- // 1: sağ, -1: sol, 2: aşağı, -2: yukarı
- if (dir === 1 || dir === -1) {
- self.swingSword(dir);
- } else if (dir === 2) {
- // Aşağı salınımı
- if (self.swordSwinging) return;
- self.swordSwinging = true;
- tween(self.sword, {
- rotation: Math.PI
- }, {
- duration: 180,
- easing: tween.cubicOut,
- onFinish: function onFinish() {
- tween(self.sword, {
- rotation: 0
- }, {
- duration: 120,
- easing: tween.cubicIn,
- onFinish: function onFinish() {
- self.swordSwinging = false;
- }
- });
- }
- });
- } else {
- // Yukarı salınımı
- if (self.swordSwinging) return;
- self.swordSwinging = true;
- tween(self.sword, {
- rotation: -Math.PI
- }, {
- duration: 180,
- easing: tween.cubicOut,
- onFinish: function onFinish() {
- tween(self.sword, {
- rotation: 0
- }, {
- duration: 120,
- easing: tween.cubicIn,
- onFinish: function onFinish() {
- self.swordSwinging = false;
- }
- });
- }
- });
- }
- };
- // Savaşçıya tıklama ile kılıç salınımı
- self.down = function (x, y, obj) {
- // Tıklanan noktaya göre yön belirle
+ // 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 dir = 1;
- if (Math.abs(dx) > Math.abs(dy)) {
- dir = dx > 0 ? 1 : -1;
- } else {
- dir = dy > 0 ? 2 : -2;
- }
- if (dir === 1 || dir === -1) {
- self.swingSword(dir);
- } else if (dir === 2) {
- // Aşağı
- if (self.swordSwinging) return;
- self.swordSwinging = true;
- tween(self.sword, {
- rotation: Math.PI
- }, {
- duration: 180,
- easing: tween.cubicOut,
- onFinish: function onFinish() {
- tween(self.sword, {
- rotation: 0
- }, {
- duration: 120,
- easing: tween.cubicIn,
- onFinish: function onFinish() {
- self.swordSwinging = false;
- }
- });
- }
- });
- } else {
- // Yukarı
- if (self.swordSwinging) return;
- self.swordSwinging = true;
- tween(self.sword, {
- rotation: -Math.PI
- }, {
- duration: 180,
- easing: tween.cubicOut,
- onFinish: function onFinish() {
- tween(self.sword, {
- rotation: 0
- }, {
- duration: 120,
- easing: tween.cubicIn,
- onFinish: function onFinish() {
- self.swordSwinging = false;
- }
- });
- }
- });
- }
+ var angle = Math.atan2(dy, dx);
+ self.swingSword(angle);
};
return self;
});
@@ -349,62 +237,13 @@
// Oyun başlangıcı
startWave();
// Oyun alanına tıklama ile de kılıç salınımı
game.down = function (x, y, obj) {
- // Savaşçıya göre yön belirle
+ // 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 dir = 1;
- if (Math.abs(dx) > Math.abs(dy)) {
- dir = dx > 0 ? 1 : -1;
- } else {
- dir = dy > 0 ? 2 : -2;
- }
- if (dir === 1 || dir === -1) {
- warrior.swingSword(dir);
- } else if (dir === 2) {
- // Aşağı
- if (warrior.swordSwinging) return;
- warrior.swordSwinging = true;
- tween(warrior.sword, {
- rotation: Math.PI
- }, {
- duration: 180,
- easing: tween.cubicOut,
- onFinish: function onFinish() {
- tween(warrior.sword, {
- rotation: 0
- }, {
- duration: 120,
- easing: tween.cubicIn,
- onFinish: function onFinish() {
- warrior.swordSwinging = false;
- }
- });
- }
- });
- } else {
- // Yukarı
- if (warrior.swordSwinging) return;
- warrior.swordSwinging = true;
- tween(warrior.sword, {
- rotation: -Math.PI
- }, {
- duration: 180,
- easing: tween.cubicOut,
- onFinish: function onFinish() {
- tween(warrior.sword, {
- rotation: 0
- }, {
- duration: 120,
- easing: tween.cubicIn,
- onFinish: function onFinish() {
- warrior.swordSwinging = false;
- }
- });
- }
- });
- }
+ 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)
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