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) { // Hızlı tıklama: 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; // Hızlı tıklama: Eğer animasyon sırasında tekrar swingSword çağrıldıysa, geri dönüş animasyonunu başlatma if (self._swordTweenBack) return; 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) ****/
/****
* 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) {
// Hızlı tıklama: 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;
// Hızlı tıklama: Eğer animasyon sırasında tekrar swingSword çağrıldıysa, geri dönüş animasyonunu başlatma
if (self._swordTweenBack) return;
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)
****/
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