/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Collectible = Container.expand(function () {
var self = Container.call(this);
var asset = self.attachAsset('collectible', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.active = true;
self.collected = false;
self.update = function () {
if (!self.active) {
return;
}
self.x -= self.speed;
// Spin the collectible
asset.rotation += 0.05;
// Remove when off screen
if (self.x < -100) {
self.active = false;
self.destroy();
}
};
self.collect = function () {
if (self.collected) {
return;
}
self.collected = true;
LK.getSound('collect').play();
// Collect animation
tween(self, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.active = false;
self.destroy();
}
});
};
return self;
});
var Obstacle = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'obstacle';
var asset = self.attachAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.active = true;
self.update = function () {
if (!self.active) {
return;
}
self.x -= self.speed;
// Remove when off screen
if (self.x < -100) {
self.active = false;
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
});
self.velocity = 0;
self.gravity = 1;
self.jumpPower = -20;
self.isJumping = false;
self.isDead = false;
self.jump = function () {
if (!self.isJumping && !self.isDead) {
self.velocity = self.jumpPower;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.die = function () {
if (!self.isDead) {
self.isDead = true;
LK.getSound('death').play();
LK.effects.flashObject(self, 0xFF0000, 500);
// Create death animation
tween(self, {
alpha: 0,
rotation: Math.PI * 4
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
LK.showGameOver();
}
});
}
};
self.update = function () {
if (self.isDead) {
return;
}
// Apply gravity
self.velocity += self.gravity;
self.y += self.velocity;
// Floor collision
if (self.y > groundLevel) {
self.y = groundLevel;
self.velocity = 0;
self.isJumping = false;
}
// Ceiling collision
if (self.y < 50) {
self.y = 50;
self.velocity = 0;
}
// Visual feedback for jumping
if (self.isJumping) {
playerGraphics.rotation += 0.1;
} else {
playerGraphics.rotation = 0;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x333333
});
/****
* Game Code
****/
// Game variables
var player;
var obstacles = [];
var collectibles = [];
var score = 0;
var level = 1;
var gameSpeed = 1;
var groundLevel = 2732 - 150;
var gameActive = false;
var lastObstacleTime = 0;
var obstacleSpawnRate = 1500; // milliseconds
var collectibleSpawnRate = 3000; // milliseconds
var lastCollectibleTime = 0;
var levelProgression = 0;
// Initialize UI
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0, 0);
levelTxt.x = 150;
levelTxt.y = 20;
LK.gui.topRight.addChild(levelTxt);
// Create floor
var floor = LK.getAsset('platform', {
anchorX: 0,
anchorY: 0,
scaleX: 7,
scaleY: 1
});
floor.x = 0;
floor.y = groundLevel;
game.addChild(floor);
// Initialize player
function initPlayer() {
player = new Player();
player.x = 400;
player.y = groundLevel;
game.addChild(player);
}
// Initialize game
function initGame() {
// Clear any existing objects
for (var i = obstacles.length - 1; i >= 0; i--) {
if (obstacles[i] && obstacles[i].parent) {
obstacles[i].destroy();
}
}
obstacles = [];
for (var i = collectibles.length - 1; i >= 0; i--) {
if (collectibles[i] && collectibles[i].parent) {
collectibles[i].destroy();
}
}
collectibles = [];
// Reset variables
score = 0;
level = 1;
gameSpeed = 1;
levelProgression = 0;
lastObstacleTime = Date.now();
lastCollectibleTime = Date.now();
// Update UI
scoreTxt.setText(score);
levelTxt.setText('Level: ' + level);
// Initialize player
if (player && player.parent) {
player.destroy();
}
initPlayer();
// Start the game
gameActive = true;
// Play music
LK.playMusic('gameMusic');
}
// Spawn obstacle
function spawnObstacle() {
var type;
var rnd = Math.random();
if (rnd < 0.4) {
type = 'obstacle';
} else if (rnd < 0.7) {
type = 'spike';
} else {
type = 'platform';
}
var obstacle = new Obstacle(type);
obstacle.x = 2048 + 100;
// Position based on type
if (type === 'platform') {
// Platforms at varying heights
obstacle.y = groundLevel - 200 - Math.random() * 300;
} else if (type === 'spike') {
// Spikes on the ground
obstacle.y = groundLevel - 30;
} else {
// Regular obstacles on the ground
obstacle.y = groundLevel - 50;
}
// Adjust speed based on level
obstacle.speed = 8 + (level - 1) * 1.5;
// Add to game
game.addChild(obstacle);
obstacles.push(obstacle);
lastObstacleTime = Date.now();
}
// Spawn collectible
function spawnCollectible() {
var collectible = new Collectible();
collectible.x = 2048 + 100;
collectible.y = groundLevel - 100 - Math.random() * 400; // Random height
// Adjust speed based on level
collectible.speed = 8 + (level - 1) * 1.5;
// Add to game
game.addChild(collectible);
collectibles.push(collectible);
lastCollectibleTime = Date.now();
}
// Check collisions
function checkCollisions() {
if (!player || player.isDead) {
return;
}
// Check obstacle collisions
for (var i = 0; i < obstacles.length; i++) {
var obstacle = obstacles[i];
if (obstacle.active && player.intersects(obstacle)) {
if (obstacle.type === 'platform') {
// Land on platform
if (player.velocity > 0 && player.y < obstacle.y - 30) {
player.y = obstacle.y - 50;
player.velocity = 0;
player.isJumping = false;
}
} else {
// Die on obstacle/spike
player.die();
return;
}
}
}
// Check collectible collisions
for (var i = 0; i < collectibles.length; i++) {
var collectible = collectibles[i];
if (collectible.active && !collectible.collected && player.intersects(collectible)) {
collectible.collect();
updateScore(10);
}
}
}
// Update score
function updateScore(points) {
score += points;
scoreTxt.setText(score);
levelProgression += points;
// Level up after certain score thresholds
if (levelProgression >= 100) {
levelUp();
}
}
// Level up
function levelUp() {
level++;
levelTxt.setText('Level: ' + level);
levelProgression = 0;
gameSpeed += 0.2;
// Flash screen to indicate level up
LK.effects.flashScreen(0x00FF00, 500);
// Reduce spawn times as levels progress
obstacleSpawnRate = Math.max(800, obstacleSpawnRate - 100);
collectibleSpawnRate = Math.max(1500, collectibleSpawnRate - 200);
}
// Input handling
game.down = function (x, y, obj) {
if (!gameActive) {
initGame();
} else if (player && !player.isDead) {
player.jump();
}
};
// Main update loop
game.update = function () {
if (!gameActive) {
return;
}
// Spawn obstacles
var currentTime = Date.now();
if (currentTime - lastObstacleTime > obstacleSpawnRate) {
spawnObstacle();
}
// Spawn collectibles
if (currentTime - lastCollectibleTime > collectibleSpawnRate) {
spawnCollectible();
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
if (obstacles[i] && obstacles[i].active) {
obstacles[i].update();
} else {
obstacles.splice(i, 1);
}
}
// Update collectibles
for (var i = collectibles.length - 1; i >= 0; i--) {
if (collectibles[i] && collectibles[i].active) {
collectibles[i].update();
} else {
collectibles.splice(i, 1);
}
}
// Passive score increase
if (LK.ticks % 60 === 0 && !player.isDead) {
updateScore(1);
}
// Check collisions
checkCollisions();
// Update player
if (player) {
player.update();
// Check if player fell off screen
if (player.y > 2732 + 100) {
player.die();
}
}
};
// Initialize the game when it loads
initPlayer();
LK.playMusic('gameMusic'); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,383 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Collectible = Container.expand(function () {
+ var self = Container.call(this);
+ var asset = self.attachAsset('collectible', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.active = true;
+ self.collected = false;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Spin the collectible
+ asset.rotation += 0.05;
+ // Remove when off screen
+ if (self.x < -100) {
+ self.active = false;
+ self.destroy();
+ }
+ };
+ self.collect = function () {
+ if (self.collected) {
+ return;
+ }
+ self.collected = true;
+ LK.getSound('collect').play();
+ // Collect animation
+ tween(self, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.active = false;
+ self.destroy();
+ }
+ });
+ };
+ return self;
+});
+var Obstacle = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'obstacle';
+ var asset = self.attachAsset(self.type, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.active = true;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Remove when off screen
+ if (self.x < -100) {
+ self.active = false;
+ 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
+ });
+ self.velocity = 0;
+ self.gravity = 1;
+ self.jumpPower = -20;
+ self.isJumping = false;
+ self.isDead = false;
+ self.jump = function () {
+ if (!self.isJumping && !self.isDead) {
+ self.velocity = self.jumpPower;
+ self.isJumping = true;
+ LK.getSound('jump').play();
+ }
+ };
+ self.die = function () {
+ if (!self.isDead) {
+ self.isDead = true;
+ LK.getSound('death').play();
+ LK.effects.flashObject(self, 0xFF0000, 500);
+ // Create death animation
+ tween(self, {
+ alpha: 0,
+ rotation: Math.PI * 4
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ LK.showGameOver();
+ }
+ });
+ }
+ };
+ self.update = function () {
+ if (self.isDead) {
+ return;
+ }
+ // Apply gravity
+ self.velocity += self.gravity;
+ self.y += self.velocity;
+ // Floor collision
+ if (self.y > groundLevel) {
+ self.y = groundLevel;
+ self.velocity = 0;
+ self.isJumping = false;
+ }
+ // Ceiling collision
+ if (self.y < 50) {
+ self.y = 50;
+ self.velocity = 0;
+ }
+ // Visual feedback for jumping
+ if (self.isJumping) {
+ playerGraphics.rotation += 0.1;
+ } else {
+ playerGraphics.rotation = 0;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x333333
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var obstacles = [];
+var collectibles = [];
+var score = 0;
+var level = 1;
+var gameSpeed = 1;
+var groundLevel = 2732 - 150;
+var gameActive = false;
+var lastObstacleTime = 0;
+var obstacleSpawnRate = 1500; // milliseconds
+var collectibleSpawnRate = 3000; // milliseconds
+var lastCollectibleTime = 0;
+var levelProgression = 0;
+// Initialize UI
+var scoreTxt = new Text2('0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var levelTxt = new Text2('Level: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(0, 0);
+levelTxt.x = 150;
+levelTxt.y = 20;
+LK.gui.topRight.addChild(levelTxt);
+// Create floor
+var floor = LK.getAsset('platform', {
+ anchorX: 0,
+ anchorY: 0,
+ scaleX: 7,
+ scaleY: 1
+});
+floor.x = 0;
+floor.y = groundLevel;
+game.addChild(floor);
+// Initialize player
+function initPlayer() {
+ player = new Player();
+ player.x = 400;
+ player.y = groundLevel;
+ game.addChild(player);
+}
+// Initialize game
+function initGame() {
+ // Clear any existing objects
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ if (obstacles[i] && obstacles[i].parent) {
+ obstacles[i].destroy();
+ }
+ }
+ obstacles = [];
+ for (var i = collectibles.length - 1; i >= 0; i--) {
+ if (collectibles[i] && collectibles[i].parent) {
+ collectibles[i].destroy();
+ }
+ }
+ collectibles = [];
+ // Reset variables
+ score = 0;
+ level = 1;
+ gameSpeed = 1;
+ levelProgression = 0;
+ lastObstacleTime = Date.now();
+ lastCollectibleTime = Date.now();
+ // Update UI
+ scoreTxt.setText(score);
+ levelTxt.setText('Level: ' + level);
+ // Initialize player
+ if (player && player.parent) {
+ player.destroy();
+ }
+ initPlayer();
+ // Start the game
+ gameActive = true;
+ // Play music
+ LK.playMusic('gameMusic');
+}
+// Spawn obstacle
+function spawnObstacle() {
+ var type;
+ var rnd = Math.random();
+ if (rnd < 0.4) {
+ type = 'obstacle';
+ } else if (rnd < 0.7) {
+ type = 'spike';
+ } else {
+ type = 'platform';
+ }
+ var obstacle = new Obstacle(type);
+ obstacle.x = 2048 + 100;
+ // Position based on type
+ if (type === 'platform') {
+ // Platforms at varying heights
+ obstacle.y = groundLevel - 200 - Math.random() * 300;
+ } else if (type === 'spike') {
+ // Spikes on the ground
+ obstacle.y = groundLevel - 30;
+ } else {
+ // Regular obstacles on the ground
+ obstacle.y = groundLevel - 50;
+ }
+ // Adjust speed based on level
+ obstacle.speed = 8 + (level - 1) * 1.5;
+ // Add to game
+ game.addChild(obstacle);
+ obstacles.push(obstacle);
+ lastObstacleTime = Date.now();
+}
+// Spawn collectible
+function spawnCollectible() {
+ var collectible = new Collectible();
+ collectible.x = 2048 + 100;
+ collectible.y = groundLevel - 100 - Math.random() * 400; // Random height
+ // Adjust speed based on level
+ collectible.speed = 8 + (level - 1) * 1.5;
+ // Add to game
+ game.addChild(collectible);
+ collectibles.push(collectible);
+ lastCollectibleTime = Date.now();
+}
+// Check collisions
+function checkCollisions() {
+ if (!player || player.isDead) {
+ return;
+ }
+ // Check obstacle collisions
+ for (var i = 0; i < obstacles.length; i++) {
+ var obstacle = obstacles[i];
+ if (obstacle.active && player.intersects(obstacle)) {
+ if (obstacle.type === 'platform') {
+ // Land on platform
+ if (player.velocity > 0 && player.y < obstacle.y - 30) {
+ player.y = obstacle.y - 50;
+ player.velocity = 0;
+ player.isJumping = false;
+ }
+ } else {
+ // Die on obstacle/spike
+ player.die();
+ return;
+ }
+ }
+ }
+ // Check collectible collisions
+ for (var i = 0; i < collectibles.length; i++) {
+ var collectible = collectibles[i];
+ if (collectible.active && !collectible.collected && player.intersects(collectible)) {
+ collectible.collect();
+ updateScore(10);
+ }
+ }
+}
+// Update score
+function updateScore(points) {
+ score += points;
+ scoreTxt.setText(score);
+ levelProgression += points;
+ // Level up after certain score thresholds
+ if (levelProgression >= 100) {
+ levelUp();
+ }
+}
+// Level up
+function levelUp() {
+ level++;
+ levelTxt.setText('Level: ' + level);
+ levelProgression = 0;
+ gameSpeed += 0.2;
+ // Flash screen to indicate level up
+ LK.effects.flashScreen(0x00FF00, 500);
+ // Reduce spawn times as levels progress
+ obstacleSpawnRate = Math.max(800, obstacleSpawnRate - 100);
+ collectibleSpawnRate = Math.max(1500, collectibleSpawnRate - 200);
+}
+// Input handling
+game.down = function (x, y, obj) {
+ if (!gameActive) {
+ initGame();
+ } else if (player && !player.isDead) {
+ player.jump();
+ }
+};
+// Main update loop
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Spawn obstacles
+ var currentTime = Date.now();
+ if (currentTime - lastObstacleTime > obstacleSpawnRate) {
+ spawnObstacle();
+ }
+ // Spawn collectibles
+ if (currentTime - lastCollectibleTime > collectibleSpawnRate) {
+ spawnCollectible();
+ }
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ if (obstacles[i] && obstacles[i].active) {
+ obstacles[i].update();
+ } else {
+ obstacles.splice(i, 1);
+ }
+ }
+ // Update collectibles
+ for (var i = collectibles.length - 1; i >= 0; i--) {
+ if (collectibles[i] && collectibles[i].active) {
+ collectibles[i].update();
+ } else {
+ collectibles.splice(i, 1);
+ }
+ }
+ // Passive score increase
+ if (LK.ticks % 60 === 0 && !player.isDead) {
+ updateScore(1);
+ }
+ // Check collisions
+ checkCollisions();
+ // Update player
+ if (player) {
+ player.update();
+ // Check if player fell off screen
+ if (player.y > 2732 + 100) {
+ player.die();
+ }
+ }
+};
+// Initialize the game when it loads
+initPlayer();
+LK.playMusic('gameMusic');
\ No newline at end of file