/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speedX = 0; self.speedY = 0; self.lifetime = 120; // 2 seconds at 60fps self.update = function () { self.x += self.speedX; self.y += self.speedY; self.lifetime--; // Fade out near end of lifetime if (self.lifetime < 30) { bulletGraphics.alpha = self.lifetime / 30; } }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.health = 2; self.spawnBeat = LK.ticks; self.baseScale = 1; self.update = function () { // Pulse with beat var beatOffset = (LK.ticks - self.spawnBeat) % 30; if (beatOffset === 0) { enemyGraphics.scaleX = self.baseScale * 1.2; enemyGraphics.scaleY = self.baseScale * 1.2; tween(enemyGraphics, { scaleX: self.baseScale, scaleY: self.baseScale }, { duration: 150 }); } // Move towards player slowly var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * 0.8; self.y += dy / distance * 0.8; } }; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xffffff, 200); if (self.health <= 0) { LK.getSound('hit').play(); return true; // Destroyed } return false; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.shootCooldown = 0; self.baseScale = 1; self.update = function () { if (self.shootCooldown > 0) { self.shootCooldown--; } // Pulse with music beat (every 30 ticks = 0.5 seconds at 60fps) if (LK.ticks % 30 === 0) { playerGraphics.scaleX = self.baseScale * 1.3; playerGraphics.scaleY = self.baseScale * 1.3; tween(playerGraphics, { scaleX: self.baseScale, scaleY: self.baseScale }, { duration: 200 }); } }; self.shoot = function (targetX, targetY) { if (self.shootCooldown <= 0) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); bullet.speedX = dx / distance * 12; bullet.speedY = dy / distance * 12; bullets.push(bullet); game.addChild(bullet); self.shootCooldown = 10; LK.getSound('shoot').play(); } }; return self; }); var Target = Container.expand(function () { var self = Container.call(this); var targetGraphics = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5 }); self.spawnBeat = LK.ticks; self.baseScale = 1; self.rotationSpeed = 0.05; self.update = function () { targetGraphics.rotation += self.rotationSpeed; // Strong pulse with beat var beatOffset = (LK.ticks - self.spawnBeat) % 30; if (beatOffset === 0) { targetGraphics.scaleX = self.baseScale * 1.5; targetGraphics.scaleY = self.baseScale * 1.5; tween(targetGraphics, { scaleX: self.baseScale, scaleY: self.baseScale }, { duration: 200 }); } }; self.collect = function () { LK.getSound('collect').play(); // Beat timing bonus var beatOffset = (LK.ticks - self.spawnBeat) % 30; var bonus = 1; if (beatOffset < 5 || beatOffset > 25) { bonus = 2; // Perfect timing LK.effects.flashScreen(0x00ff00, 200); } LK.setScore(LK.getScore() + 10 * bonus); comboCount++; return true; // Collected }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ // Game variables var player; var enemies = []; var targets = []; var bullets = []; var comboCount = 0; var beatCounter = 0; var arenaCenter = { x: 2048 / 2, y: 2732 / 2 }; var arenaRadius = 600; // Create arena var arenaRing = game.attachAsset('arenaRing', { anchorX: 0.5, anchorY: 0.5, x: arenaCenter.x, y: arenaCenter.y }); var arena = game.attachAsset('arena', { anchorX: 0.5, anchorY: 0.5, x: arenaCenter.x, y: arenaCenter.y }); // Create player player = game.addChild(new Player()); player.x = arenaCenter.x; player.y = arenaCenter.y; // Create UI var scoreTxt = new Text2('0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var comboTxt = new Text2('', { size: 60, fill: 0xFFAA00 }); comboTxt.anchor.set(1, 0); LK.gui.topRight.addChild(comboTxt); // Start music LK.playMusic('bgmusic'); // Input handling var isDragging = false; game.down = function (x, y, obj) { isDragging = true; // Shoot towards tap/click position player.shoot(x, y); }; game.move = function (x, y, obj) { if (isDragging) { // Keep player within arena bounds var dx = x - arenaCenter.x; var dy = y - arenaCenter.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= arenaRadius - 40) { player.x = x; player.y = y; } else { // Clamp to arena edge var ratio = (arenaRadius - 40) / distance; player.x = arenaCenter.x + dx * ratio; player.y = arenaCenter.y + dy * ratio; } } }; game.up = function (x, y, obj) { isDragging = false; }; // Spawn function function spawnEnemy() { var enemy = new Enemy(); var angle = Math.random() * Math.PI * 2; var spawnRadius = arenaRadius - 50; enemy.x = arenaCenter.x + Math.cos(angle) * spawnRadius; enemy.y = arenaCenter.y + Math.sin(angle) * spawnRadius; enemies.push(enemy); game.addChild(enemy); } function spawnTarget() { var target = new Target(); var angle = Math.random() * Math.PI * 2; var spawnRadius = Math.random() * (arenaRadius - 100) + 50; target.x = arenaCenter.x + Math.cos(angle) * spawnRadius; target.y = arenaCenter.y + Math.sin(angle) * spawnRadius; targets.push(target); game.addChild(target); } // Main game loop game.update = function () { // Beat-based spawning (every 0.5 seconds = 30 ticks) if (LK.ticks % 30 === 0) { beatCounter++; // Arena pulse effect tween(arena, { scaleX: 1.05, scaleY: 1.05 }, { duration: 100 }); tween(arena, { scaleX: 1, scaleY: 1 }, { duration: 200 }); // Background color pulse var colors = [0x1a1a2e, 0x2a1a3e, 0x1a2a3e]; var colorIndex = beatCounter % colors.length; game.setBackgroundColor(colors[colorIndex]); // Spawn enemies and targets based on beat if (beatCounter % 4 === 0) { spawnEnemy(); } if (beatCounter % 6 === 0) { spawnTarget(); } // Increase difficulty over time if (beatCounter % 32 === 0 && beatCounter > 32) { spawnEnemy(); } } // Update bullets and check collisions for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Remove expired bullets if (bullet.lifetime <= 0) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet-enemy collisions for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { if (enemy.takeDamage()) { enemy.destroy(); enemies.splice(j, 1); LK.setScore(LK.getScore() + 5); } bullet.destroy(); bullets.splice(i, 1); break; } } } // Check player-target collisions for (var k = targets.length - 1; k >= 0; k--) { var target = targets[k]; if (player.intersects(target)) { if (target.collect()) { target.destroy(); targets.splice(k, 1); } } } // Check player-enemy collisions (game over condition) for (var l = 0; l < enemies.length; l++) { var enemy = enemies[l]; if (player.intersects(enemy)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } // Update UI scoreTxt.setText(LK.getScore().toString()); if (comboCount > 0) { comboTxt.setText('Combo: ' + comboCount); } else { comboTxt.setText(''); } // Reset combo if no recent collections if (LK.ticks % 180 === 0) { // Every 3 seconds comboCount = Math.max(0, comboCount - 1); } // Win condition if (LK.getScore() >= 500) { LK.showYouWin(); } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,346 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speedX = 0;
+ self.speedY = 0;
+ self.lifetime = 120; // 2 seconds at 60fps
+ self.update = function () {
+ self.x += self.speedX;
+ self.y += self.speedY;
+ self.lifetime--;
+ // Fade out near end of lifetime
+ if (self.lifetime < 30) {
+ bulletGraphics.alpha = self.lifetime / 30;
+ }
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 2;
+ self.spawnBeat = LK.ticks;
+ self.baseScale = 1;
+ self.update = function () {
+ // Pulse with beat
+ var beatOffset = (LK.ticks - self.spawnBeat) % 30;
+ if (beatOffset === 0) {
+ enemyGraphics.scaleX = self.baseScale * 1.2;
+ enemyGraphics.scaleY = self.baseScale * 1.2;
+ tween(enemyGraphics, {
+ scaleX: self.baseScale,
+ scaleY: self.baseScale
+ }, {
+ duration: 150
+ });
+ }
+ // Move towards player slowly
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 5) {
+ self.x += dx / distance * 0.8;
+ self.y += dy / distance * 0.8;
+ }
+ };
+ self.takeDamage = function () {
+ self.health--;
+ LK.effects.flashObject(self, 0xffffff, 200);
+ if (self.health <= 0) {
+ LK.getSound('hit').play();
+ return true; // Destroyed
+ }
+ return false;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.shootCooldown = 0;
+ self.baseScale = 1;
+ self.update = function () {
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ // Pulse with music beat (every 30 ticks = 0.5 seconds at 60fps)
+ if (LK.ticks % 30 === 0) {
+ playerGraphics.scaleX = self.baseScale * 1.3;
+ playerGraphics.scaleY = self.baseScale * 1.3;
+ tween(playerGraphics, {
+ scaleX: self.baseScale,
+ scaleY: self.baseScale
+ }, {
+ duration: 200
+ });
+ }
+ };
+ self.shoot = function (targetX, targetY) {
+ if (self.shootCooldown <= 0) {
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ var dx = targetX - self.x;
+ var dy = targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ bullet.speedX = dx / distance * 12;
+ bullet.speedY = dy / distance * 12;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ self.shootCooldown = 10;
+ LK.getSound('shoot').play();
+ }
+ };
+ return self;
+});
+var Target = Container.expand(function () {
+ var self = Container.call(this);
+ var targetGraphics = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.spawnBeat = LK.ticks;
+ self.baseScale = 1;
+ self.rotationSpeed = 0.05;
+ self.update = function () {
+ targetGraphics.rotation += self.rotationSpeed;
+ // Strong pulse with beat
+ var beatOffset = (LK.ticks - self.spawnBeat) % 30;
+ if (beatOffset === 0) {
+ targetGraphics.scaleX = self.baseScale * 1.5;
+ targetGraphics.scaleY = self.baseScale * 1.5;
+ tween(targetGraphics, {
+ scaleX: self.baseScale,
+ scaleY: self.baseScale
+ }, {
+ duration: 200
+ });
+ }
+ };
+ self.collect = function () {
+ LK.getSound('collect').play();
+ // Beat timing bonus
+ var beatOffset = (LK.ticks - self.spawnBeat) % 30;
+ var bonus = 1;
+ if (beatOffset < 5 || beatOffset > 25) {
+ bonus = 2; // Perfect timing
+ LK.effects.flashScreen(0x00ff00, 200);
+ }
+ LK.setScore(LK.getScore() + 10 * bonus);
+ comboCount++;
+ return true; // Collected
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1a1a2e
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var enemies = [];
+var targets = [];
+var bullets = [];
+var comboCount = 0;
+var beatCounter = 0;
+var arenaCenter = {
+ x: 2048 / 2,
+ y: 2732 / 2
+};
+var arenaRadius = 600;
+// Create arena
+var arenaRing = game.attachAsset('arenaRing', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: arenaCenter.x,
+ y: arenaCenter.y
+});
+var arena = game.attachAsset('arena', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: arenaCenter.x,
+ y: arenaCenter.y
+});
+// Create player
+player = game.addChild(new Player());
+player.x = arenaCenter.x;
+player.y = arenaCenter.y;
+// Create UI
+var scoreTxt = new Text2('0', {
+ size: 100,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var comboTxt = new Text2('', {
+ size: 60,
+ fill: 0xFFAA00
+});
+comboTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(comboTxt);
+// Start music
+LK.playMusic('bgmusic');
+// Input handling
+var isDragging = false;
+game.down = function (x, y, obj) {
+ isDragging = true;
+ // Shoot towards tap/click position
+ player.shoot(x, y);
+};
+game.move = function (x, y, obj) {
+ if (isDragging) {
+ // Keep player within arena bounds
+ var dx = x - arenaCenter.x;
+ var dy = y - arenaCenter.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= arenaRadius - 40) {
+ player.x = x;
+ player.y = y;
+ } else {
+ // Clamp to arena edge
+ var ratio = (arenaRadius - 40) / distance;
+ player.x = arenaCenter.x + dx * ratio;
+ player.y = arenaCenter.y + dy * ratio;
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+// Spawn function
+function spawnEnemy() {
+ var enemy = new Enemy();
+ var angle = Math.random() * Math.PI * 2;
+ var spawnRadius = arenaRadius - 50;
+ enemy.x = arenaCenter.x + Math.cos(angle) * spawnRadius;
+ enemy.y = arenaCenter.y + Math.sin(angle) * spawnRadius;
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
+function spawnTarget() {
+ var target = new Target();
+ var angle = Math.random() * Math.PI * 2;
+ var spawnRadius = Math.random() * (arenaRadius - 100) + 50;
+ target.x = arenaCenter.x + Math.cos(angle) * spawnRadius;
+ target.y = arenaCenter.y + Math.sin(angle) * spawnRadius;
+ targets.push(target);
+ game.addChild(target);
+}
+// Main game loop
+game.update = function () {
+ // Beat-based spawning (every 0.5 seconds = 30 ticks)
+ if (LK.ticks % 30 === 0) {
+ beatCounter++;
+ // Arena pulse effect
+ tween(arena, {
+ scaleX: 1.05,
+ scaleY: 1.05
+ }, {
+ duration: 100
+ });
+ tween(arena, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ // Background color pulse
+ var colors = [0x1a1a2e, 0x2a1a3e, 0x1a2a3e];
+ var colorIndex = beatCounter % colors.length;
+ game.setBackgroundColor(colors[colorIndex]);
+ // Spawn enemies and targets based on beat
+ if (beatCounter % 4 === 0) {
+ spawnEnemy();
+ }
+ if (beatCounter % 6 === 0) {
+ spawnTarget();
+ }
+ // Increase difficulty over time
+ if (beatCounter % 32 === 0 && beatCounter > 32) {
+ spawnEnemy();
+ }
+ }
+ // Update bullets and check collisions
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ // Remove expired bullets
+ if (bullet.lifetime <= 0) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check bullet-enemy collisions
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ if (enemy.takeDamage()) {
+ enemy.destroy();
+ enemies.splice(j, 1);
+ LK.setScore(LK.getScore() + 5);
+ }
+ bullet.destroy();
+ bullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Check player-target collisions
+ for (var k = targets.length - 1; k >= 0; k--) {
+ var target = targets[k];
+ if (player.intersects(target)) {
+ if (target.collect()) {
+ target.destroy();
+ targets.splice(k, 1);
+ }
+ }
+ }
+ // Check player-enemy collisions (game over condition)
+ for (var l = 0; l < enemies.length; l++) {
+ var enemy = enemies[l];
+ if (player.intersects(enemy)) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Update UI
+ scoreTxt.setText(LK.getScore().toString());
+ if (comboCount > 0) {
+ comboTxt.setText('Combo: ' + comboCount);
+ } else {
+ comboTxt.setText('');
+ }
+ // Reset combo if no recent collections
+ if (LK.ticks % 180 === 0) {
+ // Every 3 seconds
+ comboCount = Math.max(0, comboCount - 1);
+ }
+ // Win condition
+ if (LK.getScore() >= 500) {
+ LK.showYouWin();
+ }
+};
\ No newline at end of file