/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
kills: 0,
bestKills: 0
});
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.health = 1;
self.targetX = 1024;
self.targetY = 1366;
self.lastX = self.x;
self.lastY = self.y;
self.lastIntersecting = false;
self.moveTowardTarget = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
self.moveTowardTarget();
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.velocityX = 0;
self.velocityY = -1;
self.lastX = self.x;
self.lastY = self.y;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
self.x += self.velocityX * self.speed;
self.y += self.velocityY * self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'shield'; // shield, ammo, speed
self.lastIntersecting = false;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var player = game.addChild(new Container());
var playerGraphics = player.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
player.x = 1024;
player.y = 1366;
player.speed = 5;
player.health = 100;
player.maxHealth = 100;
player.ammo = 30;
player.maxAmmo = 30;
player.isMovingUp = false;
player.isMovingDown = false;
player.isMovingLeft = false;
player.isMovingRight = false;
var bullets = [];
var enemies = [];
var powerUps = [];
var gameTime = 0;
var matchDuration = 180000; // 3 minutes in ms
var kills = 0;
var arenaSize = 1800;
var minArenaSize = 400;
var boundaryContractionInterval = 30000; // 30 seconds
var lastBoundaryContraction = 0;
var boundaryX = 1024;
var boundaryY = 1366;
var scoreText = new Text2('Kills: 0', {
size: 100,
fill: '#ffffff'
});
scoreText.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreText);
var healthText = new Text2('HP: 100/100', {
size: 80,
fill: '#ffffff'
});
healthText.anchor.set(0, 0);
LK.gui.topRight.addChild(healthText);
var timerText = new Text2('3:00', {
size: 100,
fill: '#ffffff'
});
timerText.anchor.set(0.5, 0);
LK.gui.top.addChild(timerText);
var ammoText = new Text2('Ammo: 30/30', {
size: 80,
fill: '#ffff00'
});
ammoText.anchor.set(1, 0);
LK.gui.topRight.addChild(ammoText);
function updateUI() {
scoreText.setText('Kills: ' + kills);
healthText.setText('HP: ' + Math.max(0, player.health) + '/' + player.maxHealth);
ammoText.setText('Ammo: ' + player.ammo + '/' + player.maxAmmo);
var timeRemaining = Math.max(0, matchDuration - gameTime);
var minutes = Math.floor(timeRemaining / 60000);
var seconds = Math.floor(timeRemaining % 60000 / 1000);
var secondsStr = seconds < 10 ? '0' + seconds : seconds;
timerText.setText(minutes + ':' + secondsStr);
}
function createEnemy() {
var newEnemy = game.addChild(new Enemy());
var spawnSide = Math.floor(Math.random() * 4);
switch (spawnSide) {
case 0:
// top
newEnemy.x = Math.random() * 2048;
newEnemy.y = -50;
break;
case 1:
// right
newEnemy.x = 2048 + 50;
newEnemy.y = Math.random() * 2732;
break;
case 2:
// bottom
newEnemy.x = Math.random() * 2048;
newEnemy.y = 2732 + 50;
break;
case 3:
// left
newEnemy.x = -50;
newEnemy.y = Math.random() * 2732;
break;
}
newEnemy.lastX = newEnemy.x;
newEnemy.lastY = newEnemy.y;
newEnemy.lastIntersecting = false;
enemies.push(newEnemy);
}
function createPowerUp(x, y, type) {
var newPowerUp = game.addChild(new PowerUp());
newPowerUp.x = x;
newPowerUp.y = y;
newPowerUp.type = type;
newPowerUp.lastIntersecting = false;
powerUps.push(newPowerUp);
}
function fireWeapon() {
if (player.ammo > 0) {
var newBullet = game.addChild(new PlayerBullet());
newBullet.x = player.x;
newBullet.y = player.y - 25;
// Calculate direction based on player movement or default up
if (player.isMovingUp) {
newBullet.velocityY = -1;
newBullet.velocityX = 0;
} else if (player.isMovingDown) {
newBullet.velocityY = 1;
newBullet.velocityX = 0;
} else if (player.isMovingLeft) {
newBullet.velocityX = -1;
newBullet.velocityY = 0;
} else if (player.isMovingRight) {
newBullet.velocityX = 1;
newBullet.velocityY = 0;
}
newBullet.lastX = newBullet.x;
newBullet.lastY = newBullet.y;
bullets.push(newBullet);
player.ammo--;
LK.getSound('shoot').play();
}
}
var fireTimer = LK.setInterval(function () {
fireWeapon();
}, 200);
var enemySpawnTimer = LK.setInterval(function () {
if (enemies.length < 5 + Math.floor(gameTime / 60000)) {
createEnemy();
}
}, 2000);
function contractBoundary() {
if (arenaSize > minArenaSize) {
arenaSize = Math.max(minArenaSize, arenaSize - 200);
// Flash screen to indicate boundary contraction
LK.effects.flashScreen(0xff6600, 500);
}
}
function checkPlayerInBoundary() {
var boundaryRadius = arenaSize / 2;
var dx = player.x - boundaryX;
var dy = player.y - boundaryY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > boundaryRadius) {
// Player is outside boundary, take damage
player.health -= 0.5;
if (player.health <= 0) {
endGame();
}
}
}
function checkEnemyInBoundary(enemy) {
var boundaryRadius = arenaSize / 2;
var dx = enemy.x - boundaryX;
var dy = enemy.y - boundaryY;
var distance = Math.sqrt(dx * dx + dy * dy);
return distance < boundaryRadius;
}
function endGame() {
LK.clearInterval(fireTimer);
LK.clearInterval(enemySpawnTimer);
storage.kills = kills;
if (kills > storage.bestKills) {
storage.bestKills = kills;
}
LK.showGameOver();
}
game.down = function (x, y, obj) {
// Touch controls - moving
var centerX = 2048 / 2;
if (x < centerX) {
player.isMovingLeft = true;
} else {
player.isMovingRight = true;
}
};
game.up = function (x, y, obj) {
player.isMovingLeft = false;
player.isMovingRight = false;
};
game.move = function (x, y, obj) {
var centerX = 2048 / 2;
if (x < centerX) {
player.isMovingLeft = true;
player.isMovingRight = false;
} else {
player.isMovingRight = true;
player.isMovingLeft = false;
}
};
game.update = function () {
gameTime += 16.67; // Approximate ms per frame at 60fps
// Player movement
if (player.isMovingLeft) {
player.x = Math.max(0, player.x - player.speed);
}
if (player.isMovingRight) {
player.x = Math.min(2048, player.x + player.speed);
}
if (player.isMovingUp) {
player.y = Math.max(0, player.y - player.speed);
}
if (player.isMovingDown) {
player.y = Math.min(2732, player.y + player.speed);
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.update();
enemy.targetX = player.x;
enemy.targetY = player.y;
// Check if enemy is in boundary
if (!checkEnemyInBoundary(enemy)) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (!enemy.lastIntersecting && enemy.intersects(player)) {
player.health -= 10;
LK.effects.flashObject(player, 0xff0000, 300);
LK.getSound('hit').play();
if (player.health <= 0) {
endGame();
}
}
enemy.lastIntersecting = enemy.intersects(player);
}
// Update bullets
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
bullet.update();
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Check if bullet is off screen
if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
bullet.destroy();
bullets.splice(b, 1);
continue;
}
// Check collision with enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
if (bullet.intersects(enemy)) {
enemy.destroy();
enemies.splice(e, 1);
bullet.destroy();
bullets.splice(b, 1);
kills++;
LK.setScore(LK.getScore() + 10);
LK.getSound('hit').play();
// Chance to spawn power up
if (Math.random() < 0.3) {
var powerUpType = ['shield', 'ammo', 'speed'][Math.floor(Math.random() * 3)];
createPowerUp(enemy.lastX, enemy.lastY, powerUpType);
}
break;
}
}
}
// Update power ups
for (var p = powerUps.length - 1; p >= 0; p--) {
var powerUp = powerUps[p];
if (!powerUp.lastIntersecting && powerUp.intersects(player)) {
switch (powerUp.type) {
case 'shield':
player.health = Math.min(player.maxHealth, player.health + 30);
break;
case 'ammo':
player.ammo = player.maxAmmo;
break;
case 'speed':
player.speed = 7;
LK.setTimeout(function () {
player.speed = 5;
}, 5000);
break;
}
LK.getSound('powerup').play();
powerUp.destroy();
powerUps.splice(p, 1);
}
powerUp.lastIntersecting = powerUp.intersects(player);
}
// Boundary contraction logic
if (gameTime - lastBoundaryContraction > boundaryContractionInterval) {
contractBoundary();
lastBoundaryContraction = gameTime;
}
// Check if player is in boundary
checkPlayerInBoundary();
// End game conditions
if (gameTime >= matchDuration) {
endGame();
}
// Update UI
if (LK.ticks % 10 === 0) {
updateUI();
}
};
LK.playMusic('bgmusic', {
loop: true
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,386 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ kills: 0,
+ bestKills: 0
+});
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.health = 1;
+ self.targetX = 1024;
+ self.targetY = 1366;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.lastIntersecting = false;
+ self.moveTowardTarget = function () {
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 5) {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ };
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.moveTowardTarget();
+ };
+ return self;
+});
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.velocityX = 0;
+ self.velocityY = -1;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.x += self.velocityX * self.speed;
+ self.y += self.velocityY * self.speed;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerUpGraphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'shield'; // shield, ammo, speed
+ self.lastIntersecting = false;
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0x1a1a1a
+});
+
+/****
+* Game Code
+****/
+var player = game.addChild(new Container());
+var playerGraphics = player.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+player.x = 1024;
+player.y = 1366;
+player.speed = 5;
+player.health = 100;
+player.maxHealth = 100;
+player.ammo = 30;
+player.maxAmmo = 30;
+player.isMovingUp = false;
+player.isMovingDown = false;
+player.isMovingLeft = false;
+player.isMovingRight = false;
+var bullets = [];
+var enemies = [];
+var powerUps = [];
+var gameTime = 0;
+var matchDuration = 180000; // 3 minutes in ms
+var kills = 0;
+var arenaSize = 1800;
+var minArenaSize = 400;
+var boundaryContractionInterval = 30000; // 30 seconds
+var lastBoundaryContraction = 0;
+var boundaryX = 1024;
+var boundaryY = 1366;
+var scoreText = new Text2('Kills: 0', {
+ size: 100,
+ fill: '#ffffff'
+});
+scoreText.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreText);
+var healthText = new Text2('HP: 100/100', {
+ size: 80,
+ fill: '#ffffff'
+});
+healthText.anchor.set(0, 0);
+LK.gui.topRight.addChild(healthText);
+var timerText = new Text2('3:00', {
+ size: 100,
+ fill: '#ffffff'
+});
+timerText.anchor.set(0.5, 0);
+LK.gui.top.addChild(timerText);
+var ammoText = new Text2('Ammo: 30/30', {
+ size: 80,
+ fill: '#ffff00'
+});
+ammoText.anchor.set(1, 0);
+LK.gui.topRight.addChild(ammoText);
+function updateUI() {
+ scoreText.setText('Kills: ' + kills);
+ healthText.setText('HP: ' + Math.max(0, player.health) + '/' + player.maxHealth);
+ ammoText.setText('Ammo: ' + player.ammo + '/' + player.maxAmmo);
+ var timeRemaining = Math.max(0, matchDuration - gameTime);
+ var minutes = Math.floor(timeRemaining / 60000);
+ var seconds = Math.floor(timeRemaining % 60000 / 1000);
+ var secondsStr = seconds < 10 ? '0' + seconds : seconds;
+ timerText.setText(minutes + ':' + secondsStr);
+}
+function createEnemy() {
+ var newEnemy = game.addChild(new Enemy());
+ var spawnSide = Math.floor(Math.random() * 4);
+ switch (spawnSide) {
+ case 0:
+ // top
+ newEnemy.x = Math.random() * 2048;
+ newEnemy.y = -50;
+ break;
+ case 1:
+ // right
+ newEnemy.x = 2048 + 50;
+ newEnemy.y = Math.random() * 2732;
+ break;
+ case 2:
+ // bottom
+ newEnemy.x = Math.random() * 2048;
+ newEnemy.y = 2732 + 50;
+ break;
+ case 3:
+ // left
+ newEnemy.x = -50;
+ newEnemy.y = Math.random() * 2732;
+ break;
+ }
+ newEnemy.lastX = newEnemy.x;
+ newEnemy.lastY = newEnemy.y;
+ newEnemy.lastIntersecting = false;
+ enemies.push(newEnemy);
+}
+function createPowerUp(x, y, type) {
+ var newPowerUp = game.addChild(new PowerUp());
+ newPowerUp.x = x;
+ newPowerUp.y = y;
+ newPowerUp.type = type;
+ newPowerUp.lastIntersecting = false;
+ powerUps.push(newPowerUp);
+}
+function fireWeapon() {
+ if (player.ammo > 0) {
+ var newBullet = game.addChild(new PlayerBullet());
+ newBullet.x = player.x;
+ newBullet.y = player.y - 25;
+ // Calculate direction based on player movement or default up
+ if (player.isMovingUp) {
+ newBullet.velocityY = -1;
+ newBullet.velocityX = 0;
+ } else if (player.isMovingDown) {
+ newBullet.velocityY = 1;
+ newBullet.velocityX = 0;
+ } else if (player.isMovingLeft) {
+ newBullet.velocityX = -1;
+ newBullet.velocityY = 0;
+ } else if (player.isMovingRight) {
+ newBullet.velocityX = 1;
+ newBullet.velocityY = 0;
+ }
+ newBullet.lastX = newBullet.x;
+ newBullet.lastY = newBullet.y;
+ bullets.push(newBullet);
+ player.ammo--;
+ LK.getSound('shoot').play();
+ }
+}
+var fireTimer = LK.setInterval(function () {
+ fireWeapon();
+}, 200);
+var enemySpawnTimer = LK.setInterval(function () {
+ if (enemies.length < 5 + Math.floor(gameTime / 60000)) {
+ createEnemy();
+ }
+}, 2000);
+function contractBoundary() {
+ if (arenaSize > minArenaSize) {
+ arenaSize = Math.max(minArenaSize, arenaSize - 200);
+ // Flash screen to indicate boundary contraction
+ LK.effects.flashScreen(0xff6600, 500);
+ }
+}
+function checkPlayerInBoundary() {
+ var boundaryRadius = arenaSize / 2;
+ var dx = player.x - boundaryX;
+ var dy = player.y - boundaryY;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > boundaryRadius) {
+ // Player is outside boundary, take damage
+ player.health -= 0.5;
+ if (player.health <= 0) {
+ endGame();
+ }
+ }
+}
+function checkEnemyInBoundary(enemy) {
+ var boundaryRadius = arenaSize / 2;
+ var dx = enemy.x - boundaryX;
+ var dy = enemy.y - boundaryY;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ return distance < boundaryRadius;
+}
+function endGame() {
+ LK.clearInterval(fireTimer);
+ LK.clearInterval(enemySpawnTimer);
+ storage.kills = kills;
+ if (kills > storage.bestKills) {
+ storage.bestKills = kills;
+ }
+ LK.showGameOver();
+}
+game.down = function (x, y, obj) {
+ // Touch controls - moving
+ var centerX = 2048 / 2;
+ if (x < centerX) {
+ player.isMovingLeft = true;
+ } else {
+ player.isMovingRight = true;
+ }
+};
+game.up = function (x, y, obj) {
+ player.isMovingLeft = false;
+ player.isMovingRight = false;
+};
+game.move = function (x, y, obj) {
+ var centerX = 2048 / 2;
+ if (x < centerX) {
+ player.isMovingLeft = true;
+ player.isMovingRight = false;
+ } else {
+ player.isMovingRight = true;
+ player.isMovingLeft = false;
+ }
+};
+game.update = function () {
+ gameTime += 16.67; // Approximate ms per frame at 60fps
+ // Player movement
+ if (player.isMovingLeft) {
+ player.x = Math.max(0, player.x - player.speed);
+ }
+ if (player.isMovingRight) {
+ player.x = Math.min(2048, player.x + player.speed);
+ }
+ if (player.isMovingUp) {
+ player.y = Math.max(0, player.y - player.speed);
+ }
+ if (player.isMovingDown) {
+ player.y = Math.min(2732, player.y + player.speed);
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ enemy.update();
+ enemy.targetX = player.x;
+ enemy.targetY = player.y;
+ // Check if enemy is in boundary
+ if (!checkEnemyInBoundary(enemy)) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (!enemy.lastIntersecting && enemy.intersects(player)) {
+ player.health -= 10;
+ LK.effects.flashObject(player, 0xff0000, 300);
+ LK.getSound('hit').play();
+ if (player.health <= 0) {
+ endGame();
+ }
+ }
+ enemy.lastIntersecting = enemy.intersects(player);
+ }
+ // Update bullets
+ for (var b = bullets.length - 1; b >= 0; b--) {
+ var bullet = bullets[b];
+ bullet.update();
+ if (bullet.lastY === undefined) bullet.lastY = bullet.y;
+ // Check if bullet is off screen
+ if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
+ bullet.destroy();
+ bullets.splice(b, 1);
+ continue;
+ }
+ // Check collision with enemies
+ for (var e = enemies.length - 1; e >= 0; e--) {
+ var enemy = enemies[e];
+ if (bullet.intersects(enemy)) {
+ enemy.destroy();
+ enemies.splice(e, 1);
+ bullet.destroy();
+ bullets.splice(b, 1);
+ kills++;
+ LK.setScore(LK.getScore() + 10);
+ LK.getSound('hit').play();
+ // Chance to spawn power up
+ if (Math.random() < 0.3) {
+ var powerUpType = ['shield', 'ammo', 'speed'][Math.floor(Math.random() * 3)];
+ createPowerUp(enemy.lastX, enemy.lastY, powerUpType);
+ }
+ break;
+ }
+ }
+ }
+ // Update power ups
+ for (var p = powerUps.length - 1; p >= 0; p--) {
+ var powerUp = powerUps[p];
+ if (!powerUp.lastIntersecting && powerUp.intersects(player)) {
+ switch (powerUp.type) {
+ case 'shield':
+ player.health = Math.min(player.maxHealth, player.health + 30);
+ break;
+ case 'ammo':
+ player.ammo = player.maxAmmo;
+ break;
+ case 'speed':
+ player.speed = 7;
+ LK.setTimeout(function () {
+ player.speed = 5;
+ }, 5000);
+ break;
+ }
+ LK.getSound('powerup').play();
+ powerUp.destroy();
+ powerUps.splice(p, 1);
+ }
+ powerUp.lastIntersecting = powerUp.intersects(player);
+ }
+ // Boundary contraction logic
+ if (gameTime - lastBoundaryContraction > boundaryContractionInterval) {
+ contractBoundary();
+ lastBoundaryContraction = gameTime;
+ }
+ // Check if player is in boundary
+ checkPlayerInBoundary();
+ // End game conditions
+ if (gameTime >= matchDuration) {
+ endGame();
+ }
+ // Update UI
+ if (LK.ticks % 10 === 0) {
+ updateUI();
+ }
+};
+LK.playMusic('bgmusic', {
+ loop: true
});
\ No newline at end of file