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 self.swingSword = function (dir, _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; 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ı 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; } }); } }); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222831 }); /**** * Game Code ****/ // Oyun alanı merkezi var centerX = 2048 / 2; var centerY = 2732 / 2; // 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; var angleStep = Math.PI * 2 / count; for (var i = 0; i < count; i++) { var angle = i * angleStep; var radius = 1100; 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(); // Savaşçıya tıklama ile kılıç salınımı warrior.down = function (x, y, obj) { // Tıklanan noktaya göre yön belirle var local = warrior.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; } 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; } }); } }); } }; // 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 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; } }); } }); } }; /**** * 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
@@ -1,6 +1,408 @@
-/****
+/****
+* 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
+ self.swingSword = function (dir, _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;
+ 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ı
+ 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;
+ }
+ });
+ }
+ });
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x222831
+});
+
+/****
+* Game Code
+****/
+// Oyun alanı merkezi
+var centerX = 2048 / 2;
+var centerY = 2732 / 2;
+// 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;
+ var angleStep = Math.PI * 2 / count;
+ for (var i = 0; i < count; i++) {
+ var angle = i * angleStep;
+ var radius = 1100;
+ 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();
+// Savaşçıya tıklama ile kılıç salınımı
+warrior.down = function (x, y, obj) {
+ // Tıklanan noktaya göre yön belirle
+ var local = warrior.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;
+ }
+ 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;
+ }
+ });
+ }
+ });
+ }
+};
+// 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
+ 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;
+ }
+ });
+ }
+ });
+ }
+};
+/****
+* 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)
+****/
\ No newline at end of file
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