Code edit (1 edits merged)
Please save this source code
User prompt
oyunu türkçe diline çevir ve ana menü olsun oyunda
User prompt
isabet edince elektron yok olmak yerine animasyonlu bir şekilde çekirdeğin etrafına dizilsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Electron Configuration Basketball
Initial prompt
🎮 OYUN ADI: ELEKTRON DİZİLİMİ BASKETBOLU 🧠 TÜR: Kimya eğitimi + fizik tabanlı nişan alma oyunu 📚 AMAÇ: Oyuncuya periyodik tablodaki ilk 20 elementin elektron dizilimini öğretmek --- 🌍 OYUNUN ANA KONSEPTİ: Oyuncu, bir **elektron topunu** fırlatarak potaya atmaya çalışır. Her “basket” başarılı olduğunda, bir elementin **elektron katman dizilimi** tamamlanır. Her seviye (etap) bir elemente karşılık gelir (örneğin: Hidrojen, Helyum, Lityum...). Oyuncu her seviyede topu potaya sokarsa o elementin **K–L–M–N katmanları** dolarak görsel olarak gösterilir. Oyun eğlenceli ama aynı zamanda öğreticidir. --- 🎯 ANA HEDEF: Her atış, bir elektronu temsil eder. Topu potaya soktuğunda elementin katmanları sırayla dolar. Doğru sayıda elektron atıldığında, seviye tamamlanır. Örneğin: - **Hidrojen (Z=1):** K [1] - **Oksijen (Z=8):** K [2], L [6] - **Kalsiyum (Z=20):** K [2], L [8], M [8], N [2] Bu şekilde 20 element tamamlandığında oyun biter. --- ⚙️ OYUN MEKANİKLERİ (YAPAY ZEKAYA TALİMAT): 1. **Fırlatma Mekaniği** - Oyuncu topu (elektron) fareyle veya dokunarak geriye çeker. - Çekme gücü, fırlatma kuvvetini belirler. - Nişan alırken bir yörünge çizgisi görünür. - Top bırakıldığında, fizik kurallarına göre potaya doğru uçar. 2. **Pota & Çarpışma** - Pota, çekirdek bölgesini temsil eder. - Top (elektron) potaya girdiğinde, elementin uygun enerji katmanına yerleşir. - Her isabet, "elektron eklendi" animasyonu ve ses efektiyle görselleştirilir. - Katmanlar (K, L, M, N) dairesel halkalarla temsil edilir. 3. **Element Katman Görselleştirmesi** - Ekranın sağında veya üstünde bir **atom modeli** gösterilir. - Her top atıldığında, modeldeki katmanlar yavaşça dolar. - Tam dolduğunda, “Element Tamamlandı!” yazısı çıkar. - Ardından bir bilgi kutusu belirir: - Element adı - Elektron dizilimi - Katman dizilişi (örnek: 2-8-8-2) 4. **Seviye Sistemi** - Her seviye bir elementtir (1–20 arası). - Zorluk, gereken elektron sayısına göre artar. - Helyum kolay (2 elektron), Kalsiyum zordur (20 elektron). - Tüm elementler tamamlanınca “Tebrikler! İlk 20 elementin elektron dizilimini öğrendin.” mesajı çıkar. 5. **Puanlama** - Her başarılı basket = 100 puan - Elektron katmanı doğru doldurulursa bonus puan (+500) - Yanlış atışlarda puan azalır (-50) - Süreye karşı oynanıyorsa kalan zaman ekstra puan verir. --- 💡 EĞİTİMSEL İÇERİK: Her seviye sonunda bir **öğretici bilgi kutusu (modal panel)** açılır: Örnek: > 🧪 Element: Oksijen (O) > Atom Numarası: 8 > Elektron Dizilimi: 1s2 2s2 2p4 > Katman Dizilimi: K [2], L [6] > Bilgi: Oksijen solunum için temel elementtir. Bu bilgi kutusu, oyuncu “Devam Et” tıklayınca kapanır ve bir sonraki elemente geçilir. --- 🎨 GÖRSEL TASARIM: - **Tema:** Uzay / Bilim laboratuvarı atmosferi - **Renk paleti:** - Mavi (#007BFF) → Elektron rengi - Sarı (#FFD300) → Enerji efekti - Siyah (#000000) → Arka plan - Beyaz (#FFFFFF) → Katman çizgileri - Mor (#A020F0) → Elektron halkası efekti - **Görsel öğeler:** - Elektron topu → Küçük mavi enerji küresi - Pota → Atom çekirdeği şeklinde enerji alanı - Katmanlar → Saydam halka animasyonları - Arka plan → Uzay veya laboratuvar temalı - **Efektler:** - Elektron potaya girince kıvılcım efekti - Katman dolunca enerji halkası genişleyip kaybolur - Tamamlanan elementte parlama animasyonu çıkar --- 🔊 SES TASARIMI: - Fırlatma sesi: “electron_launch.wav” (enerjik ‘whoosh’) - Çarpışma sesi: “spark_hit.wav” - Katman dolumu: “ring_charge.wav” - Seviye tamamlama: “energy_complete.wav” - Arka plan müziği: Bilimsel ambient tema (hafif elektronik) --- 📱 ARAYÜZ (UI) DETAYLARI: 1. **Ana Menü** - Oyna - Öğren (Element Bilgileri) - Ayarlar - Çıkış - Arka plan animasyonu: Elektron akışı efekti 2. **Oyun İçi HUD** - Sol üst: Seviye / Element adı - Sağ üst: Skor - Alt ortada: Elektron sayacı (toplam hedef) - Sağ altta: “Bilgi Kutusu” butonu (tekrar okumak için) 3. **Bilgi Kutusu (Modal Panel)** - Ortada yarı saydam panel - İçinde: - Element adı, atom numarası - Elektron dizilimi (örnek: 2-8-8-1) - Bilgilendirici kısa metin - Altında “Devam Et” butonu --- 📚 ELEMENT BİLGİLERİ TABLOSU: | ID | Element | Elektron Dizilimi | Katmanlar | Not | |----|----------|-------------------|------------|-----| | 1 | Hidrojen | 1s1 | K[1] | En basit element | | 2 | Helyum | 1s2 | K[2] | Soy gaz | | 3 | Lityum | 1s2 2s1 | K[2] L[1] | Alkali metal | | 4 | Berilyum | 1s2 2s2 | K[2] L[2] | Toprak alkali | | 5 | Bor | 1s2 2s2 2p1 | K[2] L[3] | Yarı metal | | 6 | Karbon | 1s2 2s2 2p2 | K[2] L[4] | Organik temeli | | 7 | Azot | 1s2 2s2 2p3 | K[2] L[5] | Havadaki ana gaz | | 8 | Oksijen | 1s2 2s2 2p4 | K[2] L[6] | Solunum elementi | | 9 | Flor | 1s2 2s2 2p5 | K[2] L[7] | Tepkili halojen | | 10 | Neon | 1s2 2s2 2p6 | K[2] L[8] | Soy gaz | | 11 | Sodyum | 1s2 2s2 2p6 3s1 | K[2] L[8] M[1] | Alkali metal | | 12 | Magnezyum| 1s2 2s2 2p6 3s2 | K[2] L[8] M[2] | Toprak alkali | | 13 | Alüminyum| ... | K[2] L[8] M[3] | Metal | | 14 | Silisyum | ... | K[2] L[8] M[4] | Yarı metal | | 15 | Fosfor | ... | K[2] L[8] M[5] | Tepkili ametal | | 16 | Kükürt | ... | K[2] L[8] M[6] | Kokuşma element | | 17 | Klor | ... | K[2] L[8] M[7] | Halojen | | 18 | Argon | ... | K[2] L[8] M[8] | Soy gaz | | 19 | Potasyum | ... | K[2] L[8] M[8] N[1] | Alkali metal | | 20 | Kalsiyum | ... | K[2] L[8] M[8] N[2] | Toprak alkali | --- 💾 YAPAY ZEKA ÇIKTI TALEPLERİ: Yapay zekadan şu çıktılar istenir: 1. Her element için sahne tanımı (katman sayısı, elektron sayısı, hedef sayısı). 2. Görsel seti (elektron topu, atom halkası, çekirdek, arka plan). 3. Ses listesi (isimlendirilmiş ve işlev açıklamalı). 4. Elektron atışı ve çarpışma fiziği tanımı. 5. Bilgi kutularının metin içeriği. 6. Puan sistemi ve seviye mantığı açıklaması. --- 📘 ÖRNEK PROMPT KULLANIMI: > “Bu prompt’a göre ‘Elektron Dizilimi Basketbolu’ adlı kimya eğitim oyununu tanımla. Her seviye bir element olsun. Toplar elektronları temsil etsin, pota atom çekirdeği olsun. Katmanlar halka şeklinde dolsun. Her başarılı basket bir elektronu eklesin ve element tamamlandığında bilgi kutusu gösterilsin. Oyun mekaniğini kodsuz ama fiziksel olarak doğru şekilde anlat. Görsel, ses ve animasyon önerilerini de dahil et.” --- 🔥 SONUÇ: ELEKTRON DİZİLİMİ BASKETBOLU — kimya eğitimini eğlenceli hale getiren, oyuncuya **ilk 20 elementin elektron dizilimini basket atarak öğreten** etkileşimli bir oyun. Her basket bir elektronu, her etap bir elementi temsil eder. Sonunda oyuncu hem puan toplar hem de kimyayı ezberlemeden öğrenir. ⚡🧠
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Atom = Container.expand(function () {
var self = Container.call(this);
// Create shells (back to front)
var nShell = self.attachAsset('nShell', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
var mShell = self.attachAsset('mShell', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
var lShell = self.attachAsset('lShell', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
var kShell = self.attachAsset('kShell', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
// Nucleus on top
var nucleusGraphics = self.attachAsset('nucleus', {
anchorX: 0.5,
anchorY: 0.5
});
self.shells = [kShell, lShell, mShell, nShell];
self.shellCapacities = [2, 8, 8, 2]; // For first 20 elements
self.electronCounts = [0, 0, 0, 0];
self.addElectron = function () {
// Fill shells in order: K, L, M, N
for (var i = 0; i < self.shells.length; i++) {
if (self.electronCounts[i] < self.shellCapacities[i]) {
self.electronCounts[i]++;
self.updateShellVisual(i);
return true;
}
}
return false;
};
self.updateShellVisual = function (shellIndex) {
var fillRatio = self.electronCounts[shellIndex] / self.shellCapacities[shellIndex];
self.shells[shellIndex].alpha = 0.3 + fillRatio * 0.5;
// Animate shell completion
if (fillRatio === 1) {
tween(self.shells[shellIndex], {
alpha: 1
}, {
duration: 500,
onFinish: function onFinish() {
tween(self.shells[shellIndex], {
alpha: 0.8
}, {
duration: 200
});
}
});
}
};
self.getTotalElectrons = function () {
return self.electronCounts[0] + self.electronCounts[1] + self.electronCounts[2] + self.electronCounts[3];
};
self.reset = function () {
self.electronCounts = [0, 0, 0, 0];
for (var i = 0; i < self.shells.length; i++) {
self.shells[i].alpha = 0.3;
}
};
return self;
});
var ElectronBall = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('electronBall', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.gravity = 0.5;
self.active = true;
self.update = function () {
if (!self.active) return;
self.velocityY += self.gravity;
self.x += self.velocityX;
self.y += self.velocityY;
// Check bounds
if (self.y > 2732 + 100 || self.x < -100 || self.x > 2048 + 100) {
self.active = false;
}
};
return self;
});
var InfoPanel = Container.expand(function () {
var self = Container.call(this);
var background = LK.getAsset({
width: 1800,
height: 800,
color: 0x2c3e50,
shape: 'box'
}, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9
});
self.addChild(background);
self.titleText = new Text2('', {
size: 80,
fill: 0xFFFFFF
});
self.titleText.anchor.set(0.5, 0);
self.titleText.x = 0;
self.titleText.y = -300;
self.addChild(self.titleText);
self.configText = new Text2('', {
size: 50,
fill: 0xECF0F1
});
self.configText.anchor.set(0.5, 0);
self.configText.x = 0;
self.configText.y = -200;
self.addChild(self.configText);
self.factText = new Text2('', {
size: 40,
fill: 0xBDC3C7
});
self.factText.anchor.set(0.5, 0);
self.factText.x = 0;
self.factText.y = -50;
self.addChild(self.factText);
self.continueText = new Text2('Tap to continue', {
size: 45,
fill: 0xF39C12
});
self.continueText.anchor.set(0.5, 0);
self.continueText.x = 0;
self.continueText.y = 250;
self.addChild(self.continueText);
self.visible = false;
self.showElement = function (elementData) {
self.titleText.setText(elementData.name + ' (Z=' + elementData.atomicNumber + ')');
self.configText.setText('Electron Configuration: ' + elementData.configuration);
self.factText.setText(elementData.fact);
self.visible = true;
};
self.hide = function () {
self.visible = false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0f1419
});
/****
* Game Code
****/
// Element data for first 20 elements
var elementData = [{
name: 'Hydrogen',
atomicNumber: 1,
electrons: 1,
configuration: '1s¹',
fact: 'Most abundant element in universe'
}, {
name: 'Helium',
atomicNumber: 2,
electrons: 2,
configuration: '1s²',
fact: 'Second lightest element, used in balloons'
}, {
name: 'Lithium',
atomicNumber: 3,
electrons: 3,
configuration: '1s² 2s¹',
fact: 'Lightest metal, used in batteries'
}, {
name: 'Beryllium',
atomicNumber: 4,
electrons: 4,
configuration: '1s² 2s²',
fact: 'Used in aerospace applications'
}, {
name: 'Boron',
atomicNumber: 5,
electrons: 5,
configuration: '1s² 2s² 2p¹',
fact: 'Essential for plant growth'
}, {
name: 'Carbon',
atomicNumber: 6,
electrons: 6,
configuration: '1s² 2s² 2p²',
fact: 'Basis of all organic compounds'
}, {
name: 'Nitrogen',
atomicNumber: 7,
electrons: 7,
configuration: '1s² 2s² 2p³',
fact: '78% of Earth\'s atmosphere'
}, {
name: 'Oxygen',
atomicNumber: 8,
electrons: 8,
configuration: '1s² 2s² 2p⁴',
fact: 'Essential for breathing'
}, {
name: 'Fluorine',
atomicNumber: 9,
electrons: 9,
configuration: '1s² 2s² 2p⁵',
fact: 'Most reactive element'
}, {
name: 'Neon',
atomicNumber: 10,
electrons: 10,
configuration: '1s² 2s² 2p⁶',
fact: 'Used in colorful signs'
}, {
name: 'Sodium',
atomicNumber: 11,
electrons: 11,
configuration: '1s² 2s² 2p⁶ 3s¹',
fact: 'Essential electrolyte'
}, {
name: 'Magnesium',
atomicNumber: 12,
electrons: 12,
configuration: '1s² 2s² 2p⁶ 3s²',
fact: 'Important for bones'
}, {
name: 'Aluminum',
atomicNumber: 13,
electrons: 13,
configuration: '1s² 2s² 2p⁶ 3s² 3p¹',
fact: 'Lightweight metal'
}, {
name: 'Silicon',
atomicNumber: 14,
electrons: 14,
configuration: '1s² 2s² 2p⁶ 3s² 3p²',
fact: 'Computer chip material'
}, {
name: 'Phosphorus',
atomicNumber: 15,
electrons: 15,
configuration: '1s² 2s² 2p⁶ 3s² 3p³',
fact: 'Essential for DNA'
}, {
name: 'Sulfur',
atomicNumber: 16,
electrons: 16,
configuration: '1s² 2s² 2p⁶ 3s² 3p⁴',
fact: 'Yellow crystalline element'
}, {
name: 'Chlorine',
atomicNumber: 17,
electrons: 17,
configuration: '1s² 2s² 2p⁶ 3s² 3p⁵',
fact: 'Used to disinfect water'
}, {
name: 'Argon',
atomicNumber: 18,
electrons: 18,
configuration: '1s² 2s² 2p⁶ 3s² 3p⁶',
fact: 'Noble gas, chemically inert'
}, {
name: 'Potassium',
atomicNumber: 19,
electrons: 19,
configuration: '1s² 2s² 2p⁶ 3s² 3p⁶ 4s¹',
fact: 'Important for nerve function'
}, {
name: 'Calcium',
atomicNumber: 20,
electrons: 20,
configuration: '1s² 2s² 2p⁶ 3s² 3p⁶ 4s²',
fact: 'Essential for strong bones'
}];
var currentLevel = 0;
var atom = game.addChild(new Atom());
atom.x = 1024;
atom.y = 600;
var infoPanel = game.addChild(new InfoPanel());
infoPanel.x = 1024;
infoPanel.y = 1366;
var electronBalls = [];
var trajectoryDots = [];
var shooting = false;
var startX = 0;
var startY = 0;
var showingInfo = false;
// UI Elements
var levelText = new Text2('Level 1: Hydrogen', {
size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var scoreText = new Text2('Score: 0', {
size: 50,
fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0);
scoreText.x = -50;
scoreText.y = 20;
LK.gui.topRight.addChild(scoreText);
var progressText = new Text2('Electrons: 0/1', {
size: 45,
fill: 0x4A90E2
});
progressText.anchor.set(0.5, 0);
progressText.y = 80;
LK.gui.top.addChild(progressText);
var instructionText = new Text2('Drag and release to shoot electrons', {
size: 40,
fill: 0x95A5A6
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
function updateUI() {
var currentElement = elementData[currentLevel];
levelText.setText('Level ' + (currentLevel + 1) + ': ' + currentElement.name);
scoreText.setText('Score: ' + LK.getScore());
progressText.setText('Electrons: ' + atom.getTotalElectrons() + '/' + currentElement.electrons);
}
function createTrajectoryPreview(startX, startY, endX, endY) {
// Clear existing dots
for (var i = 0; i < trajectoryDots.length; i++) {
trajectoryDots[i].destroy();
}
trajectoryDots = [];
var velocityX = (endX - startX) * 0.02;
var velocityY = (endY - startY) * 0.02;
var x = startX;
var y = startY;
var vX = velocityX;
var vY = velocityY;
for (var i = 0; i < 20; i++) {
vY += 0.5; // gravity
x += vX;
y += vY;
var dot = LK.getAsset('trajectoryDot', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1 - i * 0.05
});
dot.x = x;
dot.y = y;
game.addChild(dot);
trajectoryDots.push(dot);
if (y > 2732) break;
}
}
function clearTrajectory() {
for (var i = 0; i < trajectoryDots.length; i++) {
trajectoryDots[i].destroy();
}
trajectoryDots = [];
}
function shootElectron(startX, startY, endX, endY) {
var electron = new ElectronBall();
electron.x = startX;
electron.y = startY;
electron.velocityX = (endX - startX) * 0.02;
electron.velocityY = (endY - startY) * 0.02;
electronBalls.push(electron);
game.addChild(electron);
LK.getSound('shoot').play();
}
function checkElectronHit(electron) {
var dx = electron.x - atom.x;
var dy = electron.y - atom.y;
var distance = Math.sqrt(dx * dx + dy * dy);
return distance < 80; // Hit radius
}
function completeLevel() {
LK.setScore(LK.getScore() + 500);
LK.getSound('complete').play();
// Show element info
infoPanel.showElement(elementData[currentLevel]);
showingInfo = true;
// Flash effect
LK.effects.flashScreen(0x4a90e2, 1000);
}
function nextLevel() {
currentLevel++;
if (currentLevel >= elementData.length) {
LK.showYouWin();
return;
}
atom.reset();
updateUI();
showingInfo = false;
infoPanel.hide();
}
game.down = function (x, y, obj) {
if (showingInfo) {
nextLevel();
return;
}
shooting = true;
startX = x;
startY = y;
};
game.move = function (x, y, obj) {
if (shooting && !showingInfo) {
createTrajectoryPreview(startX, startY, x, y);
}
};
game.up = function (x, y, obj) {
if (shooting && !showingInfo) {
shootElectron(startX, startY, x, y);
clearTrajectory();
shooting = false;
}
};
game.update = function () {
// Update electrons
for (var i = electronBalls.length - 1; i >= 0; i--) {
var electron = electronBalls[i];
if (!electron.active) {
electron.destroy();
electronBalls.splice(i, 1);
LK.setScore(Math.max(0, LK.getScore() - 50));
updateUI();
continue;
}
// Check for hits
if (checkElectronHit(electron)) {
if (atom.addElectron()) {
LK.setScore(LK.getScore() + 100);
LK.getSound('hit').play();
// Check if level complete
if (atom.getTotalElectrons() === elementData[currentLevel].electrons) {
completeLevel();
}
}
electron.destroy();
electronBalls.splice(i, 1);
updateUI();
}
}
};
// Initialize UI
updateUI(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,459 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Atom = Container.expand(function () {
+ var self = Container.call(this);
+ // Create shells (back to front)
+ var nShell = self.attachAsset('nShell', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ var mShell = self.attachAsset('mShell', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ var lShell = self.attachAsset('lShell', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ var kShell = self.attachAsset('kShell', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ // Nucleus on top
+ var nucleusGraphics = self.attachAsset('nucleus', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.shells = [kShell, lShell, mShell, nShell];
+ self.shellCapacities = [2, 8, 8, 2]; // For first 20 elements
+ self.electronCounts = [0, 0, 0, 0];
+ self.addElectron = function () {
+ // Fill shells in order: K, L, M, N
+ for (var i = 0; i < self.shells.length; i++) {
+ if (self.electronCounts[i] < self.shellCapacities[i]) {
+ self.electronCounts[i]++;
+ self.updateShellVisual(i);
+ return true;
+ }
+ }
+ return false;
+ };
+ self.updateShellVisual = function (shellIndex) {
+ var fillRatio = self.electronCounts[shellIndex] / self.shellCapacities[shellIndex];
+ self.shells[shellIndex].alpha = 0.3 + fillRatio * 0.5;
+ // Animate shell completion
+ if (fillRatio === 1) {
+ tween(self.shells[shellIndex], {
+ alpha: 1
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ tween(self.shells[shellIndex], {
+ alpha: 0.8
+ }, {
+ duration: 200
+ });
+ }
+ });
+ }
+ };
+ self.getTotalElectrons = function () {
+ return self.electronCounts[0] + self.electronCounts[1] + self.electronCounts[2] + self.electronCounts[3];
+ };
+ self.reset = function () {
+ self.electronCounts = [0, 0, 0, 0];
+ for (var i = 0; i < self.shells.length; i++) {
+ self.shells[i].alpha = 0.3;
+ }
+ };
+ return self;
+});
+var ElectronBall = Container.expand(function () {
+ var self = Container.call(this);
+ var ballGraphics = self.attachAsset('electronBall', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.gravity = 0.5;
+ self.active = true;
+ self.update = function () {
+ if (!self.active) return;
+ self.velocityY += self.gravity;
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Check bounds
+ if (self.y > 2732 + 100 || self.x < -100 || self.x > 2048 + 100) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+var InfoPanel = Container.expand(function () {
+ var self = Container.call(this);
+ var background = LK.getAsset({
+ width: 1800,
+ height: 800,
+ color: 0x2c3e50,
+ shape: 'box'
+ }, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.9
+ });
+ self.addChild(background);
+ self.titleText = new Text2('', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ self.titleText.anchor.set(0.5, 0);
+ self.titleText.x = 0;
+ self.titleText.y = -300;
+ self.addChild(self.titleText);
+ self.configText = new Text2('', {
+ size: 50,
+ fill: 0xECF0F1
+ });
+ self.configText.anchor.set(0.5, 0);
+ self.configText.x = 0;
+ self.configText.y = -200;
+ self.addChild(self.configText);
+ self.factText = new Text2('', {
+ size: 40,
+ fill: 0xBDC3C7
+ });
+ self.factText.anchor.set(0.5, 0);
+ self.factText.x = 0;
+ self.factText.y = -50;
+ self.addChild(self.factText);
+ self.continueText = new Text2('Tap to continue', {
+ size: 45,
+ fill: 0xF39C12
+ });
+ self.continueText.anchor.set(0.5, 0);
+ self.continueText.x = 0;
+ self.continueText.y = 250;
+ self.addChild(self.continueText);
+ self.visible = false;
+ self.showElement = function (elementData) {
+ self.titleText.setText(elementData.name + ' (Z=' + elementData.atomicNumber + ')');
+ self.configText.setText('Electron Configuration: ' + elementData.configuration);
+ self.factText.setText(elementData.fact);
+ self.visible = true;
+ };
+ self.hide = function () {
+ self.visible = false;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x0f1419
+});
+
+/****
+* Game Code
+****/
+// Element data for first 20 elements
+var elementData = [{
+ name: 'Hydrogen',
+ atomicNumber: 1,
+ electrons: 1,
+ configuration: '1s¹',
+ fact: 'Most abundant element in universe'
+}, {
+ name: 'Helium',
+ atomicNumber: 2,
+ electrons: 2,
+ configuration: '1s²',
+ fact: 'Second lightest element, used in balloons'
+}, {
+ name: 'Lithium',
+ atomicNumber: 3,
+ electrons: 3,
+ configuration: '1s² 2s¹',
+ fact: 'Lightest metal, used in batteries'
+}, {
+ name: 'Beryllium',
+ atomicNumber: 4,
+ electrons: 4,
+ configuration: '1s² 2s²',
+ fact: 'Used in aerospace applications'
+}, {
+ name: 'Boron',
+ atomicNumber: 5,
+ electrons: 5,
+ configuration: '1s² 2s² 2p¹',
+ fact: 'Essential for plant growth'
+}, {
+ name: 'Carbon',
+ atomicNumber: 6,
+ electrons: 6,
+ configuration: '1s² 2s² 2p²',
+ fact: 'Basis of all organic compounds'
+}, {
+ name: 'Nitrogen',
+ atomicNumber: 7,
+ electrons: 7,
+ configuration: '1s² 2s² 2p³',
+ fact: '78% of Earth\'s atmosphere'
+}, {
+ name: 'Oxygen',
+ atomicNumber: 8,
+ electrons: 8,
+ configuration: '1s² 2s² 2p⁴',
+ fact: 'Essential for breathing'
+}, {
+ name: 'Fluorine',
+ atomicNumber: 9,
+ electrons: 9,
+ configuration: '1s² 2s² 2p⁵',
+ fact: 'Most reactive element'
+}, {
+ name: 'Neon',
+ atomicNumber: 10,
+ electrons: 10,
+ configuration: '1s² 2s² 2p⁶',
+ fact: 'Used in colorful signs'
+}, {
+ name: 'Sodium',
+ atomicNumber: 11,
+ electrons: 11,
+ configuration: '1s² 2s² 2p⁶ 3s¹',
+ fact: 'Essential electrolyte'
+}, {
+ name: 'Magnesium',
+ atomicNumber: 12,
+ electrons: 12,
+ configuration: '1s² 2s² 2p⁶ 3s²',
+ fact: 'Important for bones'
+}, {
+ name: 'Aluminum',
+ atomicNumber: 13,
+ electrons: 13,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p¹',
+ fact: 'Lightweight metal'
+}, {
+ name: 'Silicon',
+ atomicNumber: 14,
+ electrons: 14,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p²',
+ fact: 'Computer chip material'
+}, {
+ name: 'Phosphorus',
+ atomicNumber: 15,
+ electrons: 15,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p³',
+ fact: 'Essential for DNA'
+}, {
+ name: 'Sulfur',
+ atomicNumber: 16,
+ electrons: 16,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p⁴',
+ fact: 'Yellow crystalline element'
+}, {
+ name: 'Chlorine',
+ atomicNumber: 17,
+ electrons: 17,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p⁵',
+ fact: 'Used to disinfect water'
+}, {
+ name: 'Argon',
+ atomicNumber: 18,
+ electrons: 18,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p⁶',
+ fact: 'Noble gas, chemically inert'
+}, {
+ name: 'Potassium',
+ atomicNumber: 19,
+ electrons: 19,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p⁶ 4s¹',
+ fact: 'Important for nerve function'
+}, {
+ name: 'Calcium',
+ atomicNumber: 20,
+ electrons: 20,
+ configuration: '1s² 2s² 2p⁶ 3s² 3p⁶ 4s²',
+ fact: 'Essential for strong bones'
+}];
+var currentLevel = 0;
+var atom = game.addChild(new Atom());
+atom.x = 1024;
+atom.y = 600;
+var infoPanel = game.addChild(new InfoPanel());
+infoPanel.x = 1024;
+infoPanel.y = 1366;
+var electronBalls = [];
+var trajectoryDots = [];
+var shooting = false;
+var startX = 0;
+var startY = 0;
+var showingInfo = false;
+// UI Elements
+var levelText = new Text2('Level 1: Hydrogen', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelText.anchor.set(0.5, 0);
+LK.gui.top.addChild(levelText);
+var scoreText = new Text2('Score: 0', {
+ size: 50,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(1, 0);
+scoreText.x = -50;
+scoreText.y = 20;
+LK.gui.topRight.addChild(scoreText);
+var progressText = new Text2('Electrons: 0/1', {
+ size: 45,
+ fill: 0x4A90E2
+});
+progressText.anchor.set(0.5, 0);
+progressText.y = 80;
+LK.gui.top.addChild(progressText);
+var instructionText = new Text2('Drag and release to shoot electrons', {
+ size: 40,
+ fill: 0x95A5A6
+});
+instructionText.anchor.set(0.5, 1);
+LK.gui.bottom.addChild(instructionText);
+function updateUI() {
+ var currentElement = elementData[currentLevel];
+ levelText.setText('Level ' + (currentLevel + 1) + ': ' + currentElement.name);
+ scoreText.setText('Score: ' + LK.getScore());
+ progressText.setText('Electrons: ' + atom.getTotalElectrons() + '/' + currentElement.electrons);
+}
+function createTrajectoryPreview(startX, startY, endX, endY) {
+ // Clear existing dots
+ for (var i = 0; i < trajectoryDots.length; i++) {
+ trajectoryDots[i].destroy();
+ }
+ trajectoryDots = [];
+ var velocityX = (endX - startX) * 0.02;
+ var velocityY = (endY - startY) * 0.02;
+ var x = startX;
+ var y = startY;
+ var vX = velocityX;
+ var vY = velocityY;
+ for (var i = 0; i < 20; i++) {
+ vY += 0.5; // gravity
+ x += vX;
+ y += vY;
+ var dot = LK.getAsset('trajectoryDot', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 1 - i * 0.05
+ });
+ dot.x = x;
+ dot.y = y;
+ game.addChild(dot);
+ trajectoryDots.push(dot);
+ if (y > 2732) break;
+ }
+}
+function clearTrajectory() {
+ for (var i = 0; i < trajectoryDots.length; i++) {
+ trajectoryDots[i].destroy();
+ }
+ trajectoryDots = [];
+}
+function shootElectron(startX, startY, endX, endY) {
+ var electron = new ElectronBall();
+ electron.x = startX;
+ electron.y = startY;
+ electron.velocityX = (endX - startX) * 0.02;
+ electron.velocityY = (endY - startY) * 0.02;
+ electronBalls.push(electron);
+ game.addChild(electron);
+ LK.getSound('shoot').play();
+}
+function checkElectronHit(electron) {
+ var dx = electron.x - atom.x;
+ var dy = electron.y - atom.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ return distance < 80; // Hit radius
+}
+function completeLevel() {
+ LK.setScore(LK.getScore() + 500);
+ LK.getSound('complete').play();
+ // Show element info
+ infoPanel.showElement(elementData[currentLevel]);
+ showingInfo = true;
+ // Flash effect
+ LK.effects.flashScreen(0x4a90e2, 1000);
+}
+function nextLevel() {
+ currentLevel++;
+ if (currentLevel >= elementData.length) {
+ LK.showYouWin();
+ return;
+ }
+ atom.reset();
+ updateUI();
+ showingInfo = false;
+ infoPanel.hide();
+}
+game.down = function (x, y, obj) {
+ if (showingInfo) {
+ nextLevel();
+ return;
+ }
+ shooting = true;
+ startX = x;
+ startY = y;
+};
+game.move = function (x, y, obj) {
+ if (shooting && !showingInfo) {
+ createTrajectoryPreview(startX, startY, x, y);
+ }
+};
+game.up = function (x, y, obj) {
+ if (shooting && !showingInfo) {
+ shootElectron(startX, startY, x, y);
+ clearTrajectory();
+ shooting = false;
+ }
+};
+game.update = function () {
+ // Update electrons
+ for (var i = electronBalls.length - 1; i >= 0; i--) {
+ var electron = electronBalls[i];
+ if (!electron.active) {
+ electron.destroy();
+ electronBalls.splice(i, 1);
+ LK.setScore(Math.max(0, LK.getScore() - 50));
+ updateUI();
+ continue;
+ }
+ // Check for hits
+ if (checkElectronHit(electron)) {
+ if (atom.addElectron()) {
+ LK.setScore(LK.getScore() + 100);
+ LK.getSound('hit').play();
+ // Check if level complete
+ if (atom.getTotalElectrons() === elementData[currentLevel].electrons) {
+ completeLevel();
+ }
+ }
+ electron.destroy();
+ electronBalls.splice(i, 1);
+ updateUI();
+ }
+ }
+};
+// Initialize UI
+updateUI();
\ No newline at end of file