User prompt
Biraz daha büyült ve kediler bonus butonlarına temas etmesin mümkün olduğunca
User prompt
Tamam şimdi butonları biraz büyült ve aralarındaki boşluğuda eşit şekilde arttir
User prompt
Çok sağa olmuş bu seferde kafesle sağ tarafın tam ortasinda olsunlar
User prompt
Dahada sağa kaysın sağ tarafta ortalansınlar
User prompt
Butonlar biraz daha sağa kaysın ve kafesle arasinda boşluk olsun hepsinin
User prompt
Tüm bonuslar oyun boyunca kalıcı dursun butonları hepsi yan yana yatay şekilde oyun başindan sonuna kadar dursun
User prompt
Bonus butonları 3 tane olucak ve kafes ile boşluklu olucak
User prompt
Bonus butonları basınca kaybolmasın oyun boyunca orada dursun ve hepsi yan yana aralı şekilde dursun yatay şekilde ve biraz küçük olsun butonlar
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of null (reading 'intersects')' in or related to this line: 'if (dragCat.intersects(cage)) {' Line Number: 366
User prompt
Bonus butonu ile kafes arasinda boşluk olsun ve simgesi biraz daha büyük olsun ve her bonus için farklı buton ekle bunlarda yatay şekilde kafesin sağ tarafında yan yana olsun aralarında boşluk olsun ve 3 butonuda assest olarak kütüphaneye ekle
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'call')' in or related to this line: 'self.asset = Container.attachAsset.call(self, assetId, {' Line Number: 34
User prompt
Please fix the bug: 'self.attachAsset is not a function' in or related to this line: 'self.asset = self.attachAsset(assetId, {' Line Number: 36
User prompt
Şimdi ise oyuna 3 bonus eklicez bu bonus lardan oyun başında 1 tane olucak daha sonra random seklinde her 10 kedi yakaladıktan sonra 1 tanesi verilecek 1.Hız bonusu bu bonus kullanıldığında kedilerin hızı %5 e düşücek 4 saniyeligine diğer 2.Çek Topla bonusu bu bonus kullanıldığında oyuncu bir sonraki kedi tutuşunda 3 kedi tutabilecek bir kez bonus kullanildiktan sonra yine tek tek toplayacak 3.Dahada Kedi bonusu bu bonus kullanilinca spawn olan kediler 2 katı spawn olucak 4 saniyeligine bu bonuslar kafesin yaninda daire şeklinde aralı bir biçimde dursun bunların assestleri nide kütüphaneye ekle
User prompt
Hız %65 olsun
User prompt
Kademe her 10 kedide artsın ve %50 olsun hiz artmasi
User prompt
%40 hızlansın her kademede
User prompt
15 kedi toplayınca oyun bitmesin kediler her 15 tane topladiğimızda kademe kademe daha hızlı kaçsınlar sonsuza kadar devam etsin bu oyun
User prompt
Karakterimizi elimizle sürüklerken kediye değerse kediyi elinde tutsun
User prompt
Yakalarken karakterimizle yakalayalim karakter olustur bir tane avci onunla kedileri tutup atalim
User prompt
Hareket edebilen bir karakterimiz olsun onunla yakalayıp kafese atalım
User prompt
Please fix the bug: 'TypeError: Cannot read properties of null (reading 'destroy')' in or related to this line: 'dragCat.destroy();' Line Number: 212
Code edit (1 edits merged)
Please save this source code
User prompt
Kedi Yakalama Kaosu
Initial prompt
### **Oyun Adı: Kedi Yakalama Kaosu** **Tema:** Eğlenceli ve kaotik bir kedi yakalama oyunu **Grafik Türü:** 2D, sevimli piksel tarzı veya düz minimal çizimler **Oynanış:** Basit, sürükleyici, hız ve strateji odaklı --- ### **Oyun Mekanikleri:** 1️⃣ **Karakter**: Oyuncu, **bir kedi yakalayıcı** karakteri kontrol eder. 2️⃣ **Amaç**: Kaçan **kedileri hızlıca yakalayıp kafese koymak**. 3️⃣ **Kontroller**: - **Dokunarak** veya **sürükleyerek** kediyi yakala. - **Hızlı karar ver**, yoksa kedi kaçacak! 4️⃣ **Kedi Çeşitleri**: - **Normal Kedi**: Kaçar ama fazla zeki değil. - **Zıpır Kedi**: Sürekli zıplıyor, yakalaması zor. - **Kamuflajcı Kedi**: Nesnelerin arkasına saklanıyor. - **Süper Hızlı Kedi**: Çok hızlı koşuyor, sadece belirli bir tuzakla yakalanabilir. 5️⃣ **Özel Yardımcılar**: - **Balık Yemi**: Kedileri kısa süreliğine durdurur. - **Lazer Göstergesi**: Kediyi belirli bir noktaya çeker. - **Kedi Ağı**: Sadece belirli sayıda kullanabilirsin, dikkatli seç! 6️⃣ **Zorluk Seviyeleri**: - Kolay: **Az sayıda kedi, yavaş hareket** - Orta: **Hızlı ve çeşitli kaçan kediler** - Zor: **Kedilerin kaçış zekası artar, engeller eklenir** 7️⃣ **Puanlama Sistemi**: - **Ne kadar hızlı yakalarsan, o kadar fazla puan alırsın** - Özel bonuslar: **3 kedi yakalarsan ekstra puan!** --- **Ekstra Basitlik İçin:** ✅ **Tek tuşla kontrol edilebilir** (Dokun veya sürükle) ✅ **Basit 2D animasyonlarla kediler ve karakterler hareket eder** ✅ **Düşük işlem gücü gerektiren mekanikler (mobil uyumlu)** ✅ **Giderek artan hız ile eğlenceli kaos hissi yaratır**
/****
* 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