User prompt
oyun level 10 da bitiyor böyle olmasın 20 levelda bitsin
User prompt
sen galiba level çizgisini beyine benzetmişsin ama bu pek iyi olmamış oraya sade bir düz çizgi yap eskisi gibi
User prompt
üst taraftaki level çizgisini düzelt eskisi gibi yap
User prompt
anı parçalarına mausumla tek bir kez bastığımda alınabilir şeklinde yap
Code edit (1 edits merged)
Please save this source code
User prompt
Parçalanmış Anılar (Shattered Memories)
Initial prompt
Upit İçin Oyun Projesi Tanıtımı: Parçalanmış Anılar Merhaba Upit Ekibi! Yeni bir aksiyon-bulmaca oyunu fikrimi hayata geçirmek için Upit'in yeteneklerini kullanmak istiyorum. Oyunun adı "Parçalanmış Anılar". Oyunun Genel Konsepti "Parçalanmış Anılar", hafızasını kaybetmiş bir karakterin, soyut bir ortamda beliren anı parçacıklarını yakalayarak veya etkisiz hale getirerek geçmişini yeniden inşa etmesini konu alan, hızlı tempolu bir aksiyon ve reaksiyon oyunudur. Oyuncu, anılarını yok etmeye çalışan unutulmuş gölgelerden kaçarken, beliren desenleri hızlıca çözmeli ve doğru anlara tepki vermelidir. Temel Oyun Mekanikleri ve Upit Uygulaması Ana Oyun Alanı (Arka Plan): Koyu tonlarda (siyah, gri, lacivert) soyut, minimalist bir arka plan. Upit'te farklı katmanlarla derinlik hissi verilebilir. Arka planda hafif, hareketli, puslu efektler veya partiküller olabilir (eğer Upit'te bu tür görsel efektler destekleniyorsa). Ortada veya alt kısımda oyuncu karakterini temsil eden basit bir ikon/şekil (örneğin, bir ışık zerresi, basit bir siluet) bulunacak. Anı Parçacıkları (Etkileşimli Nesneler): Farklı renklerde (örneğin canlı mavi, parlak sarı, derin mor) ve basit geometrik şekillerde (daire, kare, üçgen) veya soyut semboller şeklinde "anı parçacıkları" olacak. Bu parçacıklar, oyun alanında belirli noktalardan belirecek ve önceden belirlenmiş bir hızda ve düzende (örneğin, yatay olarak kayarak, belirli bir noktadan dışa doğru yayılarak, dikey olarak düşerek) hareket edecek. Upit Uygulaması: Bu parçacıklar, Upit'in sürükle-bırak görsel nesneleri olarak tasarlanacak. Her parçacığın belirli bir hareket yolu/animasyonu olacak. Oyuncu Etkileşimi (Tıklama/Dokunma): Yakala (Doğru Anı): Oyuncu, beliren anı parçacıklarına doğru zamanda tıklamalı veya dokunmalı. Başarılı bir tıklama, anı parçacığının kaybolmasını ve oyuncunun hafıza barının dolmasını sağlayacak. Upit Uygulaması: Her anı parçacığı, üzerine tıklama/dokunma olayı algılayıcısı (on-click event) ile donatılacak. Tıklama sonrası parçacık kaybolacak ve bir değişken (hafıza puanı) artırılacak. Unutulmuş Gölgeler (Tehditler): Oyun alanında dolaşan veya oyuncuyu takip eden, genellikle koyu, dalgalı veya titreyen soyut "gölge" figürleri. Oyuncu bu gölgelere dokunursa, hafıza barı azalacak veya oyun sona erecek. Upit Uygulaması: Gölgeler de hareketli görsel nesneler olacak. Oyuncu karakteri ile gölgeler arasında çarpışma algılayıcısı (collision detection) kurulacak. Çarpışma durumunda hafıza değişkeni azaltılacak veya oyun bitiş ekranına yönlendirilecek. Hafıza Barı ve İlerleme: Ekranın üst kısmında veya köşesinde, oyuncunun hafızasını temsil eden bir ilerleme çubuğu (progress bar) bulunacak. Doğru anılar yakalandıkça bar dolacak. Bar tamamen dolduğunda yeni bir "bellek parçası" açığa çıkacak (kısa bir görsel/metin ipucu) ve oyuncu yeni bir seviyeye geçecek. Upit Uygulaması: Basit bir görsel çubuk ve buna bağlı bir sayısal değişken kullanılacak. Değişkenin değeri arttıkça çubuğun görseli güncellenecek. Zorluk Seviyeleri: Oyun ilerledikçe: Anı parçacıklarının belirme hızı artacak. Gölgeler daha hızlı veya daha öngörülemez hale gelecek. Anı parçacıklarının desenleri daha karmaşıklaşacak (örneğin, aynı anda birden fazla anının belirmesi). Upit Uygulaması: Her seviye için farklı hız değişkenleri ve animasyon zamanlamaları ayarlanacak. Belirli bir hafıza puanına ulaşıldığında oyun durumu (state) değişecek. Upit'ten Beklentilerim Görsel nesneleri kolayca oluşturma, boyutlandırma ve animasyonlandırma. Nesneler için tıklama/dokunma olaylarını yönetme. Basit çarpışma algılaması (collision detection) yeteneği. Değişkenler ve koşullu mantık (eğer X olursa Y yap) kullanarak oyun mekaniklerini programlama. Sahneler arası geçiş (oyun ekranı, bitiş ekranı, giriş ekranı).
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var MemoryFragment = Container.expand(function (fragmentType) { var self = Container.call(this); var colors = [0x00ff00, 0xff6600, 0x0099ff, 0xffff00, 0xff00ff]; var shapes = ['memoryFragment', 'memorySquare', 'memoryTriangle']; fragmentType = fragmentType || Math.floor(Math.random() * shapes.length); var selectedShape = shapes[fragmentType]; var selectedColor = colors[Math.floor(Math.random() * colors.length)]; var graphics = self.attachAsset(selectedShape, { anchorX: 0.5, anchorY: 0.5 }); graphics.tint = selectedColor; self.fragmentType = fragmentType; self.speedX = (Math.random() - 0.5) * 4; self.speedY = Math.random() * 2 + 1; self.collected = false; self.update = function () { if (!self.collected) { self.x += self.speedX; self.y += self.speedY; // Bounce off walls if (self.x <= 40 || self.x >= 2008) { self.speedX *= -1; } if (self.y <= 40 || self.y >= 2692) { self.speedY *= -1; } // Keep in bounds if (self.x < 40) self.x = 40; if (self.x > 2008) self.x = 2008; if (self.y < 40) self.y = 40; if (self.y > 2692) self.y = 2692; } }; self.down = function (x, y, obj) { if (!self.collected) { self.collected = true; memoryCount++; memoryBar += 10; if (memoryBar > 100) memoryBar = 100; LK.effects.flashObject(self, 0xffffff, 300); LK.getSound('collectMemory').play(); // Immediately remove from array to prevent multiple collections var index = memoryFragments.indexOf(self); if (index > -1) { memoryFragments.splice(index, 1); } tween(self, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); graphics.alpha = 0.8; return self; }); var Shadow = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('shadow', { anchorX: 0.5, anchorY: 0.5 }); graphics.alpha = 0.7; self.speedX = (Math.random() - 0.5) * 3; self.speedY = (Math.random() - 0.5) * 3; self.targetX = Math.random() * 2048; self.targetY = Math.random() * 2732; self.update = function () { // Move towards target var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 10) { self.x += dx / distance * (1 + gameLevel * 0.5); self.y += dy / distance * (1 + gameLevel * 0.5); } else { // Pick new target self.targetX = Math.random() * 2048; self.targetY = Math.random() * 2732; } // Check collision with player if (self.intersects(player)) { if (!playerInvulnerable) { memoryBar -= 20; playerInvulnerable = true; LK.effects.flashObject(player, 0xff0000, 500); LK.effects.flashScreen(0xff0000, 200); LK.getSound('shadowHit').play(); LK.setTimeout(function () { playerInvulnerable = false; }, 1000); if (memoryBar <= 0) { LK.showGameOver(); } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x111111 }); /**** * Game Code ****/ var player; var memoryFragments = []; var shadows = []; var memoryBar = 0; var memoryCount = 0; var gameLevel = 1; var playerInvulnerable = false; var fragmentSpawnTimer = 0; var shadowSpawnTimer = 0; // UI Elements var memoryBarBg = LK.getAsset('memorySquare', { width: 400, height: 20, anchorX: 0.5, anchorY: 0.5 }); memoryBarBg.tint = 0x333333; var memoryBarFill = LK.getAsset('memorySquare', { width: 4, height: 20, anchorX: 0, anchorY: 0.5 }); memoryBarFill.tint = 0x00ff88; var levelText = new Text2('Level 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0); var memoryText = new Text2('Memories: 0', { size: 40, fill: 0xCCCCCC }); memoryText.anchor.set(1, 0); // Position UI elements LK.gui.top.addChild(memoryBarBg); LK.gui.top.addChild(memoryBarFill); LK.gui.top.addChild(levelText); LK.gui.topRight.addChild(memoryText); memoryBarBg.y = 120; memoryBarFill.x = memoryBarBg.x - memoryBarBg.width / 2; memoryBarFill.y = 120; levelText.y = 50; memoryText.x = -50; memoryText.y = 50; // Initialize player player = game.addChild(new Player()); player.x = 1024; player.y = 1366; // Touch controls var isDragging = false; game.down = function (x, y, obj) { isDragging = true; player.x = x; player.y = y; }; game.move = function (x, y, obj) { if (isDragging) { player.x = x; player.y = y; } }; game.up = function (x, y, obj) { isDragging = false; }; function spawnMemoryFragment() { var fragment = new MemoryFragment(); fragment.x = Math.random() * 1800 + 124; fragment.y = Math.random() * 1800 + 124; memoryFragments.push(fragment); game.addChild(fragment); } function spawnShadow() { if (shadows.length < 2 + gameLevel) { var shadow = new Shadow(); shadow.x = Math.random() * 2048; shadow.y = Math.random() * 2732; shadows.push(shadow); game.addChild(shadow); } } function updateMemoryBar() { var fillWidth = memoryBar / 100 * memoryBarBg.width; memoryBarFill.width = fillWidth; if (memoryBar >= 100) { gameLevel++; memoryBar = 0; levelText.setText('Level ' + gameLevel); // Clear all fragments and shadows for new level for (var i = memoryFragments.length - 1; i >= 0; i--) { memoryFragments[i].destroy(); memoryFragments.splice(i, 1); } LK.effects.flashScreen(0x00ff88, 500); if (gameLevel >= 10) { LK.showYouWin(); } } } game.update = function () { // Update memory bar display updateMemoryBar(); memoryText.setText('Memories: ' + memoryCount); // Spawn memory fragments fragmentSpawnTimer++; var spawnRate = Math.max(60 - gameLevel * 5, 20); if (fragmentSpawnTimer >= spawnRate) { spawnMemoryFragment(); fragmentSpawnTimer = 0; } // Spawn shadows shadowSpawnTimer++; if (shadowSpawnTimer >= 180) { spawnShadow(); shadowSpawnTimer = 0; } // Clean up fragments that are too old for (var i = memoryFragments.length - 1; i >= 0; i--) { var fragment = memoryFragments[i]; if (fragment.collected) continue; // Remove fragments after some time if (LK.ticks % 600 === 0 && Math.random() < 0.1) { fragment.destroy(); memoryFragments.splice(i, 1); } } // Limit number of fragments on screen while (memoryFragments.length > 8 + gameLevel) { var oldestFragment = memoryFragments[0]; oldestFragment.destroy(); memoryFragments.splice(0, 1); } }; // Start background music LK.playMusic('bgMusic'); // Initial spawns spawnMemoryFragment(); spawnMemoryFragment(); spawnShadow();
===================================================================
--- original.js
+++ change.js
@@ -140,39 +140,39 @@
var fragmentSpawnTimer = 0;
var shadowSpawnTimer = 0;
// UI Elements
var memoryBarBg = LK.getAsset('memorySquare', {
- scaleX: 15,
- scaleY: 0.5,
+ width: 400,
+ height: 20,
anchorX: 0.5,
- anchorY: 0
+ anchorY: 0.5
});
memoryBarBg.tint = 0x333333;
var memoryBarFill = LK.getAsset('memorySquare', {
- scaleX: 0.1,
- scaleY: 0.5,
+ width: 4,
+ height: 20,
anchorX: 0,
- anchorY: 0
+ anchorY: 0.5
});
memoryBarFill.tint = 0x00ff88;
var levelText = new Text2('Level 1', {
- size: 80,
+ size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
var memoryText = new Text2('Memories: 0', {
- size: 60,
+ size: 40,
fill: 0xCCCCCC
});
memoryText.anchor.set(1, 0);
// Position UI elements
LK.gui.top.addChild(memoryBarBg);
LK.gui.top.addChild(memoryBarFill);
LK.gui.top.addChild(levelText);
LK.gui.topRight.addChild(memoryText);
-memoryBarBg.y = 150;
-memoryBarFill.x = LK.gui.top.width / 2 - memoryBarBg.width * memoryBarBg.scaleX / 2;
-memoryBarFill.y = 150;
+memoryBarBg.y = 120;
+memoryBarFill.x = memoryBarBg.x - memoryBarBg.width / 2;
+memoryBarFill.y = 120;
levelText.y = 50;
memoryText.x = -50;
memoryText.y = 50;
// Initialize player
@@ -211,10 +211,10 @@
game.addChild(shadow);
}
}
function updateMemoryBar() {
- var fillWidth = memoryBar / 100 * (memoryBarBg.width * memoryBarBg.scaleX);
- memoryBarFill.scaleX = fillWidth / memoryBarFill.width;
+ var fillWidth = memoryBar / 100 * memoryBarBg.width;
+ memoryBarFill.width = fillWidth;
if (memoryBar >= 100) {
gameLevel++;
memoryBar = 0;
levelText.setText('Level ' + gameLevel);