Code edit (1 edits merged)
Please save this source code
User prompt
Ritim Gezegeni: Neptün Macerası
Initial prompt
dokunmatikdahilyap: 🎮 Oyun Adı: Ritim Gezegeni: Neptün Macerası 🪐 Müziğin ritmiyle çalışan bir gezegende, düzeni sağla! 🌌 KONU (Hikâye): Yıl 3025. Galaksinin kenarındaki mavi gezegen Neptün, sıradan bir yer değil. Tüm sistemi müzikle çalışan bu gezegenin ritmi bozuldu! Müzik Kristalleri çatladı ve ritmik enerji dağılmaya başladı. Eğer ritim toparlanamazsa, Neptün sonsuz bir sessizliğe gömülecek. Sen bir Uzay Ritim Kaşifi olarak, ritimle çalışan uzay geminle Neptün’e iniş yapıyorsun. Görevin: ritim kaynaklarını topla, ritmi bozmadan engelleri aş ve kayıp melodileri bul! 🕹️ OYNANIŞ (Gameplay): 🎵 Ritim Temelli Hareket: Oyuncu, müzik ritmine göre adım atar ve eylem yapar. (Tıpkı bir dans oyunu ama keşif ve bulmaca odaklı!) Düşmanlar, tuzaklar, kapılar ve kristaller müziğe göre hareket eder. Ritmi kaçırırsan enerji kaybedersin. 🧩 Mini Bulmacalar: Her bölümde ritme dayalı bulmacalar bulunur. Örneğin: Ses dalgası sırasını çözmek, Notaları sırayla çalmak, Melodi tamamlamak gibi. 🎛️ Klavye / Oyun Kolu Kontrolleri: Yön Tuşları / Analog Çubuk: Ritme uygun adım at Boşluk / A Tuşu: Ritim Patlaması – Etrafındaki düşmanları saf dışı bırak E Tuşu: Müzikal Kapı Aç – Gizli geçitleri aktif et Shift / B Tuşu: Kalkan – Ritme uygun savunma Q Tuşu: Tempo Değiştir – Daha hızlı veya yavaş ritimle geçiş sağlar 🗺️ BÖLÜMLER (Seviyeler): Başlangıç Kubbesi – Temel ritim hareketlerini öğren Donmuş Senfoni Vadisi – Buzlu zeminler ve kayan platformlar Melodi Fırtınası – Ritmin durduğu an her şey donar, zamanlama şart Echo Mağaraları – Yankılarla gizli melodileri keşfet Neptün'ün Kalbi – Ana kristal seni sınar, tam ritim uyumu gerek (Final boss!) 💡 NELERİYLE FARK YARATIR? Özellik Neden Etkileyici? 🎶 Ritim tabanlı keşif Müzik üzerinden öğrenme ve eğlence bir arada 🎮 Klasik kontrol + ritim uyumu Geniş oyuncu kitlesine uygun ve erişilebilir ❄️ Neptün teması Buzlu-mavi atmosferle benzersiz görsellik 🧠 Müzikli bulmacalar Hem zeka hem zamanlama gerektiriyor 🌠 Hikâye ve evren Bilimkurgu + ritim + macera birleşimi 🏆 Yarışma Uygunluğu: ✅ Müzik merkezde ✔️ ✅ Görsel efektler ✔️ ✅ Keşif ve bulmaca ögeleri ✔️ ✅ Seviyeli, yaratıcı tema ✔️ 🎁 Bonus Fikirler: Özel güçler: Ritim Bombası, Melodi Kalkanı Kendi melodini yarat: Seviye sonlarında oyuncunun ritim kaydedebileceği bir alan Topluluk bölümü: Steam veya özel sunucu üzerinden başkalarının seviyelerini oynayabilme
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Ritim Kaynağı (Collectible) var Beat = Container.expand(function () { var self = Container.call(this); var beatGfx = self.attachAsset('beat', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Boss Kristali var Boss = Container.expand(function () { var self = Container.call(this); var bossGfx = self.attachAsset('boss', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 5; self.pulse = function () { tween(bossGfx, { scaleX: 1.2, scaleY: 1.2 }, { duration: 100, onFinish: function onFinish() { tween(bossGfx, { scaleX: 1, scaleY: 1 }, { duration: 100 }); } }); }; return self; }); // Düşman (hareketli engel) var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGfx = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.dir = 1; // 1: sağ, -1: sol self.speed = 6; self.range = 300; // Hareket aralığı self.baseX = 0; self.init = function (x) { self.baseX = x; }; self.update = function () { self.x += self.dir * self.speed; if (self.x > self.baseX + self.range) self.dir = -1; if (self.x < self.baseX - self.range) self.dir = 1; }; return self; }); // Engeller var Obstacle = Container.expand(function () { var self = Container.call(this); var obsGfx = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Ritim Efekti (Pulse) var Pulse = Container.expand(function () { var self = Container.call(this); var pulseGfx = self.attachAsset('pulse', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3 }); self.show = function (x, y) { self.x = x; self.y = y; pulseGfx.scaleX = 0.5; pulseGfx.scaleY = 0.5; pulseGfx.alpha = 0.3; tween(pulseGfx, { scaleX: 1.2, scaleY: 1.2, alpha: 0 }, { duration: 350 }); }; return self; }); // Uzay Gemisi (Player) var Ship = Container.expand(function () { var self = Container.call(this); var shipGfx = self.attachAsset('ship', { anchorX: 0.5, anchorY: 0.5 }); self.energy = 3; // Can self.invincible = false; // Hasar sonrası kısa süreli dokunulmazlık // Enerji kaybı animasyonu self.flash = function () { if (self.invincible) return; self.invincible = true; tween(shipGfx, { alpha: 0.3 }, { duration: 100, easing: tween.linear, onFinish: function onFinish() { tween(shipGfx, { alpha: 1 }, { duration: 200, onFinish: function onFinish() { self.invincible = false; } }); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0a0033 }); /**** * Game Code ****/ // Müzik (looping, ritmik) // Sesler // Ritim efekti (görsel feedback) // Boss kristali (finalde) // Düşman (hareketli engel) // Engeller // Ritim kaynağı (collectible) // Uzay gemisi (player) // Oyun alanı boyutları var GAME_W = 2048; var GAME_H = 2732; // Ritim parametreleri var BPM = 100; // Dakikadaki vuruş var BEAT_INTERVAL = Math.round(60 * 1000 / BPM); // ms cinsinden var lastBeatTick = 0; // Oyun durumu var score = 0; var maxScore = 8; // Toplanacak ritim kaynağı sayısı var energy = 3; var level = 1; var onBoss = false; var bossDefeated = false; // Ana objeler var ship; var beats = []; var obstacles = []; var enemies = []; var boss; var pulseEffect; // GUI var scoreTxt = new Text2('0', { size: 120, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var energyTxt = new Text2('♥♥♥', { size: 90, fill: 0xFF5252 }); energyTxt.anchor.set(1, 0); LK.gui.topRight.addChild(energyTxt); // Ritim göstergesi var beatTxt = new Text2('♪', { size: 100, fill: 0xFFE066 }); beatTxt.anchor.set(0.5, 0.5); LK.gui.bottom.addChild(beatTxt); // Ritim efekti pulseEffect = new Pulse(); game.addChild(pulseEffect); // Oyun başlatıcı function startLevel() { // Temizle for (var i = 0; i < beats.length; i++) beats[i].destroy(); for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy(); for (var i = 0; i < enemies.length; i++) enemies[i].destroy(); beats = []; obstacles = []; enemies = []; if (boss) { boss.destroy(); boss = null; } onBoss = false; bossDefeated = false; score = 0; energy = 3; scoreTxt.setText(score + "/" + maxScore); energyTxt.setText("♥".repeat(energy)); // Uzay gemisi if (ship) ship.destroy(); ship = new Ship(); ship.x = GAME_W / 2; ship.y = GAME_H - 400; game.addChild(ship); // Ritim kaynakları (beat) var margin = 300; for (var i = 0; i < maxScore; i++) { var b = new Beat(); b.x = margin + i * ((GAME_W - 2 * margin) / (maxScore - 1)); b.y = 900 + 200 * Math.sin(i * Math.PI / (maxScore - 1)); beats.push(b); game.addChild(b); } // Engeller var obs1 = new Obstacle(); obs1.x = GAME_W / 2; obs1.y = 1400; obstacles.push(obs1); game.addChild(obs1); var obs2 = new Obstacle(); obs2.x = GAME_W / 2 - 400; obs2.y = 1800; obstacles.push(obs2); game.addChild(obs2); var obs3 = new Obstacle(); obs3.x = GAME_W / 2 + 400; obs3.y = 1800; obstacles.push(obs3); game.addChild(obs3); // Düşmanlar var e1 = new Enemy(); e1.x = GAME_W / 2; e1.y = 1200; e1.init(e1.x); enemies.push(e1); game.addChild(e1); // Boss yok } // Boss bölümü başlat function startBoss() { onBoss = true; for (var i = 0; i < beats.length; i++) beats[i].destroy(); for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy(); for (var i = 0; i < enemies.length; i++) enemies[i].destroy(); beats = []; obstacles = []; enemies = []; scoreTxt.setText("BOSS"); boss = new Boss(); boss.x = GAME_W / 2; boss.y = 700; game.addChild(boss); LK.getSound('boss').play(); } // Ritim tick'i function onBeat() { // Ritim efekti pulseEffect.show(ship.x, ship.y); // Ritim göstergesi animasyonu tween(beatTxt, { scaleX: 1.3, scaleY: 1.3 }, { duration: 80, onFinish: function onFinish() { tween(beatTxt, { scaleX: 1, scaleY: 1 }, { duration: 120 }); } }); // Adım sesi LK.getSound('step').play(); } // Ritimle hareket için bekleyen dokunuş var moveQueued = false; var queuedMove = { x: 0, y: 0 }; // Hareket yönleri function getMoveDir(x, y) { var dx = x - ship.x; var dy = y - ship.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 80) return { dx: 0, dy: 0 }; var angle = Math.atan2(dy, dx); var step = 220; return { dx: Math.round(Math.cos(angle) * step), dy: Math.round(Math.sin(angle) * step) }; } // Hareketi uygula (ritimle) function doMove() { if (!moveQueued) return; var dx = queuedMove.dx; var dy = queuedMove.dy; var newX = ship.x + dx; var newY = ship.y + dy; // Sınır kontrolü if (newX < 120) newX = 120; if (newX > GAME_W - 120) newX = GAME_W - 120; if (newY < 300) newY = 300; if (newY > GAME_H - 200) newY = GAME_H - 200; // Engel çarpışma kontrolü var blocked = false; for (var i = 0; i < obstacles.length; i++) { if (rectsIntersect(newX, newY, ship, obstacles[i].x, obstacles[i].y, obstacles[i])) { blocked = true; break; } } if (!blocked) { tween(ship, { x: newX, y: newY }, { duration: 120, easing: tween.cubicOut }); } moveQueued = false; } // Dikdörtgen çarpışma (merkezden) function rectsIntersect(x1, y1, obj1, x2, y2, obj2) { var w1 = obj1.width || 140, h1 = obj1.height || 140; var w2 = obj2.width || 160, h2 = obj2.height || 60; return Math.abs(x1 - x2) < (w1 + w2) / 2 - 10 && Math.abs(y1 - y2) < (h1 + h2) / 2 - 10; } // Dokunma ile hareket yönü seç game.down = function (x, y, obj) { if (onBoss && bossDefeated) return; var dir = getMoveDir(x, y); queuedMove.dx = dir.dx; queuedMove.dy = dir.dy; moveQueued = true; }; // Hareketli engeller ve boss için update game.update = function () { // Ritim tick'i if (LK.ticks - lastBeatTick >= Math.round(BEAT_INTERVAL / 16.7)) { lastBeatTick = LK.ticks; onBeat(); doMove(); } // Düşman hareketi for (var i = 0; i < enemies.length; i++) { enemies[i].update(); } // Düşman çarpışma for (var i = 0; i < enemies.length; i++) { if (ship.intersects(enemies[i]) && !ship.invincible) { energy--; energyTxt.setText("♥".repeat(energy)); ship.flash(); LK.getSound('hit').play(); if (energy <= 0) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } } // Ritim kaynağı toplama for (var i = beats.length - 1; i >= 0; i--) { if (ship.intersects(beats[i])) { LK.getSound('collect').play(); beats[i].destroy(); beats.splice(i, 1); score++; scoreTxt.setText(score + "/" + maxScore); if (score >= maxScore) { startBoss(); return; } } } // Boss bölümü if (onBoss && boss && !bossDefeated) { // Boss'a ritimle çarpınca hasar ver if (ship.intersects(boss) && moveQueued) { boss.hp--; boss.pulse(); LK.getSound('collect').play(); if (boss.hp <= 0) { bossDefeated = true; LK.effects.flashScreen(0x00e676, 1200); LK.showYouWin(); return; } } // Boss'a çarpınca enerji kaybı if (ship.intersects(boss) && !ship.invincible && !moveQueued) { energy--; energyTxt.setText("♥".repeat(energy)); ship.flash(); LK.getSound('hit').play(); if (energy <= 0) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } } }; // Müzik başlat LK.playMusic('bgmusic', { fade: { start: 0, end: 1, duration: 1200 } }); // Oyun başlat startLevel();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,436 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Ritim Kaynağı (Collectible)
+var Beat = Container.expand(function () {
+ var self = Container.call(this);
+ var beatGfx = self.attachAsset('beat', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+// Boss Kristali
+var Boss = Container.expand(function () {
+ var self = Container.call(this);
+ var bossGfx = self.attachAsset('boss', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.hp = 5;
+ self.pulse = function () {
+ tween(bossGfx, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(bossGfx, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 100
+ });
+ }
+ });
+ };
+ return self;
+});
+// Düşman (hareketli engel)
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGfx = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.dir = 1; // 1: sağ, -1: sol
+ self.speed = 6;
+ self.range = 300; // Hareket aralığı
+ self.baseX = 0;
+ self.init = function (x) {
+ self.baseX = x;
+ };
+ self.update = function () {
+ self.x += self.dir * self.speed;
+ if (self.x > self.baseX + self.range) self.dir = -1;
+ if (self.x < self.baseX - self.range) self.dir = 1;
+ };
+ return self;
+});
+// Engeller
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obsGfx = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+// Ritim Efekti (Pulse)
+var Pulse = Container.expand(function () {
+ var self = Container.call(this);
+ var pulseGfx = self.attachAsset('pulse', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ self.show = function (x, y) {
+ self.x = x;
+ self.y = y;
+ pulseGfx.scaleX = 0.5;
+ pulseGfx.scaleY = 0.5;
+ pulseGfx.alpha = 0.3;
+ tween(pulseGfx, {
+ scaleX: 1.2,
+ scaleY: 1.2,
+ alpha: 0
+ }, {
+ duration: 350
+ });
+ };
+ return self;
+});
+// Uzay Gemisi (Player)
+var Ship = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGfx = self.attachAsset('ship', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.energy = 3; // Can
+ self.invincible = false; // Hasar sonrası kısa süreli dokunulmazlık
+ // Enerji kaybı animasyonu
+ self.flash = function () {
+ if (self.invincible) return;
+ self.invincible = true;
+ tween(shipGfx, {
+ alpha: 0.3
+ }, {
+ duration: 100,
+ easing: tween.linear,
+ onFinish: function onFinish() {
+ tween(shipGfx, {
+ alpha: 1
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ self.invincible = false;
+ }
+ });
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x0a0033
+});
+
+/****
+* Game Code
+****/
+// Müzik (looping, ritmik)
+// Sesler
+// Ritim efekti (görsel feedback)
+// Boss kristali (finalde)
+// Düşman (hareketli engel)
+// Engeller
+// Ritim kaynağı (collectible)
+// Uzay gemisi (player)
+// Oyun alanı boyutları
+var GAME_W = 2048;
+var GAME_H = 2732;
+// Ritim parametreleri
+var BPM = 100; // Dakikadaki vuruş
+var BEAT_INTERVAL = Math.round(60 * 1000 / BPM); // ms cinsinden
+var lastBeatTick = 0;
+// Oyun durumu
+var score = 0;
+var maxScore = 8; // Toplanacak ritim kaynağı sayısı
+var energy = 3;
+var level = 1;
+var onBoss = false;
+var bossDefeated = false;
+// Ana objeler
+var ship;
+var beats = [];
+var obstacles = [];
+var enemies = [];
+var boss;
+var pulseEffect;
+// GUI
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var energyTxt = new Text2('♥♥♥', {
+ size: 90,
+ fill: 0xFF5252
+});
+energyTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(energyTxt);
+// Ritim göstergesi
+var beatTxt = new Text2('♪', {
+ size: 100,
+ fill: 0xFFE066
+});
+beatTxt.anchor.set(0.5, 0.5);
+LK.gui.bottom.addChild(beatTxt);
+// Ritim efekti
+pulseEffect = new Pulse();
+game.addChild(pulseEffect);
+// Oyun başlatıcı
+function startLevel() {
+ // Temizle
+ for (var i = 0; i < beats.length; i++) beats[i].destroy();
+ for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy();
+ for (var i = 0; i < enemies.length; i++) enemies[i].destroy();
+ beats = [];
+ obstacles = [];
+ enemies = [];
+ if (boss) {
+ boss.destroy();
+ boss = null;
+ }
+ onBoss = false;
+ bossDefeated = false;
+ score = 0;
+ energy = 3;
+ scoreTxt.setText(score + "/" + maxScore);
+ energyTxt.setText("♥".repeat(energy));
+ // Uzay gemisi
+ if (ship) ship.destroy();
+ ship = new Ship();
+ ship.x = GAME_W / 2;
+ ship.y = GAME_H - 400;
+ game.addChild(ship);
+ // Ritim kaynakları (beat)
+ var margin = 300;
+ for (var i = 0; i < maxScore; i++) {
+ var b = new Beat();
+ b.x = margin + i * ((GAME_W - 2 * margin) / (maxScore - 1));
+ b.y = 900 + 200 * Math.sin(i * Math.PI / (maxScore - 1));
+ beats.push(b);
+ game.addChild(b);
+ }
+ // Engeller
+ var obs1 = new Obstacle();
+ obs1.x = GAME_W / 2;
+ obs1.y = 1400;
+ obstacles.push(obs1);
+ game.addChild(obs1);
+ var obs2 = new Obstacle();
+ obs2.x = GAME_W / 2 - 400;
+ obs2.y = 1800;
+ obstacles.push(obs2);
+ game.addChild(obs2);
+ var obs3 = new Obstacle();
+ obs3.x = GAME_W / 2 + 400;
+ obs3.y = 1800;
+ obstacles.push(obs3);
+ game.addChild(obs3);
+ // Düşmanlar
+ var e1 = new Enemy();
+ e1.x = GAME_W / 2;
+ e1.y = 1200;
+ e1.init(e1.x);
+ enemies.push(e1);
+ game.addChild(e1);
+ // Boss yok
+}
+// Boss bölümü başlat
+function startBoss() {
+ onBoss = true;
+ for (var i = 0; i < beats.length; i++) beats[i].destroy();
+ for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy();
+ for (var i = 0; i < enemies.length; i++) enemies[i].destroy();
+ beats = [];
+ obstacles = [];
+ enemies = [];
+ scoreTxt.setText("BOSS");
+ boss = new Boss();
+ boss.x = GAME_W / 2;
+ boss.y = 700;
+ game.addChild(boss);
+ LK.getSound('boss').play();
+}
+// Ritim tick'i
+function onBeat() {
+ // Ritim efekti
+ pulseEffect.show(ship.x, ship.y);
+ // Ritim göstergesi animasyonu
+ tween(beatTxt, {
+ scaleX: 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 80,
+ onFinish: function onFinish() {
+ tween(beatTxt, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 120
+ });
+ }
+ });
+ // Adım sesi
+ LK.getSound('step').play();
+}
+// Ritimle hareket için bekleyen dokunuş
+var moveQueued = false;
+var queuedMove = {
+ x: 0,
+ y: 0
+};
+// Hareket yönleri
+function getMoveDir(x, y) {
+ var dx = x - ship.x;
+ var dy = y - ship.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < 80) return {
+ dx: 0,
+ dy: 0
+ };
+ var angle = Math.atan2(dy, dx);
+ var step = 220;
+ return {
+ dx: Math.round(Math.cos(angle) * step),
+ dy: Math.round(Math.sin(angle) * step)
+ };
+}
+// Hareketi uygula (ritimle)
+function doMove() {
+ if (!moveQueued) return;
+ var dx = queuedMove.dx;
+ var dy = queuedMove.dy;
+ var newX = ship.x + dx;
+ var newY = ship.y + dy;
+ // Sınır kontrolü
+ if (newX < 120) newX = 120;
+ if (newX > GAME_W - 120) newX = GAME_W - 120;
+ if (newY < 300) newY = 300;
+ if (newY > GAME_H - 200) newY = GAME_H - 200;
+ // Engel çarpışma kontrolü
+ var blocked = false;
+ for (var i = 0; i < obstacles.length; i++) {
+ if (rectsIntersect(newX, newY, ship, obstacles[i].x, obstacles[i].y, obstacles[i])) {
+ blocked = true;
+ break;
+ }
+ }
+ if (!blocked) {
+ tween(ship, {
+ x: newX,
+ y: newY
+ }, {
+ duration: 120,
+ easing: tween.cubicOut
+ });
+ }
+ moveQueued = false;
+}
+// Dikdörtgen çarpışma (merkezden)
+function rectsIntersect(x1, y1, obj1, x2, y2, obj2) {
+ var w1 = obj1.width || 140,
+ h1 = obj1.height || 140;
+ var w2 = obj2.width || 160,
+ h2 = obj2.height || 60;
+ return Math.abs(x1 - x2) < (w1 + w2) / 2 - 10 && Math.abs(y1 - y2) < (h1 + h2) / 2 - 10;
+}
+// Dokunma ile hareket yönü seç
+game.down = function (x, y, obj) {
+ if (onBoss && bossDefeated) return;
+ var dir = getMoveDir(x, y);
+ queuedMove.dx = dir.dx;
+ queuedMove.dy = dir.dy;
+ moveQueued = true;
+};
+// Hareketli engeller ve boss için update
+game.update = function () {
+ // Ritim tick'i
+ if (LK.ticks - lastBeatTick >= Math.round(BEAT_INTERVAL / 16.7)) {
+ lastBeatTick = LK.ticks;
+ onBeat();
+ doMove();
+ }
+ // Düşman hareketi
+ for (var i = 0; i < enemies.length; i++) {
+ enemies[i].update();
+ }
+ // Düşman çarpışma
+ for (var i = 0; i < enemies.length; i++) {
+ if (ship.intersects(enemies[i]) && !ship.invincible) {
+ energy--;
+ energyTxt.setText("♥".repeat(energy));
+ ship.flash();
+ LK.getSound('hit').play();
+ if (energy <= 0) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ return;
+ }
+ }
+ }
+ // Ritim kaynağı toplama
+ for (var i = beats.length - 1; i >= 0; i--) {
+ if (ship.intersects(beats[i])) {
+ LK.getSound('collect').play();
+ beats[i].destroy();
+ beats.splice(i, 1);
+ score++;
+ scoreTxt.setText(score + "/" + maxScore);
+ if (score >= maxScore) {
+ startBoss();
+ return;
+ }
+ }
+ }
+ // Boss bölümü
+ if (onBoss && boss && !bossDefeated) {
+ // Boss'a ritimle çarpınca hasar ver
+ if (ship.intersects(boss) && moveQueued) {
+ boss.hp--;
+ boss.pulse();
+ LK.getSound('collect').play();
+ if (boss.hp <= 0) {
+ bossDefeated = true;
+ LK.effects.flashScreen(0x00e676, 1200);
+ LK.showYouWin();
+ return;
+ }
+ }
+ // Boss'a çarpınca enerji kaybı
+ if (ship.intersects(boss) && !ship.invincible && !moveQueued) {
+ energy--;
+ energyTxt.setText("♥".repeat(energy));
+ ship.flash();
+ LK.getSound('hit').play();
+ if (energy <= 0) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ return;
+ }
+ }
+ }
+};
+// Müzik başlat
+LK.playMusic('bgmusic', {
+ fade: {
+ start: 0,
+ end: 1,
+ duration: 1200
+ }
+});
+// Oyun başlat
+startLevel();
\ No newline at end of file
MÜZİK NOTASI ŞEKLİNDE BİR COİN TARZI BİR ŞEY. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR BOSS ÇİZ AYAKSIZ. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR ÇİZ BU KARAKTER ETRAFTA DÖNEBLİYOR ONE GÖRE, AYAKSIZ. SİYAH KULLANMA. GÜLMESİN In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR GFEZEGEN ÇİZ. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR ENGEL AMA YATAY OLACAK. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR ÇİZ AMA BU KARAKTER PLAYER VE İSMİ COSMOS ONA GÖRE TASARLA. AYAKSIZ. dONT WRİTE TEXT İN TO İMAGE. NO BLACK In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR ÇİZ AMA BU KARAKTER PLAYER VE İSMİ ASTERA ONA GÖRE TASARLA. AYAKSIZ. dONT WRİTE TEXT İN TO İMAGE. NO BLACK. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR ÇİZ AMA BU KARAKTER PLAYER VE İSMİ VORTEX ONA GÖRE TASARLA. AYAKSIZ. dONT WRİTE TEXT İN TO İMAGE. NO BLACK.. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR ÇİZ AMA BU KARAKTER PLAYER VE İSMİ zenith ONA GÖRE TASARLA. AYAKSIZ. dONT WRİTE TEXT İN TO İMAGE. NO BLACK.. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR ÇİZ AMA BU KARAKTER PLAYER VE İSMİ Aurion ONA GÖRE TASARLA. AYAKSIZ. dONT WRİTE TEXT İN TO İMAGE. NO BLACK.. In-Game asset. 2d. High contrast. No shadows
MÜZİK NOTASI ŞEKLİNDE BİR UZAYLI CANAVAR ÇİZ AMA BU KARAKTER VE İSMİ Quasar ONA GÖRE TASARLA. AYAKSIZ. dONT WRİTE TEXT İN TO İMAGE. NO BLACK.. In-Game asset. 2d. High contrast. No shadows
yatay müzik notası şeklinde bir buton. In-Game asset. 2d. High contrast. No shadows
gezegensiz bir uzay temalı bir görsel background. In-Game asset. 2d. High contrast. No shadows
make a main menu button. In-Game asset. 2d. High contrast. No shadows