/****
* 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