/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
// Pulse animation
self.pulseAnimation = function () {
tween(coinGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(coinGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: self.pulseAnimation
});
}
});
};
self.pulseAnimation();
self.collect = function () {
LK.getSound('coinCollect').play();
// Animation for collection
tween(self, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Player properties
self.direction = "right"; // Initial direction
self.speed = 5; // Initial speed
self.alive = true;
self.update = function () {
if (!self.alive) {
return;
}
// Move the player based on current direction
switch (self.direction) {
case "up":
self.y -= self.speed;
break;
case "down":
self.y += self.speed;
break;
case "left":
self.x -= self.speed;
break;
case "right":
self.x += self.speed;
break;
}
// Check if player is out of bounds
if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
self.die();
}
};
// Change direction by 90 degrees
self.turn = function () {
if (!self.alive) {
return;
}
LK.getSound('turn').play();
// Determine new direction (90-degree turn)
switch (self.direction) {
case "up":
case "down":
self.direction = Math.random() < 0.5 ? "left" : "right";
break;
case "left":
case "right":
self.direction = Math.random() < 0.5 ? "up" : "down";
break;
}
};
self.die = function () {
if (!self.alive) {
return;
}
self.alive = false;
LK.getSound('death').play();
LK.effects.flashObject(self, 0xff0000, 500);
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
};
return self;
});
var Wall = Container.expand(function () {
var self = Container.call(this);
var wallGraphics = self.attachAsset('wall', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xecf0f1
});
/****
* Game Code
****/
// Game variables
var MazeGenerator = function MazeGenerator() {
// Generate a maze configuration for the current level
this.generateMaze = function (level) {
var walls = [];
var coins = [];
// Base the number of walls and coins on the level
var numWalls = Math.min(5 + level * 2, 30);
var numCoins = Math.min(3 + level, 15);
// Create a safe zone at the start
var safeZoneRadius = 150;
// Generate walls avoiding the safe zone
for (var i = 0; i < numWalls; i++) {
var x, y;
var validPosition = false;
// Try to find a valid position for the wall
var attempts = 0;
while (!validPosition && attempts < 50) {
x = 100 + Math.random() * (2048 - 200);
y = 100 + Math.random() * (2732 - 200);
// Check if wall is away from the safe zone
var distFromStart = Math.sqrt(Math.pow(x - player.x, 2) + Math.pow(y - player.y, 2));
// Wall must be away from the safe zone
validPosition = distFromStart > safeZoneRadius;
// Check it's not too close to other walls
if (validPosition) {
for (var j = 0; j < walls.length; j++) {
var existingWall = walls[j];
var distBetweenWalls = Math.sqrt(Math.pow(x - existingWall.x, 2) + Math.pow(y - existingWall.y, 2));
if (distBetweenWalls < 100) {
validPosition = false;
break;
}
}
}
attempts++;
}
if (validPosition) {
var wall = new Wall();
wall.x = x;
wall.y = y;
walls.push(wall);
}
}
// Generate coins avoiding walls and the safe zone
for (var i = 0; i < numCoins; i++) {
var x, y;
var validPosition = false;
var attempts = 0;
while (!validPosition && attempts < 50) {
x = 100 + Math.random() * (2048 - 200);
y = 100 + Math.random() * (2732 - 200);
// Check if coin is away from the safe zone
var distFromStart = Math.sqrt(Math.pow(x - player.x, 2) + Math.pow(y - player.y, 2));
validPosition = distFromStart > safeZoneRadius;
// Check it's not too close to walls
if (validPosition) {
for (var j = 0; j < walls.length; j++) {
var wall = walls[j];
var distFromWall = Math.sqrt(Math.pow(x - wall.x, 2) + Math.pow(y - wall.y, 2));
if (distFromWall < 75) {
validPosition = false;
break;
}
}
}
// Check it's not too close to other coins
if (validPosition) {
for (var j = 0; j < coins.length; j++) {
var existingCoin = coins[j];
var distFromCoin = Math.sqrt(Math.pow(x - existingCoin.x, 2) + Math.pow(y - existingCoin.y, 2));
if (distFromCoin < 100) {
validPosition = false;
break;
}
}
}
attempts++;
}
if (validPosition) {
var coin = new Coin();
coin.x = x;
coin.y = y;
coins.push(coin);
}
}
return {
walls: walls,
coins: coins
};
};
};
var player;
var walls = [];
var coins = [];
var level = 1;
var mazeGenerator = new MazeGenerator();
var levelUpThreshold = 5; // Coins needed to level up
var coinsCollected = 0;
var speedIncreasePerLevel = 1;
// Setup UI
var scoreTxt = new Text2('0', {
size: 80,
fill: 0x2C3E50
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Level 1', {
size: 60,
fill: 0x2C3E50
});
levelTxt.anchor.set(0.5, 0);
levelTxt.y = 90;
LK.gui.top.addChild(levelTxt);
// Instructions text
var instructionsTxt = new Text2('Tap to change direction', {
size: 50,
fill: 0x7F8C8D
});
instructionsTxt.anchor.set(0.5, 0);
instructionsTxt.y = 170;
LK.gui.top.addChild(instructionsTxt);
// Hide instructions after a few seconds
LK.setTimeout(function () {
tween(instructionsTxt, {
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut
});
}, 5000);
// Initialize player
function initializePlayer() {
player = new Player();
player.x = 2048 / 2;
player.y = 2732 / 2;
game.addChild(player);
}
// Load level
function loadLevel(level) {
// Clear previous level elements
clearLevel();
// Update level text
levelTxt.setText('Level ' + level);
// Increase player speed with each level
player.speed = 5 + (level - 1) * speedIncreasePerLevel;
// Generate maze elements
var maze = mazeGenerator.generateMaze(level);
// Add walls
for (var i = 0; i < maze.walls.length; i++) {
var wall = maze.walls[i];
game.addChild(wall);
walls.push(wall);
}
// Add coins
for (var i = 0; i < maze.coins.length; i++) {
var coin = maze.coins[i];
game.addChild(coin);
coins.push(coin);
}
}
// Clear level elements
function clearLevel() {
// Remove all walls
for (var i = 0; i < walls.length; i++) {
walls[i].destroy();
}
walls = [];
// Remove all coins
for (var i = 0; i < coins.length; i++) {
coins[i].destroy();
}
coins = [];
}
// Start the game
function startGame() {
// Initialize player
initializePlayer();
// Load first level
loadLevel(level);
// Play background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.5,
duration: 1000
}
});
}
// Handle game tap
game.down = function (x, y, obj) {
// Change player direction on tap
if (player && player.alive) {
player.turn();
}
};
// Main game update loop
game.update = function () {
if (!player || !player.alive) {
return;
}
// Check for coin collection
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (player.intersects(coin)) {
// Collect coin
coin.collect();
coins.splice(i, 1);
// Update score
coinsCollected++;
LK.setScore(coinsCollected);
scoreTxt.setText(coinsCollected);
// Check for level up
if (coinsCollected % levelUpThreshold === 0) {
level++;
// Flash screen green for level up
LK.effects.flashScreen(0x2ecc71, 500);
// Load next level
loadLevel(level);
}
}
}
// Check for wall collisions
for (var i = 0; i < walls.length; i++) {
var wall = walls[i];
if (player.intersects(wall)) {
player.die();
break;
}
}
// Check if all coins are collected
if (coins.length === 0) {
level++;
// Flash screen
LK.effects.flashScreen(0x2ecc71, 500);
// Load next level
loadLevel(level);
}
};
// Start the game
startGame(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,378 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Pulse animation
+ self.pulseAnimation = function () {
+ tween(coinGraphics, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(coinGraphics, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: self.pulseAnimation
+ });
+ }
+ });
+ };
+ self.pulseAnimation();
+ self.collect = function () {
+ LK.getSound('coinCollect').play();
+ // Animation for collection
+ tween(self, {
+ alpha: 0,
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Player properties
+ self.direction = "right"; // Initial direction
+ self.speed = 5; // Initial speed
+ self.alive = true;
+ self.update = function () {
+ if (!self.alive) {
+ return;
+ }
+ // Move the player based on current direction
+ switch (self.direction) {
+ case "up":
+ self.y -= self.speed;
+ break;
+ case "down":
+ self.y += self.speed;
+ break;
+ case "left":
+ self.x -= self.speed;
+ break;
+ case "right":
+ self.x += self.speed;
+ break;
+ }
+ // Check if player is out of bounds
+ if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
+ self.die();
+ }
+ };
+ // Change direction by 90 degrees
+ self.turn = function () {
+ if (!self.alive) {
+ return;
+ }
+ LK.getSound('turn').play();
+ // Determine new direction (90-degree turn)
+ switch (self.direction) {
+ case "up":
+ case "down":
+ self.direction = Math.random() < 0.5 ? "left" : "right";
+ break;
+ case "left":
+ case "right":
+ self.direction = Math.random() < 0.5 ? "up" : "down";
+ break;
+ }
+ };
+ self.die = function () {
+ if (!self.alive) {
+ return;
+ }
+ self.alive = false;
+ LK.getSound('death').play();
+ LK.effects.flashObject(self, 0xff0000, 500);
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1000);
+ };
+ return self;
+});
+var Wall = Container.expand(function () {
+ var self = Container.call(this);
+ var wallGraphics = self.attachAsset('wall', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0xecf0f1
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var MazeGenerator = function MazeGenerator() {
+ // Generate a maze configuration for the current level
+ this.generateMaze = function (level) {
+ var walls = [];
+ var coins = [];
+ // Base the number of walls and coins on the level
+ var numWalls = Math.min(5 + level * 2, 30);
+ var numCoins = Math.min(3 + level, 15);
+ // Create a safe zone at the start
+ var safeZoneRadius = 150;
+ // Generate walls avoiding the safe zone
+ for (var i = 0; i < numWalls; i++) {
+ var x, y;
+ var validPosition = false;
+ // Try to find a valid position for the wall
+ var attempts = 0;
+ while (!validPosition && attempts < 50) {
+ x = 100 + Math.random() * (2048 - 200);
+ y = 100 + Math.random() * (2732 - 200);
+ // Check if wall is away from the safe zone
+ var distFromStart = Math.sqrt(Math.pow(x - player.x, 2) + Math.pow(y - player.y, 2));
+ // Wall must be away from the safe zone
+ validPosition = distFromStart > safeZoneRadius;
+ // Check it's not too close to other walls
+ if (validPosition) {
+ for (var j = 0; j < walls.length; j++) {
+ var existingWall = walls[j];
+ var distBetweenWalls = Math.sqrt(Math.pow(x - existingWall.x, 2) + Math.pow(y - existingWall.y, 2));
+ if (distBetweenWalls < 100) {
+ validPosition = false;
+ break;
+ }
+ }
+ }
+ attempts++;
+ }
+ if (validPosition) {
+ var wall = new Wall();
+ wall.x = x;
+ wall.y = y;
+ walls.push(wall);
+ }
+ }
+ // Generate coins avoiding walls and the safe zone
+ for (var i = 0; i < numCoins; i++) {
+ var x, y;
+ var validPosition = false;
+ var attempts = 0;
+ while (!validPosition && attempts < 50) {
+ x = 100 + Math.random() * (2048 - 200);
+ y = 100 + Math.random() * (2732 - 200);
+ // Check if coin is away from the safe zone
+ var distFromStart = Math.sqrt(Math.pow(x - player.x, 2) + Math.pow(y - player.y, 2));
+ validPosition = distFromStart > safeZoneRadius;
+ // Check it's not too close to walls
+ if (validPosition) {
+ for (var j = 0; j < walls.length; j++) {
+ var wall = walls[j];
+ var distFromWall = Math.sqrt(Math.pow(x - wall.x, 2) + Math.pow(y - wall.y, 2));
+ if (distFromWall < 75) {
+ validPosition = false;
+ break;
+ }
+ }
+ }
+ // Check it's not too close to other coins
+ if (validPosition) {
+ for (var j = 0; j < coins.length; j++) {
+ var existingCoin = coins[j];
+ var distFromCoin = Math.sqrt(Math.pow(x - existingCoin.x, 2) + Math.pow(y - existingCoin.y, 2));
+ if (distFromCoin < 100) {
+ validPosition = false;
+ break;
+ }
+ }
+ }
+ attempts++;
+ }
+ if (validPosition) {
+ var coin = new Coin();
+ coin.x = x;
+ coin.y = y;
+ coins.push(coin);
+ }
+ }
+ return {
+ walls: walls,
+ coins: coins
+ };
+ };
+};
+var player;
+var walls = [];
+var coins = [];
+var level = 1;
+var mazeGenerator = new MazeGenerator();
+var levelUpThreshold = 5; // Coins needed to level up
+var coinsCollected = 0;
+var speedIncreasePerLevel = 1;
+// Setup UI
+var scoreTxt = new Text2('0', {
+ size: 80,
+ fill: 0x2C3E50
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var levelTxt = new Text2('Level 1', {
+ size: 60,
+ fill: 0x2C3E50
+});
+levelTxt.anchor.set(0.5, 0);
+levelTxt.y = 90;
+LK.gui.top.addChild(levelTxt);
+// Instructions text
+var instructionsTxt = new Text2('Tap to change direction', {
+ size: 50,
+ fill: 0x7F8C8D
+});
+instructionsTxt.anchor.set(0.5, 0);
+instructionsTxt.y = 170;
+LK.gui.top.addChild(instructionsTxt);
+// Hide instructions after a few seconds
+LK.setTimeout(function () {
+ tween(instructionsTxt, {
+ alpha: 0
+ }, {
+ duration: 1000,
+ easing: tween.easeOut
+ });
+}, 5000);
+// Initialize player
+function initializePlayer() {
+ player = new Player();
+ player.x = 2048 / 2;
+ player.y = 2732 / 2;
+ game.addChild(player);
+}
+// Load level
+function loadLevel(level) {
+ // Clear previous level elements
+ clearLevel();
+ // Update level text
+ levelTxt.setText('Level ' + level);
+ // Increase player speed with each level
+ player.speed = 5 + (level - 1) * speedIncreasePerLevel;
+ // Generate maze elements
+ var maze = mazeGenerator.generateMaze(level);
+ // Add walls
+ for (var i = 0; i < maze.walls.length; i++) {
+ var wall = maze.walls[i];
+ game.addChild(wall);
+ walls.push(wall);
+ }
+ // Add coins
+ for (var i = 0; i < maze.coins.length; i++) {
+ var coin = maze.coins[i];
+ game.addChild(coin);
+ coins.push(coin);
+ }
+}
+// Clear level elements
+function clearLevel() {
+ // Remove all walls
+ for (var i = 0; i < walls.length; i++) {
+ walls[i].destroy();
+ }
+ walls = [];
+ // Remove all coins
+ for (var i = 0; i < coins.length; i++) {
+ coins[i].destroy();
+ }
+ coins = [];
+}
+// Start the game
+function startGame() {
+ // Initialize player
+ initializePlayer();
+ // Load first level
+ loadLevel(level);
+ // Play background music
+ LK.playMusic('bgMusic', {
+ fade: {
+ start: 0,
+ end: 0.5,
+ duration: 1000
+ }
+ });
+}
+// Handle game tap
+game.down = function (x, y, obj) {
+ // Change player direction on tap
+ if (player && player.alive) {
+ player.turn();
+ }
+};
+// Main game update loop
+game.update = function () {
+ if (!player || !player.alive) {
+ return;
+ }
+ // Check for coin collection
+ for (var i = coins.length - 1; i >= 0; i--) {
+ var coin = coins[i];
+ if (player.intersects(coin)) {
+ // Collect coin
+ coin.collect();
+ coins.splice(i, 1);
+ // Update score
+ coinsCollected++;
+ LK.setScore(coinsCollected);
+ scoreTxt.setText(coinsCollected);
+ // Check for level up
+ if (coinsCollected % levelUpThreshold === 0) {
+ level++;
+ // Flash screen green for level up
+ LK.effects.flashScreen(0x2ecc71, 500);
+ // Load next level
+ loadLevel(level);
+ }
+ }
+ }
+ // Check for wall collisions
+ for (var i = 0; i < walls.length; i++) {
+ var wall = walls[i];
+ if (player.intersects(wall)) {
+ player.die();
+ break;
+ }
+ }
+ // Check if all coins are collected
+ if (coins.length === 0) {
+ level++;
+ // Flash screen
+ LK.effects.flashScreen(0x2ecc71, 500);
+ // Load next level
+ loadLevel(level);
+ }
+};
+// Start the game
+startGame();
\ No newline at end of file