/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGfx = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -48; // Fast upward self.update = function () { self.y += self.speed; }; return self; }); // Crosshair class (visual only) var Crosshair = Container.expand(function () { var self = Container.call(this); var crossGfx = self.attachAsset('crosshair', { anchorX: 0.5, anchorY: 0.5 }); crossGfx.alpha = 0.4; return self; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGfx = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6 + Math.random() * 6; // Varying speed self.update = function () { self.y += self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181818 }); /**** * Game Code ****/ // Music (optional, will not play by default) // Sound for enemy escape // Sound for enemy hit // Sound for shooting // Crosshair: Green ellipse, thin // Bullet: Yellow box, small // Enemy: Red ellipse, medium size // Game variables var bullets = []; var enemies = []; var crosshair = null; var score = 0; var missed = 0; var maxMissed = 5; var spawnInterval = 60; // frames between spawns, will decrease var lastSpawnTick = 0; var dragAiming = false; // Score display var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Missed display (bottom center) var missedTxt = new Text2('', { size: 90, fill: 0xFF4444 }); missedTxt.anchor.set(0.5, 1); LK.gui.bottom.addChild(missedTxt); // Crosshair crosshair = new Crosshair(); game.addChild(crosshair); crosshair.x = 2048 / 2; crosshair.y = 2732 * 0.8; // Helper: update UI function updateUI() { scoreTxt.setText(score); missedTxt.setText(missed > 0 ? "Missed: " + missed + "/" + maxMissed : ""); } // Helper: spawn enemy at random x function spawnEnemy() { var enemy = new Enemy(); var margin = 120; enemy.x = margin + Math.random() * (2048 - 2 * margin); enemy.y = -80; enemies.push(enemy); game.addChild(enemy); } // Helper: fire bullet from crosshair function fireBullet(x, y) { var bullet = new Bullet(); bullet.x = x; bullet.y = y; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } // Touch controls game.down = function (x, y, obj) { // Move crosshair to touch, fire crosshair.x = x; crosshair.y = y; fireBullet(x, y); dragAiming = true; }; game.move = function (x, y, obj) { if (dragAiming) { crosshair.x = x; crosshair.y = y; } }; game.up = function (x, y, obj) { dragAiming = false; }; // Main update loop game.update = function () { // Spawn enemies if (LK.ticks - lastSpawnTick >= spawnInterval) { spawnEnemy(); lastSpawnTick = LK.ticks; // Increase difficulty if (spawnInterval > 24) { spawnInterval -= 1; } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); // Remove if off screen if (b.y < -100) { b.destroy(); bullets.splice(i, 1); continue; } } // Update enemies for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; e.update(); // Check if enemy reached bottom if (e.y > 2732 + 100) { e.destroy(); enemies.splice(j, 1); missed += 1; updateUI(); LK.getSound('fail').play(); // Game over if too many missed if (missed >= maxMissed) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } continue; } // Check collision with bullets var hit = false; for (var k = bullets.length - 1; k >= 0; k--) { var b2 = bullets[k]; if (e.intersects(b2)) { // Hit! hit = true; score += 1; updateUI(); LK.getSound('hit').play(); // Remove both e.destroy(); b2.destroy(); enemies.splice(j, 1); bullets.splice(k, 1); // Win condition if (score >= 30) { LK.effects.flashScreen(0x44ff44, 800); LK.showYouWin(); return; } break; } } if (hit) continue; } }; // Initial UI updateUI();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,201 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Bullet class
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGfx = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -48; // Fast upward
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Crosshair class (visual only)
+var Crosshair = Container.expand(function () {
+ var self = Container.call(this);
+ var crossGfx = self.attachAsset('crosshair', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ crossGfx.alpha = 0.4;
+ return self;
+});
+// Enemy class
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGfx = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 6 + Math.random() * 6; // Varying speed
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x181818
+});
+
+/****
+* Game Code
+****/
+// Music (optional, will not play by default)
+// Sound for enemy escape
+// Sound for enemy hit
+// Sound for shooting
+// Crosshair: Green ellipse, thin
+// Bullet: Yellow box, small
+// Enemy: Red ellipse, medium size
+// Game variables
+var bullets = [];
+var enemies = [];
+var crosshair = null;
+var score = 0;
+var missed = 0;
+var maxMissed = 5;
+var spawnInterval = 60; // frames between spawns, will decrease
+var lastSpawnTick = 0;
+var dragAiming = false;
+// Score display
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Missed display (bottom center)
+var missedTxt = new Text2('', {
+ size: 90,
+ fill: 0xFF4444
+});
+missedTxt.anchor.set(0.5, 1);
+LK.gui.bottom.addChild(missedTxt);
+// Crosshair
+crosshair = new Crosshair();
+game.addChild(crosshair);
+crosshair.x = 2048 / 2;
+crosshair.y = 2732 * 0.8;
+// Helper: update UI
+function updateUI() {
+ scoreTxt.setText(score);
+ missedTxt.setText(missed > 0 ? "Missed: " + missed + "/" + maxMissed : "");
+}
+// Helper: spawn enemy at random x
+function spawnEnemy() {
+ var enemy = new Enemy();
+ var margin = 120;
+ enemy.x = margin + Math.random() * (2048 - 2 * margin);
+ enemy.y = -80;
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
+// Helper: fire bullet from crosshair
+function fireBullet(x, y) {
+ var bullet = new Bullet();
+ bullet.x = x;
+ bullet.y = y;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+}
+// Touch controls
+game.down = function (x, y, obj) {
+ // Move crosshair to touch, fire
+ crosshair.x = x;
+ crosshair.y = y;
+ fireBullet(x, y);
+ dragAiming = true;
+};
+game.move = function (x, y, obj) {
+ if (dragAiming) {
+ crosshair.x = x;
+ crosshair.y = y;
+ }
+};
+game.up = function (x, y, obj) {
+ dragAiming = false;
+};
+// Main update loop
+game.update = function () {
+ // Spawn enemies
+ if (LK.ticks - lastSpawnTick >= spawnInterval) {
+ spawnEnemy();
+ lastSpawnTick = LK.ticks;
+ // Increase difficulty
+ if (spawnInterval > 24) {
+ spawnInterval -= 1;
+ }
+ }
+ // Update bullets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var b = bullets[i];
+ b.update();
+ // Remove if off screen
+ if (b.y < -100) {
+ b.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ }
+ // Update enemies
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var e = enemies[j];
+ e.update();
+ // Check if enemy reached bottom
+ if (e.y > 2732 + 100) {
+ e.destroy();
+ enemies.splice(j, 1);
+ missed += 1;
+ updateUI();
+ LK.getSound('fail').play();
+ // Game over if too many missed
+ if (missed >= maxMissed) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ return;
+ }
+ continue;
+ }
+ // Check collision with bullets
+ var hit = false;
+ for (var k = bullets.length - 1; k >= 0; k--) {
+ var b2 = bullets[k];
+ if (e.intersects(b2)) {
+ // Hit!
+ hit = true;
+ score += 1;
+ updateUI();
+ LK.getSound('hit').play();
+ // Remove both
+ e.destroy();
+ b2.destroy();
+ enemies.splice(j, 1);
+ bullets.splice(k, 1);
+ // Win condition
+ if (score >= 30) {
+ LK.effects.flashScreen(0x44ff44, 800);
+ LK.showYouWin();
+ return;
+ }
+ break;
+ }
+ }
+ if (hit) continue;
+ }
+};
+// Initial UI
+updateUI();
\ No newline at end of file