User prompt
Bonusların yanıp sönme işini kaldır
User prompt
Bonus verilmesi sırayla olmasın rastgele olsun
User prompt
Bonus kazanıldığinda bonus sayısina ekle göster ve bonus varken üzerine bonus eklenebilir kac tane toplandiysa o kada bonus altinda gosterilsin
User prompt
Oyun arkaplanı gitmiş geri getir saçmalama topladığımız kedi sayısıda yine ustte yazsın beyaz renk ve kalın bir fontla eski yerinde
User prompt
Bonus adet sayısının yazisı hem beyaz olsun hemde biraz daha kalın olsun
User prompt
Oyun başladığında her bonusumuzdan 1 tane olsun ve bonusun altında küçük bir şekilde kaç adet olduğu yazsın
User prompt
Menüde başlıklarin arası dikey biraz daha boşluklu olsun ve hepsi aynı boyutta olsun metinlerin oyunu anlatan yerdede metin rengini mavi yap ve daha kalın bir font kullan menüdede Arial Black Fontunu kullan
User prompt
Please fix the bug: 'TypeError: LK.isMusicPlaying is not a function' in or related to this line: 'if (musicOn && !LK.isMusicPlaying('bgmusic')) {' Line Number: 824
User prompt
Birde oyunumuza güzel bir menü ekleyelim başlama olsun ve bide oyunu anlatan kısım olsun bide ayarlar kısmı olsun ordada ses ayarlarını ayarlicaz müzık ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Bonuslar 6 saniye sürüyor artık
User prompt
Multi bonusuda 4 saniye sursün ve bu bonusların süresi butonlarin üzerinde gösterilsin bitesiye kadar bitince sayılar kaybolsun kullanildığı andan itibaren belirsin saysın bitene kadar sonra kaybolsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Kullanılmadan bonus eklensin ve eklenen bonus yanıp sönsün kullanasıya kadar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Oyunda her 10 kedi topladığimızda artarak bonus ver her 10 kedide bir bonu 20 de bir bonu 30 da bir bonus boyle olucak şekilde sonsuza kadar devam etsin bu
User prompt
Her 10 kedide yap bunu
User prompt
10 kedi toplayınca random bir bonus ekle ve o bonus kullanısıya kadar gitmesin
User prompt
Oyunun arkaplanını assesteki arkaplan görselini koy
User prompt
Arkaplanı assest olarak kütüphaneye eklermisin
User prompt
Eklenen kedilerde dahil
User prompt
1.bonusu kullandıktan sonra etkisi bitince yine tüm kediler aynı hızda devam etsin
User prompt
Kademe arttığında tüm kediler hızlansın
User prompt
Oyunumuzda kaybetme yok sürekli devam edicek sonsuza kadar
User prompt
200 kedi toplayana kadar oyunda kaybetme olmiyacak
User prompt
Kullanasıya kadar yanıp sönsün ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Bonuslar dolunca yanıp sönsün ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Oyuncu elimdeyken bonus butonlarına dokunulduğunda işlemesin
/****
* 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 görselini ekle
// Arkaplan asseti eklendi
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: bonusReady ve bonus aktif değilse başlat
if (!bonusUI[i]._flashing) {
var _flashLoop = function flashLoop(btn) {
// Bonus kullanılana kadar yanıp sönmeye devam etsin
if (!bonusReady[btn.type] || bonusActive[btn.type]) {
// Bonus hazır değil veya aktif olduysa animasyonu durdur
btn._flashing = false;
tween.stop(btn, {
alpha: true
});
btn.alpha = 0.7;
return;
}
tween(btn, {
alpha: 1
}, {
duration: 350,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(btn, {
alpha: 0.5
}, {
duration: 350,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Kullanana kadar yanıp sönmeye devam et
if (btn._flashing && bonusReady[btn.type] && !bonusActive[btn.type]) _flashLoop(btn);
}
});
}
});
};
bonusUI[i]._flashing = true;
_flashLoop(bonusUI[i]);
}
} else if (bonusActive[t]) {
bonusUI[i].alpha = 1.0;
// Aktifken yanıp sönmeyi durdur
if (bonusUI[i]._flashing) {
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önmeyi durdur
if (bonusUI[i]._flashing) {
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); ===================================================================
--- original.js
+++ change.js
@@ -750,12 +750,12 @@
cats[i].speed *= 0.05;
}
}
}
- // Her 10 kedide bir, artarak bonus ekle ve bu sonsuza kadar devam etsin
+ // Her 10 kedide bir, rastgele bonus ekle ve bu sonsuza kadar devam etsin
if (score > 0 && score % 10 === 0) {
- // Hangi bonusun verileceğini sırayla belirle (artarak)
- var bonusIndex = Math.floor((score / 10 - 1) % bonusTypes.length);
+ // 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
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