/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Bonus Sınıfı
var Bonus = Container.expand(function () {
var self = Container.call(this);
self.type = null; // 'speed', 'multi', 'double'
self.active = false;
self.setType = function (type) {
self.type = type;
if (self.asset) {
self.removeChild(self.asset);
}
var assetId = type === 'speed' ? 'bonus_speed' : type === 'multi' ? 'bonus_multi' : 'bonus_double';
self.asset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
return self;
});
// Bonus yönetimi için değişkenler
// Kafes Sınıfı
var Cage = Container.expand(function () {
var self = Container.call(this);
var cageGfx = self.attachAsset('cage', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Kedi Sınıfı
var Cat = Container.expand(function () {
var self = Container.call(this);
// Rastgele kedi türü seç
var catTypes = ['cat1', 'cat2', 'cat3'];
var typeIndex = Math.floor(Math.random() * catTypes.length);
self.catType = catTypes[typeIndex];
// Kedi grafiğini ekle
var catGfx = self.attachAsset(self.catType, {
anchorX: 0.5,
anchorY: 0.5
});
// Kedi hızı ve yönü
self.speed = 3 + Math.random() * 2; // 3-5 arası
self.dir = Math.random() * Math.PI * 2; // 0-2pi arası rastgele yön
// Kedi yakalandı mı?
self.caught = false;
// Kedi hareketi
self.update = function () {
if (self.caught) return;
// Kenarlardan sekme
var nextX = self.x + Math.cos(self.dir) * self.speed;
var nextY = self.y + Math.sin(self.dir) * self.speed;
var r = catGfx.width / 2;
// Sınır kontrolü
if (nextX < r || nextX > 2048 - r) {
self.dir = Math.PI - self.dir + (Math.random() - 0.5) * 0.5;
}
if (nextY < r + 200 || nextY > 2732 - r - 100) {
self.dir = -self.dir + (Math.random() - 0.5) * 0.5;
}
// Hareket
self.x += Math.cos(self.dir) * self.speed;
self.y += Math.sin(self.dir) * self.speed;
};
// Kediye dokunulduğunda
self.down = function (x, y, obj) {
if (self.caught) return;
// Sadece catcher ile temas ediyorsa yakalanabilsin
if (!catcher || !self.intersects(catcher)) {
// Catcher ile temas yoksa yakalanamaz
return;
}
self.caught = true;
// Efekt: hafifçe büyüt
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 120,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
// Kedi yakalandı, ana oyun kodunda işlenecek
if (typeof onCatCaught === 'function') onCatCaught(self);
};
return self;
});
// Kedi Yakalayıcı Karakter Sınıfı
var Catcher = Container.expand(function () {
var self = Container.call(this);
var catcherGfx = self.attachAsset('catcher', {
anchorX: 0.5,
anchorY: 0.5
});
self.dragging = false;
return self;
});
/****
* Initialize Game
****/
// Hız bonusu için restore katsayısı
var game = new LK.Game({
backgroundColor: 0xf5f5f5
});
/****
* Game Code
****/
// Arkaplan asseti eklendi
// Arkaplan görselini ekle
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
game.addChildAt(background, 0); // En arkaya ekle
// --- Menü Ekranları ---
// Menü durumları
var MENU_MAIN = 0,
MENU_GAME = 1,
MENU_ABOUT = 2,
MENU_SETTINGS = 3;
var menuState = MENU_MAIN;
// Menü overlay container
var menuOverlay = new Container();
menuOverlay.zIndex = 10000;
game.addChild(menuOverlay);
// Menüdeki butonlar ve metinler
var menuTitle = new Text2("Kedi Toplama", {
size: 160,
fill: "#333",
font: "Arial Black"
});
menuTitle.anchor.set(0.5, 0.5);
menuTitle.x = 2048 / 2;
menuTitle.y = 600;
menuOverlay.addChild(menuTitle);
// Tüm menü butonları aynı boyutta ve aralarında daha fazla boşluk olacak şekilde ayarlandı
var menuButtonSize = 110;
var menuButtonSpacing = 180;
var btnStart = new Text2("Başla", {
size: menuButtonSize,
fill: "#fff",
font: "Arial Black"
});
btnStart.anchor.set(0.5, 0.5);
btnStart.x = 2048 / 2;
btnStart.y = menuTitle.y + 1 * menuButtonSpacing;
btnStart.interactive = true;
menuOverlay.addChild(btnStart);
var btnAbout = new Text2("Oyun Hakkında", {
size: menuButtonSize,
fill: "#fff",
font: "Arial Black"
});
btnAbout.anchor.set(0.5, 0.5);
btnAbout.x = 2048 / 2;
btnAbout.y = menuTitle.y + 2 * menuButtonSpacing;
btnAbout.interactive = true;
menuOverlay.addChild(btnAbout);
var btnSettings = new Text2("Ayarlar", {
size: menuButtonSize,
fill: "#fff",
font: "Arial Black"
});
btnSettings.anchor.set(0.5, 0.5);
btnSettings.x = 2048 / 2;
btnSettings.y = menuTitle.y + 3 * menuButtonSpacing;
btnSettings.interactive = true;
menuOverlay.addChild(btnSettings);
// Hakkında ekranı
var aboutOverlay = new Container();
aboutOverlay.visible = false;
aboutOverlay.zIndex = 10001;
game.addChild(aboutOverlay);
var aboutTitle = new Text2("Oyun Hakkında", {
size: 120,
fill: "#333",
font: "Arial Black"
});
aboutTitle.anchor.set(0.5, 0.5);
aboutTitle.x = 2048 / 2;
aboutTitle.y = 600;
aboutOverlay.addChild(aboutTitle);
var aboutText = new Text2("Kedileri yakalayıcı ile yakalayıp kafese bırak!\n\n" + "Her 10 puanda bir bonus kazanırsın.\n" + "Bonuslar:\n" + "- Hız: Kediler yavaşlar\n" + "- Çek Topla: 3 kedi birden toplarsın\n" + "- Çift: 6 saniye boyunca 2 kat kedi gelir\n\n" + "Bonusları butonlardan kullanabilirsin.\n" + "Oyun sonsuz, en yüksek skoru hedefle!", {
size: 60,
fill: 0x0074D9,
// Mavi renk
font: "Arial Black" // Daha kalın font
});
aboutText.anchor.set(0.5, 0);
aboutText.x = 2048 / 2;
aboutText.y = 750;
aboutOverlay.addChild(aboutText);
var btnAboutBack = new Text2("Geri", {
size: 90,
fill: "#fff",
font: "Arial Black"
});
btnAboutBack.anchor.set(0.5, 0.5);
btnAboutBack.x = 2048 / 2;
btnAboutBack.y = 1800;
btnAboutBack.interactive = true;
aboutOverlay.addChild(btnAboutBack);
// Ayarlar ekranı
var settingsOverlay = new Container();
settingsOverlay.visible = false;
settingsOverlay.zIndex = 10001;
game.addChild(settingsOverlay);
var settingsTitle = new Text2("Ayarlar", {
size: 120,
fill: "#333",
font: "Arial Black"
});
settingsTitle.anchor.set(0.5, 0.5);
settingsTitle.x = 2048 / 2;
settingsTitle.y = 600;
settingsOverlay.addChild(settingsTitle);
var musicOn = true;
var soundOn = true;
var btnMusic = new Text2("Müzik: Açık", {
size: 80,
fill: "#fff",
font: "Arial Black"
});
btnMusic.anchor.set(0.5, 0.5);
btnMusic.x = 2048 / 2;
btnMusic.y = 950;
btnMusic.interactive = true;
settingsOverlay.addChild(btnMusic);
var btnSound = new Text2("Ses: Açık", {
size: 80,
fill: "#fff",
font: "Arial Black"
});
btnSound.anchor.set(0.5, 0.5);
btnSound.x = 2048 / 2;
btnSound.y = 1100;
btnSound.interactive = true;
settingsOverlay.addChild(btnSound);
var btnSettingsBack = new Text2("Geri", {
size: 90,
fill: "#fff",
font: "Arial Black"
});
btnSettingsBack.anchor.set(0.5, 0.5);
btnSettingsBack.x = 2048 / 2;
btnSettingsBack.y = 1800;
btnSettingsBack.interactive = true;
settingsOverlay.addChild(btnSettingsBack);
// Menü buton eventleri
btnStart.down = function (x, y, obj) {
menuOverlay.visible = false;
menuState = MENU_GAME;
};
btnAbout.down = function (x, y, obj) {
menuOverlay.visible = false;
aboutOverlay.visible = true;
menuState = MENU_ABOUT;
};
btnSettings.down = function (x, y, obj) {
menuOverlay.visible = false;
settingsOverlay.visible = true;
menuState = MENU_SETTINGS;
};
btnAboutBack.down = function (x, y, obj) {
aboutOverlay.visible = false;
menuOverlay.visible = true;
menuState = MENU_MAIN;
};
btnSettingsBack.down = function (x, y, obj) {
settingsOverlay.visible = false;
menuOverlay.visible = true;
menuState = MENU_MAIN;
};
btnMusic.down = function (x, y, obj) {
musicOn = !musicOn;
btnMusic.setText("Müzik: " + (musicOn ? "Açık" : "Kapalı"));
if (musicOn) {
LK.playMusic('bgmusic');
} else {
LK.stopMusic();
}
};
btnSound.down = function (x, y, obj) {
soundOn = !soundOn;
btnSound.setText("Ses: " + (soundOn ? "Açık" : "Kapalı"));
// Ses efektleri için kontrol game.update içinde yapılacak
};
// Oyun başında sadece menü görünsün
menuOverlay.visible = true;
aboutOverlay.visible = false;
settingsOverlay.visible = false;
// Oyun içi kontrolleri menüdeyken devre dışı bırak
function isMenuActive() {
return menuOverlay.visible || aboutOverlay.visible || settingsOverlay.visible;
}
// Daha fazla kedi bonusu: mor
// Çek Topla bonusu: sarı
// Hız bonusu: yeşil
// Bonus assetleri: Her bonus için farklı renk ve simge
// Bonus yönetimi için değişkenler
// Daha fazla kedi bonusu
// Çek Topla bonusu
// Hız bonusu
// Bonus assetleri
// Kediler için farklı renklerde kutu ve elipsler, kafes ve karakter için şekiller tanımlanıyor
// Oyun değişkenleri
var bonuses = []; // Aktif bonus objeleri
var bonusTypes = ['speed', 'multi', 'double'];
var bonusActive = {
speed: false,
multi: false,
"double": false
};
var bonusTimers = {
speed: 0,
multi: 0,
"double": 0
};
var bonusReady = {
speed: false,
multi: false,
"double": false
};
var bonusUI = []; // UI'daki bonus butonları
var bonusTimerTexts = []; // Her bonus için kalan süreyi gösterecek Text2 objeleri
var bonusCountTexts = []; // Her bonusun altında kalan adet sayısını gösterecek Text2 objeleri
var bonusCounts = {
speed: 1,
multi: 1,
"double": 1
}; // Oyun başında her bonus 1 adet
var bonusMultiNextCatch = false; // Çek Topla bonusu için flag
var bonusDoubleActive = false; // Daha fazla kedi bonusu için flag
var bonusSpeedRestore = 1;
var cats = [];
var maxCats = 4;
var score = 0;
var scoreTxt;
var catcher;
var cage;
var dragCat = null;
var dragOffsetX = 0;
var dragOffsetY = 0;
var onCatCaught; // Kedi yakalandığında çağrılacak fonksiyon
var lastCatAddTick = 0;
// Skor metni
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff",
font: "Arial Black"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Kafes oluştur ve ekranın alt ortasına yerleştir
cage = new Cage();
cage.x = 2048 / 2;
cage.y = 2732 - 220;
game.addChild(cage);
// Yakalama karakteri oluştur ve ekranın üst ortasına yerleştir
catcher = new Catcher();
catcher.x = 2048 / 2;
catcher.y = 350;
game.addChild(catcher);
// Bonus UI butonlarını kafesin sağında, aralıklı ve daha büyük boyutta, 3 adet olarak yatay diz
var bonusButtonSpacing = 160; // Butonlar arası boşluk daha da artırıldı
var bonusButtonSize = 1.05; // Simge daha da büyütüldü
var totalBonusWidth = 3 * (140 * bonusButtonSize) + 2 * bonusButtonSpacing;
// Kafes ile sağ kenarın tam ortasında bonusları hizala
// cage.x: kafesin merkezi, cage.width: 220
// Sağ kenar: 2048
// Ortadaki bonusun merkezi, cage'in sağ kenarı ile sağ kenarın ortasında olmalı
var cageRight = cage.x + 220 / 2;
var rightEdge = 2048;
// Kedilerle temas etmemesi için kafesle bonuslar arasında ekstra boşluk bırak
var extraGap = 120;
var centerBetween = cageRight + extraGap + (rightEdge - (cageRight + extraGap)) / 2;
// Bonusların toplam genişliği kadar sola kaydırarak ortala
var bonusStartX = centerBetween - totalBonusWidth / 2 + 140 * bonusButtonSize / 2;
var bonusStartY = cage.y; // Kafesin ortasına hizalı
bonusUI = [];
bonusTimerTexts = [];
bonusCountTexts = [];
for (var i = 0; i < 3; i++) {
var b = new Bonus();
b.setType(bonusTypes[i]);
// Her butonun x pozisyonu: sağda ortalanmış şekilde
b.x = bonusStartX + i * (140 * bonusButtonSize + bonusButtonSpacing);
b.y = bonusStartY;
b.scaleX = b.scaleY = bonusButtonSize;
b.alpha = 0.7;
b.active = false;
b.interactive = true;
b.visible = true; // Her zaman görünsün, bonus aktif olmasa da
(function (bonusType, bonusObj, idx) {
b.down = function (x, y, obj) {
// Eğer oyuncunun elinde kedi varsa bonus butonları çalışmasın
if (dragCat) return;
// Adet sıfırsa bonus kullanılamaz
if (bonusCounts[bonusType] <= 0) return;
if (bonusReady[bonusType] && !bonusActive[bonusType]) {
activateBonus(bonusType);
// Bonus kullanıldı, adedi azalt
bonusCounts[bonusType]--;
// Sayaç güncelle
if (bonusCountTexts[idx]) {
bonusCountTexts[idx].setText(bonusCounts[bonusType] > 0 ? bonusCounts[bonusType] : "");
}
}
};
})(bonusTypes[i], b, i);
bonusUI.push(b);
game.addChild(b);
// Bonus timer text objesini oluştur ve bonus butonunun üstüne ekle
var timerTxt = new Text2('', {
size: 60,
fill: "#fff",
font: "Arial Black"
});
timerTxt.anchor.set(0.5, 0.5);
timerTxt.x = b.x;
timerTxt.y = b.y - 100; // Butonun biraz üstünde
timerTxt.visible = false;
bonusTimerTexts.push(timerTxt);
game.addChild(timerTxt);
// Bonus kalan adet texti: butonun ALTINDA küçük şekilde
var countTxt = new Text2(bonusCounts[bonusTypes[i]] > 0 ? bonusCounts[bonusTypes[i]] : "", {
size: 48,
fill: "#fff",
font: "Arial Black",
fontWeight: "bold"
});
countTxt.anchor.set(0.5, 0);
countTxt.x = b.x;
countTxt.y = b.y + 140 * bonusButtonSize / 2 + 8; // Butonun hemen altında
bonusCountTexts.push(countTxt);
game.addChild(countTxt);
}
// Oyun başında rastgele bir bonusu aktif yap
var firstBonusIdx = Math.floor(Math.random() * 3);
bonusReady[bonusTypes[firstBonusIdx]] = true;
// Catcher karakterini hareket ettirmek için dokunma ve sürükleme desteği
// game.down, game.move ve game.up zaten aşağıda tanımlı, yakalayıcıyı sürüklemek için kod mevcut
// Bonus aktivasyon fonksiyonları
function activateBonus(type) {
if (type === 'speed') {
// Kedilerin hızını %5'e düşür
if (bonusActive.speed) return;
bonusActive.speed = true;
for (var i = 0; i < cats.length; i++) {
cats[i].speed *= 0.05;
}
bonusSpeedRestore = Math.pow(1 / 0.05, 1); // Restore için katsayı
// Timer text'i göster
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'speed') {
bonusTimerTexts[j].visible = true;
bonusTimerTexts[j].setText('6.0');
bonusTimerTexts[j]._bonusTimerStart = Date.now();
bonusTimerTexts[j]._bonusTimerDuration = 6000;
}
}
// 6 saniye sonra hızları geri al
bonusTimers.speed = LK.setTimeout(function () {
for (var i = 0; i < cats.length; i++) {
cats[i].speed *= bonusSpeedRestore;
}
bonusActive.speed = false;
bonusReady.speed = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'speed') {
bonusUI[j].visible = false;
bonusTimerTexts[j].visible = false;
}
}
}, 6000);
}
if (type === 'multi') {
// Bir sonraki kedi yakalamada 3 kedi topla
if (bonusActive.multi) return;
bonusActive.multi = true;
bonusMultiNextCatch = true;
// 4 saniye boyunca aktif kalsın, sonra otomatik olarak devre dışı bırak
// Timer text'i göster
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'multi') {
bonusTimerTexts[j].visible = true;
bonusTimerTexts[j].setText('6.0');
bonusTimerTexts[j]._bonusTimerStart = Date.now();
bonusTimerTexts[j]._bonusTimerDuration = 6000;
}
}
bonusTimers.multi = LK.setTimeout(function () {
bonusActive.multi = false;
bonusMultiNextCatch = false;
bonusReady.multi = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'multi') {
bonusUI[j].visible = false;
bonusTimerTexts[j].visible = false;
}
}
}, 6000);
}
if (type === 'double') {
// 4 saniye boyunca spawn edilen kedi sayısı 2 katı
if (bonusActive["double"]) return;
bonusActive["double"] = true;
bonusDoubleActive = true;
// Timer text'i göster
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'double') {
bonusTimerTexts[j].visible = true;
bonusTimerTexts[j].setText('6.0');
bonusTimerTexts[j]._bonusTimerStart = Date.now();
bonusTimerTexts[j]._bonusTimerDuration = 6000;
}
}
bonusTimers["double"] = LK.setTimeout(function () {
bonusActive["double"] = false;
bonusDoubleActive = false;
bonusReady["double"] = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'double') {
bonusUI[j].visible = false;
bonusTimerTexts[j].visible = false;
}
}
}, 6000);
}
// Bonus UI'da butonu pasifleştir
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === type) {
bonusUI[j].alpha = 0.3;
// Kalan adet sayısını güncelle
if (bonusCountTexts[j]) {
bonusCountTexts[j].setText(bonusCounts[type] > 0 ? bonusCounts[type] : "");
}
}
}
}
// Kedi ekleme fonksiyonu
function addCat() {
var cat = new Cat();
// Mevcut kademe seviyesine göre yeni kedinin hızını ayarla
var level = Math.floor(score / 10);
if (level > 0) {
cat.speed *= Math.pow(1.65, level);
}
// Eğer hız bonusu aktifse, yeni kediye de uygula
if (bonusActive.speed) {
cat.speed *= 0.05;
}
var margin = 180;
var minY = 350 + margin;
var maxY = 2732 - 220 - margin;
var minX = margin;
var maxX = 2048 - margin;
cat.x = minX + Math.random() * (maxX - minX);
cat.y = minY + Math.random() * (maxY - minY);
cats.push(cat);
game.addChild(cat);
}
// Başlangıçta kedileri ekle
for (var i = 0; i < maxCats; i++) {
addCat();
}
// Kedi yakalama fonksiyonu (Cat.down'dan çağrılır)
onCatCaught = function onCatCaught(cat) {
// Sürüklemeye başla
dragCat = cat;
dragOffsetX = 0;
dragOffsetY = 0;
// Efekt: hafifçe öne çıkar
tween(cat, {
scaleX: 1.25,
scaleY: 1.25
}, {
duration: 100
});
};
// Oyun alanında dokunma/sürükleme
game.down = function (x, y, obj) {
// Eğer bir kediye dokunulmadıysa, yakalayıcıyı sürükle
if (!dragCat) {
// Yakınsa yakalayıcıyı sürükle
var dx = x - catcher.x;
var dy = y - catcher.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 120) {
catcher.dragging = true;
dragOffsetX = catcher.x - x;
dragOffsetY = catcher.y - y;
}
}
};
game.move = function (x, y, obj) {
// Sürüklenen kedi varsa, onu hareket ettir
if (dragCat && !dragCat.removed) {
// Sadece catcher ile temas ediyorsa sürüklenebilsin
if (dragCat && dragCat.intersects && catcher && dragCat.intersects(catcher)) {
dragCat.x = x;
dragCat.y = y;
} else {
// Eğer artık temas yoksa, kediyi bırak
dragCat.caught = false;
tween(dragCat, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
dragCat = null;
}
// Kafesle kesişiyor mu?
if (dragCat && dragCat.intersects && cage && dragCat.intersects(cage)) {
// Çek Topla bonusu aktifse, 3 kedi birden topla
if (bonusMultiNextCatch && bonusActive.multi) {
var collected = 0;
for (var i = cats.length - 1; i >= 0; i--) {
var c = cats[i];
if (!c.caught && c.intersects(cage) && collected < 3) {
c.caught = true;
score += 1;
scoreTxt.setText(score);
if (typeof soundOn === "undefined" || soundOn) if (typeof soundOn === "undefined" || soundOn) LK.getSound('catch').play();
tween(c, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function (catRef) {
return function () {
if (catRef && typeof catRef.destroy === "function") {
catRef.destroy();
}
};
}(c)
});
cats.splice(i, 1);
collected++;
}
}
// DragCat de dahilse, onu da yok et
if (!dragCat.removed) {
tween(dragCat, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function onFinish() {
if (dragCat && typeof dragCat.destroy === "function") {
dragCat.destroy();
}
}
});
}
dragCat = null;
// 3 yeni kedi ekle (double bonus aktifse 6 ekle)
var toAdd = bonusDoubleActive ? 6 : 3;
for (var j = 0; j < toAdd; j++) addCat();
// Bonus pasifleşsin
bonusActive.multi = false;
bonusMultiNextCatch = false;
bonusReady.multi = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'multi') {
bonusUI[j].visible = false;
bonusUI[j].alpha = 0.7;
// Süre göstergesini de gizle
bonusTimerTexts[j].visible = false;
}
}
// Multi bonusu bittikten sonra tüm kedilerin hızını mevcut kademe seviyesine göre güncelle
var level = Math.floor(score / 10);
for (var i = 0; i < cats.length; i++) {
// Kedinin hızını sıfırdan kademe çarpanına göre ayarla
var baseSpeed = 3 + Math.random() * 2;
cats[i].speed = baseSpeed * Math.pow(1.65, level);
// Eğer hız bonusu aktifse, hız bonusunu da uygula
if (bonusActive.speed) {
cats[i].speed *= 0.05;
}
}
} else {
// Skor artır, ses çal, efekt
score += 1;
scoreTxt.setText(score);
if (typeof soundOn === "undefined" || soundOn) LK.getSound('catch').play();
// Kedi kaybolsun
tween(dragCat, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function onFinish() {
if (dragCat && typeof dragCat.destroy === "function") {
dragCat.destroy();
}
}
});
// Listeden çıkar
for (var i = 0; i < cats.length; i++) {
if (cats[i] === dragCat) {
cats.splice(i, 1);
break;
}
}
dragCat = null;
// Yeni kedi ekle (double bonus aktifse 2 ekle)
var toAdd = bonusDoubleActive ? 2 : 1;
for (var j = 0; j < toAdd; j++) addCat();
}
// Her 10 puanda bir kedilerin hızını %65 artır (birden fazla kademe atlanırsa hepsini uygula)
if (score > 0) {
var prevLevel = Math.floor((score - 1) / 10);
var newLevel = Math.floor(score / 10);
if (newLevel > prevLevel) {
var multiplier = Math.pow(1.65, newLevel - prevLevel);
// Tüm mevcut kedilerin hızını artır
for (var i = 0; i < cats.length; i++) {
// Kedinin temel hızını yeniden hesapla
var baseSpeed = 3 + Math.random() * 2;
var level = Math.floor(score / 10);
cats[i].speed = baseSpeed * Math.pow(1.65, level);
// Eğer hız bonusu aktifse, hız bonusunu da uygula
if (bonusActive.speed) {
cats[i].speed *= 0.05;
}
}
}
// Her 10 kedide bir, rastgele bonus ekle ve bu sonsuza kadar devam etsin
if (score > 0 && score % 10 === 0) {
// Rastgele bir bonus seç
var bonusIndex = Math.floor(Math.random() * bonusTypes.length);
var bonusType = bonusTypes[bonusIndex];
bonusUI[bonusIndex].visible = true;
bonusReady[bonusType] = true;
// Bonus sayısını artır
bonusCounts[bonusType] = (typeof bonusCounts[bonusType] === "number" ? bonusCounts[bonusType] : 0) + 1;
// Sayaç güncelle
if (bonusCountTexts[bonusIndex]) {
bonusCountTexts[bonusIndex].setText(bonusCounts[bonusType] > 0 ? bonusCounts[bonusType] : "");
}
}
}
}
}
// Yakalayıcı sürükleniyorsa
if (catcher.dragging) {
catcher.x = Math.max(120, Math.min(2048 - 120, x + dragOffsetX));
catcher.y = Math.max(200, Math.min(2732 - 120, y + dragOffsetY));
// Eğer henüz bir kedi tutulmuyorsa, catcher bir kediye değiyorsa onu eline al
if (!dragCat) {
for (var i = 0; i < cats.length; i++) {
var cat = cats[i];
if (!cat.caught && cat.intersects(catcher)) {
cat.caught = true;
dragCat = cat;
dragOffsetX = 0;
dragOffsetY = 0;
// Efekt: hafifçe öne çıkar
tween(cat, {
scaleX: 1.25,
scaleY: 1.25
}, {
duration: 100
});
break;
}
}
}
}
};
game.up = function (x, y, obj) {
// Sürükleme bitti
if (dragCat) {
// Eğer kafese bırakılmadıysa, kedi tekrar kaçmaya başlasın
if (!dragCat.removed) {
dragCat.caught = false;
tween(dragCat, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
dragCat = null;
}
catcher.dragging = false;
};
// Oyun güncelleme döngüsü
game.update = function () {
// Menü açıksa oyun güncellenmesin
if (typeof isMenuActive === "function" && isMenuActive()) {
// Müzik ayarı değiştiyse uygula
if (typeof game._musicPlaying === "undefined") game._musicPlaying = false;
if (musicOn && !game._musicPlaying) {
LK.playMusic('bgmusic');
game._musicPlaying = true;
}
if (!musicOn && game._musicPlaying) {
LK.stopMusic();
game._musicPlaying = false;
}
return;
}
// Kedileri güncelle
for (var i = 0; i < cats.length; i++) {
cats[i].update();
}
// Bonus timer textlerini güncelle
for (var i = 0; i < bonusUI.length; i++) {
var t = bonusTypes[i];
if (bonusActive[t]) {
// Timer text aktifse güncelle
if (bonusTimerTexts[i].visible && bonusTimerTexts[i]._bonusTimerStart) {
var elapsed = Date.now() - bonusTimerTexts[i]._bonusTimerStart;
var left = Math.max(0, bonusTimerTexts[i]._bonusTimerDuration - elapsed);
bonusTimerTexts[i].setText((left / 1000).toFixed(1));
// Süre bittiyse gizle (güvenlik için)
if (left <= 0) {
bonusTimerTexts[i].visible = false;
}
}
} else {
// Bonus aktif değilse timer text gizli olsun
bonusTimerTexts[i].visible = false;
bonusTimerTexts[i]._bonusTimerStart = null;
}
}
// Bonus UI butonlarının aktif/pasif durumunu güncelle
var _loop = function _loop() {
t = bonusTypes[i]; // Butonlar her zaman görünür, sadece alpha ile aktif/pasif göster
if (bonusReady[t] && !bonusActive[t]) {
bonusUI[i].alpha = 0.7;
// Yanıp sönme animasyonu kaldırıldı, bonus hazırsa alpha 0.7 olarak sabitleniyor
bonusUI[i].alpha = 0.7;
bonusUI[i]._flashing = false;
tween.stop(bonusUI[i], {
alpha: true
});
bonusUI[i].alpha = 0.7;
} else if (bonusActive[t]) {
bonusUI[i].alpha = 1.0;
// Aktifken yanıp sönme animasyonu yok, alpha 1.0 olarak sabitleniyor
bonusUI[i].alpha = 1.0;
bonusUI[i]._flashing = false;
tween.stop(bonusUI[i], {
alpha: true
});
bonusUI[i].alpha = 1.0;
} else {
bonusUI[i].alpha = 0.3;
// Pasifken yanıp sönme animasyonu yok, alpha 0.3 olarak sabitleniyor
bonusUI[i].alpha = 0.3;
bonusUI[i]._flashing = false;
tween.stop(bonusUI[i], {
alpha: true
});
bonusUI[i].alpha = 0.3;
}
bonusUI[i].visible = true;
};
for (var i = 0; i < bonusUI.length; i++) {
_loop();
}
// Zamanla yeni kedi ekle (zorluk artışı)
if (LK.ticks - lastCatAddTick > 600 && cats.length < maxCats + 2) {
addCat();
lastCatAddTick = LK.ticks;
}
// Sonsuz oyun: game over koşulu kaldırıldı, oyun sonsuza kadar devam eder
};
// Oyun başında skor sıfırla
score = 0;
scoreTxt.setText(score); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Bonus Sınıfı
var Bonus = Container.expand(function () {
var self = Container.call(this);
self.type = null; // 'speed', 'multi', 'double'
self.active = false;
self.setType = function (type) {
self.type = type;
if (self.asset) {
self.removeChild(self.asset);
}
var assetId = type === 'speed' ? 'bonus_speed' : type === 'multi' ? 'bonus_multi' : 'bonus_double';
self.asset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
return self;
});
// Bonus yönetimi için değişkenler
// Kafes Sınıfı
var Cage = Container.expand(function () {
var self = Container.call(this);
var cageGfx = self.attachAsset('cage', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Kedi Sınıfı
var Cat = Container.expand(function () {
var self = Container.call(this);
// Rastgele kedi türü seç
var catTypes = ['cat1', 'cat2', 'cat3'];
var typeIndex = Math.floor(Math.random() * catTypes.length);
self.catType = catTypes[typeIndex];
// Kedi grafiğini ekle
var catGfx = self.attachAsset(self.catType, {
anchorX: 0.5,
anchorY: 0.5
});
// Kedi hızı ve yönü
self.speed = 3 + Math.random() * 2; // 3-5 arası
self.dir = Math.random() * Math.PI * 2; // 0-2pi arası rastgele yön
// Kedi yakalandı mı?
self.caught = false;
// Kedi hareketi
self.update = function () {
if (self.caught) return;
// Kenarlardan sekme
var nextX = self.x + Math.cos(self.dir) * self.speed;
var nextY = self.y + Math.sin(self.dir) * self.speed;
var r = catGfx.width / 2;
// Sınır kontrolü
if (nextX < r || nextX > 2048 - r) {
self.dir = Math.PI - self.dir + (Math.random() - 0.5) * 0.5;
}
if (nextY < r + 200 || nextY > 2732 - r - 100) {
self.dir = -self.dir + (Math.random() - 0.5) * 0.5;
}
// Hareket
self.x += Math.cos(self.dir) * self.speed;
self.y += Math.sin(self.dir) * self.speed;
};
// Kediye dokunulduğunda
self.down = function (x, y, obj) {
if (self.caught) return;
// Sadece catcher ile temas ediyorsa yakalanabilsin
if (!catcher || !self.intersects(catcher)) {
// Catcher ile temas yoksa yakalanamaz
return;
}
self.caught = true;
// Efekt: hafifçe büyüt
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 120,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
// Kedi yakalandı, ana oyun kodunda işlenecek
if (typeof onCatCaught === 'function') onCatCaught(self);
};
return self;
});
// Kedi Yakalayıcı Karakter Sınıfı
var Catcher = Container.expand(function () {
var self = Container.call(this);
var catcherGfx = self.attachAsset('catcher', {
anchorX: 0.5,
anchorY: 0.5
});
self.dragging = false;
return self;
});
/****
* Initialize Game
****/
// Hız bonusu için restore katsayısı
var game = new LK.Game({
backgroundColor: 0xf5f5f5
});
/****
* Game Code
****/
// Arkaplan asseti eklendi
// Arkaplan görselini ekle
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
game.addChildAt(background, 0); // En arkaya ekle
// --- Menü Ekranları ---
// Menü durumları
var MENU_MAIN = 0,
MENU_GAME = 1,
MENU_ABOUT = 2,
MENU_SETTINGS = 3;
var menuState = MENU_MAIN;
// Menü overlay container
var menuOverlay = new Container();
menuOverlay.zIndex = 10000;
game.addChild(menuOverlay);
// Menüdeki butonlar ve metinler
var menuTitle = new Text2("Kedi Toplama", {
size: 160,
fill: "#333",
font: "Arial Black"
});
menuTitle.anchor.set(0.5, 0.5);
menuTitle.x = 2048 / 2;
menuTitle.y = 600;
menuOverlay.addChild(menuTitle);
// Tüm menü butonları aynı boyutta ve aralarında daha fazla boşluk olacak şekilde ayarlandı
var menuButtonSize = 110;
var menuButtonSpacing = 180;
var btnStart = new Text2("Başla", {
size: menuButtonSize,
fill: "#fff",
font: "Arial Black"
});
btnStart.anchor.set(0.5, 0.5);
btnStart.x = 2048 / 2;
btnStart.y = menuTitle.y + 1 * menuButtonSpacing;
btnStart.interactive = true;
menuOverlay.addChild(btnStart);
var btnAbout = new Text2("Oyun Hakkında", {
size: menuButtonSize,
fill: "#fff",
font: "Arial Black"
});
btnAbout.anchor.set(0.5, 0.5);
btnAbout.x = 2048 / 2;
btnAbout.y = menuTitle.y + 2 * menuButtonSpacing;
btnAbout.interactive = true;
menuOverlay.addChild(btnAbout);
var btnSettings = new Text2("Ayarlar", {
size: menuButtonSize,
fill: "#fff",
font: "Arial Black"
});
btnSettings.anchor.set(0.5, 0.5);
btnSettings.x = 2048 / 2;
btnSettings.y = menuTitle.y + 3 * menuButtonSpacing;
btnSettings.interactive = true;
menuOverlay.addChild(btnSettings);
// Hakkında ekranı
var aboutOverlay = new Container();
aboutOverlay.visible = false;
aboutOverlay.zIndex = 10001;
game.addChild(aboutOverlay);
var aboutTitle = new Text2("Oyun Hakkında", {
size: 120,
fill: "#333",
font: "Arial Black"
});
aboutTitle.anchor.set(0.5, 0.5);
aboutTitle.x = 2048 / 2;
aboutTitle.y = 600;
aboutOverlay.addChild(aboutTitle);
var aboutText = new Text2("Kedileri yakalayıcı ile yakalayıp kafese bırak!\n\n" + "Her 10 puanda bir bonus kazanırsın.\n" + "Bonuslar:\n" + "- Hız: Kediler yavaşlar\n" + "- Çek Topla: 3 kedi birden toplarsın\n" + "- Çift: 6 saniye boyunca 2 kat kedi gelir\n\n" + "Bonusları butonlardan kullanabilirsin.\n" + "Oyun sonsuz, en yüksek skoru hedefle!", {
size: 60,
fill: 0x0074D9,
// Mavi renk
font: "Arial Black" // Daha kalın font
});
aboutText.anchor.set(0.5, 0);
aboutText.x = 2048 / 2;
aboutText.y = 750;
aboutOverlay.addChild(aboutText);
var btnAboutBack = new Text2("Geri", {
size: 90,
fill: "#fff",
font: "Arial Black"
});
btnAboutBack.anchor.set(0.5, 0.5);
btnAboutBack.x = 2048 / 2;
btnAboutBack.y = 1800;
btnAboutBack.interactive = true;
aboutOverlay.addChild(btnAboutBack);
// Ayarlar ekranı
var settingsOverlay = new Container();
settingsOverlay.visible = false;
settingsOverlay.zIndex = 10001;
game.addChild(settingsOverlay);
var settingsTitle = new Text2("Ayarlar", {
size: 120,
fill: "#333",
font: "Arial Black"
});
settingsTitle.anchor.set(0.5, 0.5);
settingsTitle.x = 2048 / 2;
settingsTitle.y = 600;
settingsOverlay.addChild(settingsTitle);
var musicOn = true;
var soundOn = true;
var btnMusic = new Text2("Müzik: Açık", {
size: 80,
fill: "#fff",
font: "Arial Black"
});
btnMusic.anchor.set(0.5, 0.5);
btnMusic.x = 2048 / 2;
btnMusic.y = 950;
btnMusic.interactive = true;
settingsOverlay.addChild(btnMusic);
var btnSound = new Text2("Ses: Açık", {
size: 80,
fill: "#fff",
font: "Arial Black"
});
btnSound.anchor.set(0.5, 0.5);
btnSound.x = 2048 / 2;
btnSound.y = 1100;
btnSound.interactive = true;
settingsOverlay.addChild(btnSound);
var btnSettingsBack = new Text2("Geri", {
size: 90,
fill: "#fff",
font: "Arial Black"
});
btnSettingsBack.anchor.set(0.5, 0.5);
btnSettingsBack.x = 2048 / 2;
btnSettingsBack.y = 1800;
btnSettingsBack.interactive = true;
settingsOverlay.addChild(btnSettingsBack);
// Menü buton eventleri
btnStart.down = function (x, y, obj) {
menuOverlay.visible = false;
menuState = MENU_GAME;
};
btnAbout.down = function (x, y, obj) {
menuOverlay.visible = false;
aboutOverlay.visible = true;
menuState = MENU_ABOUT;
};
btnSettings.down = function (x, y, obj) {
menuOverlay.visible = false;
settingsOverlay.visible = true;
menuState = MENU_SETTINGS;
};
btnAboutBack.down = function (x, y, obj) {
aboutOverlay.visible = false;
menuOverlay.visible = true;
menuState = MENU_MAIN;
};
btnSettingsBack.down = function (x, y, obj) {
settingsOverlay.visible = false;
menuOverlay.visible = true;
menuState = MENU_MAIN;
};
btnMusic.down = function (x, y, obj) {
musicOn = !musicOn;
btnMusic.setText("Müzik: " + (musicOn ? "Açık" : "Kapalı"));
if (musicOn) {
LK.playMusic('bgmusic');
} else {
LK.stopMusic();
}
};
btnSound.down = function (x, y, obj) {
soundOn = !soundOn;
btnSound.setText("Ses: " + (soundOn ? "Açık" : "Kapalı"));
// Ses efektleri için kontrol game.update içinde yapılacak
};
// Oyun başında sadece menü görünsün
menuOverlay.visible = true;
aboutOverlay.visible = false;
settingsOverlay.visible = false;
// Oyun içi kontrolleri menüdeyken devre dışı bırak
function isMenuActive() {
return menuOverlay.visible || aboutOverlay.visible || settingsOverlay.visible;
}
// Daha fazla kedi bonusu: mor
// Çek Topla bonusu: sarı
// Hız bonusu: yeşil
// Bonus assetleri: Her bonus için farklı renk ve simge
// Bonus yönetimi için değişkenler
// Daha fazla kedi bonusu
// Çek Topla bonusu
// Hız bonusu
// Bonus assetleri
// Kediler için farklı renklerde kutu ve elipsler, kafes ve karakter için şekiller tanımlanıyor
// Oyun değişkenleri
var bonuses = []; // Aktif bonus objeleri
var bonusTypes = ['speed', 'multi', 'double'];
var bonusActive = {
speed: false,
multi: false,
"double": false
};
var bonusTimers = {
speed: 0,
multi: 0,
"double": 0
};
var bonusReady = {
speed: false,
multi: false,
"double": false
};
var bonusUI = []; // UI'daki bonus butonları
var bonusTimerTexts = []; // Her bonus için kalan süreyi gösterecek Text2 objeleri
var bonusCountTexts = []; // Her bonusun altında kalan adet sayısını gösterecek Text2 objeleri
var bonusCounts = {
speed: 1,
multi: 1,
"double": 1
}; // Oyun başında her bonus 1 adet
var bonusMultiNextCatch = false; // Çek Topla bonusu için flag
var bonusDoubleActive = false; // Daha fazla kedi bonusu için flag
var bonusSpeedRestore = 1;
var cats = [];
var maxCats = 4;
var score = 0;
var scoreTxt;
var catcher;
var cage;
var dragCat = null;
var dragOffsetX = 0;
var dragOffsetY = 0;
var onCatCaught; // Kedi yakalandığında çağrılacak fonksiyon
var lastCatAddTick = 0;
// Skor metni
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff",
font: "Arial Black"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Kafes oluştur ve ekranın alt ortasına yerleştir
cage = new Cage();
cage.x = 2048 / 2;
cage.y = 2732 - 220;
game.addChild(cage);
// Yakalama karakteri oluştur ve ekranın üst ortasına yerleştir
catcher = new Catcher();
catcher.x = 2048 / 2;
catcher.y = 350;
game.addChild(catcher);
// Bonus UI butonlarını kafesin sağında, aralıklı ve daha büyük boyutta, 3 adet olarak yatay diz
var bonusButtonSpacing = 160; // Butonlar arası boşluk daha da artırıldı
var bonusButtonSize = 1.05; // Simge daha da büyütüldü
var totalBonusWidth = 3 * (140 * bonusButtonSize) + 2 * bonusButtonSpacing;
// Kafes ile sağ kenarın tam ortasında bonusları hizala
// cage.x: kafesin merkezi, cage.width: 220
// Sağ kenar: 2048
// Ortadaki bonusun merkezi, cage'in sağ kenarı ile sağ kenarın ortasında olmalı
var cageRight = cage.x + 220 / 2;
var rightEdge = 2048;
// Kedilerle temas etmemesi için kafesle bonuslar arasında ekstra boşluk bırak
var extraGap = 120;
var centerBetween = cageRight + extraGap + (rightEdge - (cageRight + extraGap)) / 2;
// Bonusların toplam genişliği kadar sola kaydırarak ortala
var bonusStartX = centerBetween - totalBonusWidth / 2 + 140 * bonusButtonSize / 2;
var bonusStartY = cage.y; // Kafesin ortasına hizalı
bonusUI = [];
bonusTimerTexts = [];
bonusCountTexts = [];
for (var i = 0; i < 3; i++) {
var b = new Bonus();
b.setType(bonusTypes[i]);
// Her butonun x pozisyonu: sağda ortalanmış şekilde
b.x = bonusStartX + i * (140 * bonusButtonSize + bonusButtonSpacing);
b.y = bonusStartY;
b.scaleX = b.scaleY = bonusButtonSize;
b.alpha = 0.7;
b.active = false;
b.interactive = true;
b.visible = true; // Her zaman görünsün, bonus aktif olmasa da
(function (bonusType, bonusObj, idx) {
b.down = function (x, y, obj) {
// Eğer oyuncunun elinde kedi varsa bonus butonları çalışmasın
if (dragCat) return;
// Adet sıfırsa bonus kullanılamaz
if (bonusCounts[bonusType] <= 0) return;
if (bonusReady[bonusType] && !bonusActive[bonusType]) {
activateBonus(bonusType);
// Bonus kullanıldı, adedi azalt
bonusCounts[bonusType]--;
// Sayaç güncelle
if (bonusCountTexts[idx]) {
bonusCountTexts[idx].setText(bonusCounts[bonusType] > 0 ? bonusCounts[bonusType] : "");
}
}
};
})(bonusTypes[i], b, i);
bonusUI.push(b);
game.addChild(b);
// Bonus timer text objesini oluştur ve bonus butonunun üstüne ekle
var timerTxt = new Text2('', {
size: 60,
fill: "#fff",
font: "Arial Black"
});
timerTxt.anchor.set(0.5, 0.5);
timerTxt.x = b.x;
timerTxt.y = b.y - 100; // Butonun biraz üstünde
timerTxt.visible = false;
bonusTimerTexts.push(timerTxt);
game.addChild(timerTxt);
// Bonus kalan adet texti: butonun ALTINDA küçük şekilde
var countTxt = new Text2(bonusCounts[bonusTypes[i]] > 0 ? bonusCounts[bonusTypes[i]] : "", {
size: 48,
fill: "#fff",
font: "Arial Black",
fontWeight: "bold"
});
countTxt.anchor.set(0.5, 0);
countTxt.x = b.x;
countTxt.y = b.y + 140 * bonusButtonSize / 2 + 8; // Butonun hemen altında
bonusCountTexts.push(countTxt);
game.addChild(countTxt);
}
// Oyun başında rastgele bir bonusu aktif yap
var firstBonusIdx = Math.floor(Math.random() * 3);
bonusReady[bonusTypes[firstBonusIdx]] = true;
// Catcher karakterini hareket ettirmek için dokunma ve sürükleme desteği
// game.down, game.move ve game.up zaten aşağıda tanımlı, yakalayıcıyı sürüklemek için kod mevcut
// Bonus aktivasyon fonksiyonları
function activateBonus(type) {
if (type === 'speed') {
// Kedilerin hızını %5'e düşür
if (bonusActive.speed) return;
bonusActive.speed = true;
for (var i = 0; i < cats.length; i++) {
cats[i].speed *= 0.05;
}
bonusSpeedRestore = Math.pow(1 / 0.05, 1); // Restore için katsayı
// Timer text'i göster
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'speed') {
bonusTimerTexts[j].visible = true;
bonusTimerTexts[j].setText('6.0');
bonusTimerTexts[j]._bonusTimerStart = Date.now();
bonusTimerTexts[j]._bonusTimerDuration = 6000;
}
}
// 6 saniye sonra hızları geri al
bonusTimers.speed = LK.setTimeout(function () {
for (var i = 0; i < cats.length; i++) {
cats[i].speed *= bonusSpeedRestore;
}
bonusActive.speed = false;
bonusReady.speed = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'speed') {
bonusUI[j].visible = false;
bonusTimerTexts[j].visible = false;
}
}
}, 6000);
}
if (type === 'multi') {
// Bir sonraki kedi yakalamada 3 kedi topla
if (bonusActive.multi) return;
bonusActive.multi = true;
bonusMultiNextCatch = true;
// 4 saniye boyunca aktif kalsın, sonra otomatik olarak devre dışı bırak
// Timer text'i göster
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'multi') {
bonusTimerTexts[j].visible = true;
bonusTimerTexts[j].setText('6.0');
bonusTimerTexts[j]._bonusTimerStart = Date.now();
bonusTimerTexts[j]._bonusTimerDuration = 6000;
}
}
bonusTimers.multi = LK.setTimeout(function () {
bonusActive.multi = false;
bonusMultiNextCatch = false;
bonusReady.multi = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'multi') {
bonusUI[j].visible = false;
bonusTimerTexts[j].visible = false;
}
}
}, 6000);
}
if (type === 'double') {
// 4 saniye boyunca spawn edilen kedi sayısı 2 katı
if (bonusActive["double"]) return;
bonusActive["double"] = true;
bonusDoubleActive = true;
// Timer text'i göster
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'double') {
bonusTimerTexts[j].visible = true;
bonusTimerTexts[j].setText('6.0');
bonusTimerTexts[j]._bonusTimerStart = Date.now();
bonusTimerTexts[j]._bonusTimerDuration = 6000;
}
}
bonusTimers["double"] = LK.setTimeout(function () {
bonusActive["double"] = false;
bonusDoubleActive = false;
bonusReady["double"] = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'double') {
bonusUI[j].visible = false;
bonusTimerTexts[j].visible = false;
}
}
}, 6000);
}
// Bonus UI'da butonu pasifleştir
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === type) {
bonusUI[j].alpha = 0.3;
// Kalan adet sayısını güncelle
if (bonusCountTexts[j]) {
bonusCountTexts[j].setText(bonusCounts[type] > 0 ? bonusCounts[type] : "");
}
}
}
}
// Kedi ekleme fonksiyonu
function addCat() {
var cat = new Cat();
// Mevcut kademe seviyesine göre yeni kedinin hızını ayarla
var level = Math.floor(score / 10);
if (level > 0) {
cat.speed *= Math.pow(1.65, level);
}
// Eğer hız bonusu aktifse, yeni kediye de uygula
if (bonusActive.speed) {
cat.speed *= 0.05;
}
var margin = 180;
var minY = 350 + margin;
var maxY = 2732 - 220 - margin;
var minX = margin;
var maxX = 2048 - margin;
cat.x = minX + Math.random() * (maxX - minX);
cat.y = minY + Math.random() * (maxY - minY);
cats.push(cat);
game.addChild(cat);
}
// Başlangıçta kedileri ekle
for (var i = 0; i < maxCats; i++) {
addCat();
}
// Kedi yakalama fonksiyonu (Cat.down'dan çağrılır)
onCatCaught = function onCatCaught(cat) {
// Sürüklemeye başla
dragCat = cat;
dragOffsetX = 0;
dragOffsetY = 0;
// Efekt: hafifçe öne çıkar
tween(cat, {
scaleX: 1.25,
scaleY: 1.25
}, {
duration: 100
});
};
// Oyun alanında dokunma/sürükleme
game.down = function (x, y, obj) {
// Eğer bir kediye dokunulmadıysa, yakalayıcıyı sürükle
if (!dragCat) {
// Yakınsa yakalayıcıyı sürükle
var dx = x - catcher.x;
var dy = y - catcher.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 120) {
catcher.dragging = true;
dragOffsetX = catcher.x - x;
dragOffsetY = catcher.y - y;
}
}
};
game.move = function (x, y, obj) {
// Sürüklenen kedi varsa, onu hareket ettir
if (dragCat && !dragCat.removed) {
// Sadece catcher ile temas ediyorsa sürüklenebilsin
if (dragCat && dragCat.intersects && catcher && dragCat.intersects(catcher)) {
dragCat.x = x;
dragCat.y = y;
} else {
// Eğer artık temas yoksa, kediyi bırak
dragCat.caught = false;
tween(dragCat, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
dragCat = null;
}
// Kafesle kesişiyor mu?
if (dragCat && dragCat.intersects && cage && dragCat.intersects(cage)) {
// Çek Topla bonusu aktifse, 3 kedi birden topla
if (bonusMultiNextCatch && bonusActive.multi) {
var collected = 0;
for (var i = cats.length - 1; i >= 0; i--) {
var c = cats[i];
if (!c.caught && c.intersects(cage) && collected < 3) {
c.caught = true;
score += 1;
scoreTxt.setText(score);
if (typeof soundOn === "undefined" || soundOn) if (typeof soundOn === "undefined" || soundOn) LK.getSound('catch').play();
tween(c, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function (catRef) {
return function () {
if (catRef && typeof catRef.destroy === "function") {
catRef.destroy();
}
};
}(c)
});
cats.splice(i, 1);
collected++;
}
}
// DragCat de dahilse, onu da yok et
if (!dragCat.removed) {
tween(dragCat, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function onFinish() {
if (dragCat && typeof dragCat.destroy === "function") {
dragCat.destroy();
}
}
});
}
dragCat = null;
// 3 yeni kedi ekle (double bonus aktifse 6 ekle)
var toAdd = bonusDoubleActive ? 6 : 3;
for (var j = 0; j < toAdd; j++) addCat();
// Bonus pasifleşsin
bonusActive.multi = false;
bonusMultiNextCatch = false;
bonusReady.multi = false;
for (var j = 0; j < bonusUI.length; j++) {
if (bonusUI[j].type === 'multi') {
bonusUI[j].visible = false;
bonusUI[j].alpha = 0.7;
// Süre göstergesini de gizle
bonusTimerTexts[j].visible = false;
}
}
// Multi bonusu bittikten sonra tüm kedilerin hızını mevcut kademe seviyesine göre güncelle
var level = Math.floor(score / 10);
for (var i = 0; i < cats.length; i++) {
// Kedinin hızını sıfırdan kademe çarpanına göre ayarla
var baseSpeed = 3 + Math.random() * 2;
cats[i].speed = baseSpeed * Math.pow(1.65, level);
// Eğer hız bonusu aktifse, hız bonusunu da uygula
if (bonusActive.speed) {
cats[i].speed *= 0.05;
}
}
} else {
// Skor artır, ses çal, efekt
score += 1;
scoreTxt.setText(score);
if (typeof soundOn === "undefined" || soundOn) LK.getSound('catch').play();
// Kedi kaybolsun
tween(dragCat, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function onFinish() {
if (dragCat && typeof dragCat.destroy === "function") {
dragCat.destroy();
}
}
});
// Listeden çıkar
for (var i = 0; i < cats.length; i++) {
if (cats[i] === dragCat) {
cats.splice(i, 1);
break;
}
}
dragCat = null;
// Yeni kedi ekle (double bonus aktifse 2 ekle)
var toAdd = bonusDoubleActive ? 2 : 1;
for (var j = 0; j < toAdd; j++) addCat();
}
// Her 10 puanda bir kedilerin hızını %65 artır (birden fazla kademe atlanırsa hepsini uygula)
if (score > 0) {
var prevLevel = Math.floor((score - 1) / 10);
var newLevel = Math.floor(score / 10);
if (newLevel > prevLevel) {
var multiplier = Math.pow(1.65, newLevel - prevLevel);
// Tüm mevcut kedilerin hızını artır
for (var i = 0; i < cats.length; i++) {
// Kedinin temel hızını yeniden hesapla
var baseSpeed = 3 + Math.random() * 2;
var level = Math.floor(score / 10);
cats[i].speed = baseSpeed * Math.pow(1.65, level);
// Eğer hız bonusu aktifse, hız bonusunu da uygula
if (bonusActive.speed) {
cats[i].speed *= 0.05;
}
}
}
// Her 10 kedide bir, rastgele bonus ekle ve bu sonsuza kadar devam etsin
if (score > 0 && score % 10 === 0) {
// Rastgele bir bonus seç
var bonusIndex = Math.floor(Math.random() * bonusTypes.length);
var bonusType = bonusTypes[bonusIndex];
bonusUI[bonusIndex].visible = true;
bonusReady[bonusType] = true;
// Bonus sayısını artır
bonusCounts[bonusType] = (typeof bonusCounts[bonusType] === "number" ? bonusCounts[bonusType] : 0) + 1;
// Sayaç güncelle
if (bonusCountTexts[bonusIndex]) {
bonusCountTexts[bonusIndex].setText(bonusCounts[bonusType] > 0 ? bonusCounts[bonusType] : "");
}
}
}
}
}
// Yakalayıcı sürükleniyorsa
if (catcher.dragging) {
catcher.x = Math.max(120, Math.min(2048 - 120, x + dragOffsetX));
catcher.y = Math.max(200, Math.min(2732 - 120, y + dragOffsetY));
// Eğer henüz bir kedi tutulmuyorsa, catcher bir kediye değiyorsa onu eline al
if (!dragCat) {
for (var i = 0; i < cats.length; i++) {
var cat = cats[i];
if (!cat.caught && cat.intersects(catcher)) {
cat.caught = true;
dragCat = cat;
dragOffsetX = 0;
dragOffsetY = 0;
// Efekt: hafifçe öne çıkar
tween(cat, {
scaleX: 1.25,
scaleY: 1.25
}, {
duration: 100
});
break;
}
}
}
}
};
game.up = function (x, y, obj) {
// Sürükleme bitti
if (dragCat) {
// Eğer kafese bırakılmadıysa, kedi tekrar kaçmaya başlasın
if (!dragCat.removed) {
dragCat.caught = false;
tween(dragCat, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
dragCat = null;
}
catcher.dragging = false;
};
// Oyun güncelleme döngüsü
game.update = function () {
// Menü açıksa oyun güncellenmesin
if (typeof isMenuActive === "function" && isMenuActive()) {
// Müzik ayarı değiştiyse uygula
if (typeof game._musicPlaying === "undefined") game._musicPlaying = false;
if (musicOn && !game._musicPlaying) {
LK.playMusic('bgmusic');
game._musicPlaying = true;
}
if (!musicOn && game._musicPlaying) {
LK.stopMusic();
game._musicPlaying = false;
}
return;
}
// Kedileri güncelle
for (var i = 0; i < cats.length; i++) {
cats[i].update();
}
// Bonus timer textlerini güncelle
for (var i = 0; i < bonusUI.length; i++) {
var t = bonusTypes[i];
if (bonusActive[t]) {
// Timer text aktifse güncelle
if (bonusTimerTexts[i].visible && bonusTimerTexts[i]._bonusTimerStart) {
var elapsed = Date.now() - bonusTimerTexts[i]._bonusTimerStart;
var left = Math.max(0, bonusTimerTexts[i]._bonusTimerDuration - elapsed);
bonusTimerTexts[i].setText((left / 1000).toFixed(1));
// Süre bittiyse gizle (güvenlik için)
if (left <= 0) {
bonusTimerTexts[i].visible = false;
}
}
} else {
// Bonus aktif değilse timer text gizli olsun
bonusTimerTexts[i].visible = false;
bonusTimerTexts[i]._bonusTimerStart = null;
}
}
// Bonus UI butonlarının aktif/pasif durumunu güncelle
var _loop = function _loop() {
t = bonusTypes[i]; // Butonlar her zaman görünür, sadece alpha ile aktif/pasif göster
if (bonusReady[t] && !bonusActive[t]) {
bonusUI[i].alpha = 0.7;
// Yanıp sönme animasyonu kaldırıldı, bonus hazırsa alpha 0.7 olarak sabitleniyor
bonusUI[i].alpha = 0.7;
bonusUI[i]._flashing = false;
tween.stop(bonusUI[i], {
alpha: true
});
bonusUI[i].alpha = 0.7;
} else if (bonusActive[t]) {
bonusUI[i].alpha = 1.0;
// Aktifken yanıp sönme animasyonu yok, alpha 1.0 olarak sabitleniyor
bonusUI[i].alpha = 1.0;
bonusUI[i]._flashing = false;
tween.stop(bonusUI[i], {
alpha: true
});
bonusUI[i].alpha = 1.0;
} else {
bonusUI[i].alpha = 0.3;
// Pasifken yanıp sönme animasyonu yok, alpha 0.3 olarak sabitleniyor
bonusUI[i].alpha = 0.3;
bonusUI[i]._flashing = false;
tween.stop(bonusUI[i], {
alpha: true
});
bonusUI[i].alpha = 0.3;
}
bonusUI[i].visible = true;
};
for (var i = 0; i < bonusUI.length; i++) {
_loop();
}
// Zamanla yeni kedi ekle (zorluk artışı)
if (LK.ticks - lastCatAddTick > 600 && cats.length < maxCats + 2) {
addCat();
lastCatAddTick = LK.ticks;
}
// Sonsuz oyun: game over koşulu kaldırıldı, oyun sonsuza kadar devam eder
};
// Oyun başında skor sıfırla
score = 0;
scoreTxt.setText(score);
cat cage black. 2dNo backgraund,No shadows,Game assest
Cat backgraund sweet white. In-Game asset. 2d. High contrast. No shadows
Daire içinde yavaşlatma bonus butonu. In-Game asset. 2d. High contrast. No shadows
Daire içinde nesneyi artirma butonu. In-Game asset. 2d. High contrast. No shadows
Daire içinde elinde daha fazla av tutma butonu. In-Game asset. 2d. High contrast. No shadows
Çizgili dark arkaplan resmi ürkütücü. In-Game asset. 2d. High contrast. No shadows
Elinde ağ olan bir avcı . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat