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