/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Renkli bloklar için ana sınıf
var Block = Container.expand(function () {
var self = Container.call(this);
// Rastgele bir renk seç
var colorList = ['blockRed', 'blockGreen', 'blockBlue', 'blockYellow', 'blockPurple', 'blockCyan', 'blockOrange'];
var colorId = colorList[Math.floor(Math.random() * colorList.length)];
var blockAsset = self.attachAsset(colorId, {
anchorX: 0.5,
anchorY: 0.5
});
// Blok ömrü (ms cinsinden)
self.lifetime = 1500; // Başlangıçta 1.5 saniye
self.spawnTime = LK.ticks;
self.isAlive = true;
// Blok patlatıldığında animasyon ve yok etme
self.pop = function () {
if (!self.isAlive) return;
self.isAlive = false;
// Patlama efekti
var pop = LK.getAsset('popCircle', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0,
scaleX: 0.5,
scaleY: 0.5,
alpha: 0.7
});
self.addChild(pop);
tween(pop, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 220,
easing: tween.easeOut,
onFinish: function onFinish() {
pop.destroy();
}
});
// Ses efekti
LK.getSound('pop').play();
// Blok kaybolsun
tween(self, {
alpha: 0,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 180,
onFinish: function onFinish() {
self.destroy();
}
});
};
// Blok tıklama olayı
self.down = function (x, y, obj) {
if (!self.isAlive) return;
self.pop();
// Skoru artır
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
// Zorluk artırıcı: Her 5 puanda blok ömrünü biraz azalt
if (LK.getScore() % 5 === 0 && blockLifetime > 600) {
blockLifetime -= 100;
}
};
// Her frame blok ömrünü kontrol et
self.update = function () {
if (!self.isAlive) return;
var elapsed = (LK.ticks - self.spawnTime) * (1000 / 60);
if (elapsed > self.lifetime) {
self.isAlive = false;
self.miss();
}
};
// Kaçırıldığında çağrılır
self.miss = function () {
// Blok kaybolsun
tween(self, {
alpha: 0
}, {
duration: 180,
onFinish: function onFinish() {
self.destroy();
}
});
// Canı azalt
loseLife();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Blok patlama sesi
// Patlama efekti için küçük bir daire
// Renkli bloklar için farklı renklerde kutular tanımlanıyor
// Skor göstergesi
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Can göstergesi (kalp simgeleri yerine kutucuklar)
var maxLives = 3;
var lives = maxLives;
var lifeBoxes = [];
function drawLives() {
// Önceki kutuları temizle
for (var i = 0; i < lifeBoxes.length; i++) {
if (lifeBoxes[i].parent) lifeBoxes[i].parent.removeChild(lifeBoxes[i]);
}
lifeBoxes = [];
for (var i = 0; i < maxLives; i++) {
var box = LK.getAsset('blockRed', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.35,
scaleY: 0.35,
alpha: i < lives ? 1 : 0.25
});
// Ekranın üst sağ köşesine diz
box.x = LK.gui.width - 60 - i * 80;
box.y = 80;
LK.gui.addChild(box);
lifeBoxes.push(box);
}
}
drawLives();
// Bloklar için global dizi
var blocks = [];
// Blok çıkış süresi (ms)
var blockLifetime = 1500;
// Blok çıkış aralığı (ms)
var blockInterval = 900;
var minBlockInterval = 400;
var blockIntervalDecrease = 30;
// Son blok çıkış zamanı
var lastBlockTick = 0;
// Blokların çıkabileceği alan (kenarlardan taşmasın)
var margin = 160;
// Can kaybetme fonksiyonu
function loseLife() {
lives--;
drawLives();
// Ekranı kısa süre kırmızıya flashla
LK.effects.flashScreen(0xff3b30, 300);
if (lives <= 0) {
// Oyun bitti
LK.showGameOver();
}
}
// Yeni blok oluştur
function spawnBlock() {
var block = new Block();
// Blok ömrünü güncel zorlukla ayarla
block.lifetime = blockLifetime;
// Rastgele pozisyon (kenarlardan taşmasın)
var bx = margin + Math.random() * (2048 - 2 * margin);
var by = 300 + Math.random() * (2732 - 2 * margin - 300);
block.x = bx;
block.y = by;
block.alpha = 0;
block.scaleX = 0.7;
block.scaleY = 0.7;
// Hafif büyüyerek görünme animasyonu
tween(block, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 180,
easing: tween.easeOut
});
blocks.push(block);
game.addChild(block);
}
// Oyun güncelleme döngüsü
game.update = function () {
// Blok çıkış zamanını kontrol et
if (LK.ticks - lastBlockTick > blockInterval / 1000 * 60) {
spawnBlock();
lastBlockTick = LK.ticks;
// Zorluk: Aralığı azalt
if (blockInterval > minBlockInterval) {
blockInterval -= blockIntervalDecrease;
}
}
// Blokları güncelle
for (var i = blocks.length - 1; i >= 0; i--) {
var b = blocks[i];
if (!b.parent) {
blocks.splice(i, 1);
continue;
}
if (b.update) b.update();
}
};
// Oyun başladığında skor ve canları sıfırla
function resetGame() {
LK.setScore(0);
scoreTxt.setText('0');
lives = maxLives;
drawLives();
blockLifetime = 1500;
blockInterval = 900;
lastBlockTick = LK.ticks;
// Tüm blokları temizle
for (var i = blocks.length - 1; i >= 0; i--) {
if (blocks[i].parent) blocks[i].destroy();
blocks.splice(i, 1);
}
}
resetGame();
// Oyun yeniden başladığında sıfırla
game.on('reset', function () {
resetGame();
});
// Ekranın üst sol köşesini boş bırak (oyun menüsü için)
game.on('resize', function () {
drawLives();
}); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Renkli bloklar için ana sınıf
var Block = Container.expand(function () {
var self = Container.call(this);
// Rastgele bir renk seç
var colorList = ['blockRed', 'blockGreen', 'blockBlue', 'blockYellow', 'blockPurple', 'blockCyan', 'blockOrange'];
var colorId = colorList[Math.floor(Math.random() * colorList.length)];
var blockAsset = self.attachAsset(colorId, {
anchorX: 0.5,
anchorY: 0.5
});
// Blok ömrü (ms cinsinden)
self.lifetime = 1500; // Başlangıçta 1.5 saniye
self.spawnTime = LK.ticks;
self.isAlive = true;
// Blok patlatıldığında animasyon ve yok etme
self.pop = function () {
if (!self.isAlive) return;
self.isAlive = false;
// Patlama efekti
var pop = LK.getAsset('popCircle', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0,
scaleX: 0.5,
scaleY: 0.5,
alpha: 0.7
});
self.addChild(pop);
tween(pop, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 220,
easing: tween.easeOut,
onFinish: function onFinish() {
pop.destroy();
}
});
// Ses efekti
LK.getSound('pop').play();
// Blok kaybolsun
tween(self, {
alpha: 0,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 180,
onFinish: function onFinish() {
self.destroy();
}
});
};
// Blok tıklama olayı
self.down = function (x, y, obj) {
if (!self.isAlive) return;
self.pop();
// Skoru artır
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
// Zorluk artırıcı: Her 5 puanda blok ömrünü biraz azalt
if (LK.getScore() % 5 === 0 && blockLifetime > 600) {
blockLifetime -= 100;
}
};
// Her frame blok ömrünü kontrol et
self.update = function () {
if (!self.isAlive) return;
var elapsed = (LK.ticks - self.spawnTime) * (1000 / 60);
if (elapsed > self.lifetime) {
self.isAlive = false;
self.miss();
}
};
// Kaçırıldığında çağrılır
self.miss = function () {
// Blok kaybolsun
tween(self, {
alpha: 0
}, {
duration: 180,
onFinish: function onFinish() {
self.destroy();
}
});
// Canı azalt
loseLife();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Blok patlama sesi
// Patlama efekti için küçük bir daire
// Renkli bloklar için farklı renklerde kutular tanımlanıyor
// Skor göstergesi
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Can göstergesi (kalp simgeleri yerine kutucuklar)
var maxLives = 3;
var lives = maxLives;
var lifeBoxes = [];
function drawLives() {
// Önceki kutuları temizle
for (var i = 0; i < lifeBoxes.length; i++) {
if (lifeBoxes[i].parent) lifeBoxes[i].parent.removeChild(lifeBoxes[i]);
}
lifeBoxes = [];
for (var i = 0; i < maxLives; i++) {
var box = LK.getAsset('blockRed', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.35,
scaleY: 0.35,
alpha: i < lives ? 1 : 0.25
});
// Ekranın üst sağ köşesine diz
box.x = LK.gui.width - 60 - i * 80;
box.y = 80;
LK.gui.addChild(box);
lifeBoxes.push(box);
}
}
drawLives();
// Bloklar için global dizi
var blocks = [];
// Blok çıkış süresi (ms)
var blockLifetime = 1500;
// Blok çıkış aralığı (ms)
var blockInterval = 900;
var minBlockInterval = 400;
var blockIntervalDecrease = 30;
// Son blok çıkış zamanı
var lastBlockTick = 0;
// Blokların çıkabileceği alan (kenarlardan taşmasın)
var margin = 160;
// Can kaybetme fonksiyonu
function loseLife() {
lives--;
drawLives();
// Ekranı kısa süre kırmızıya flashla
LK.effects.flashScreen(0xff3b30, 300);
if (lives <= 0) {
// Oyun bitti
LK.showGameOver();
}
}
// Yeni blok oluştur
function spawnBlock() {
var block = new Block();
// Blok ömrünü güncel zorlukla ayarla
block.lifetime = blockLifetime;
// Rastgele pozisyon (kenarlardan taşmasın)
var bx = margin + Math.random() * (2048 - 2 * margin);
var by = 300 + Math.random() * (2732 - 2 * margin - 300);
block.x = bx;
block.y = by;
block.alpha = 0;
block.scaleX = 0.7;
block.scaleY = 0.7;
// Hafif büyüyerek görünme animasyonu
tween(block, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 180,
easing: tween.easeOut
});
blocks.push(block);
game.addChild(block);
}
// Oyun güncelleme döngüsü
game.update = function () {
// Blok çıkış zamanını kontrol et
if (LK.ticks - lastBlockTick > blockInterval / 1000 * 60) {
spawnBlock();
lastBlockTick = LK.ticks;
// Zorluk: Aralığı azalt
if (blockInterval > minBlockInterval) {
blockInterval -= blockIntervalDecrease;
}
}
// Blokları güncelle
for (var i = blocks.length - 1; i >= 0; i--) {
var b = blocks[i];
if (!b.parent) {
blocks.splice(i, 1);
continue;
}
if (b.update) b.update();
}
};
// Oyun başladığında skor ve canları sıfırla
function resetGame() {
LK.setScore(0);
scoreTxt.setText('0');
lives = maxLives;
drawLives();
blockLifetime = 1500;
blockInterval = 900;
lastBlockTick = LK.ticks;
// Tüm blokları temizle
for (var i = blocks.length - 1; i >= 0; i--) {
if (blocks[i].parent) blocks[i].destroy();
blocks.splice(i, 1);
}
}
resetGame();
// Oyun yeniden başladığında sıfırla
game.on('reset', function () {
resetGame();
});
// Ekranın üst sol köşesini boş bırak (oyun menüsü için)
game.on('resize', function () {
drawLives();
});