/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, gems: 0, avatarColor: 16754176 }); /**** * Classes ****/ var BackgroundFire = Container.expand(function () { var self = Container.call(this); self.speed = -3; // Slower than game elements for parallax effect var fireGraphics = self.attachAsset('backgroundFire', { anchorX: 0.5, anchorY: 1.0, alpha: 0.7 }); // Randomize initial scale var scale = 0.5 + Math.random() * 1.0; fireGraphics.scale.set(scale, scale); // Animation variables self.waveTime = Math.random() * Math.PI * 2; // Random start phase self.update = function () { self.x += self.speed; // Create fire wave effect self.waveTime += 0.1; var waveScale = Math.sin(self.waveTime) * 0.2; fireGraphics.scaleX = scale + waveScale; fireGraphics.scaleY = scale - waveScale / 2; // Remove if off screen if (self.x < -fireGraphics.width) { self.destroy(); } }; return self; }); var Gem = Container.expand(function () { var self = Container.call(this); self.speed = -12; self.collected = false; var gemGraphics = self.attachAsset('gem', { anchorX: 0.5, anchorY: 0.5 }); // Add pulsing animation self.pulseTime = 0; self.update = function () { self.x += self.speed; // Pulsing animation self.pulseTime += 0.1; var scale = 0.9 + Math.sin(self.pulseTime) * 0.1; gemGraphics.scale.set(scale, scale); // Remove if off screen if (self.x < -100) { self.destroy(); } }; self.collect = function () { if (self.collected) { return; } self.collected = true; LK.getSound('collect').play(); // Animate gem collection tween(gemGraphics, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); // Update game stats storage.gems = (storage.gems || 0) + 1; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); self.speed = -12; self.type = 'standard'; // standard, spikes, moving var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.setType = function (newType) { self.type = newType; if (newType === 'spikes') { obstacleGraphics = self.removeChild(obstacleGraphics); obstacleGraphics = self.attachAsset('spikes', { anchorX: 0.5, anchorY: 0.5 }); } else if (newType === 'moving') { // Add a slight tint to show it's a moving obstacle obstacleGraphics.tint = 0xff9900; // Start movement animation self.startY = self.y; self.moveRange = 150; self.moveSpeed = 0.05; self.moveTime = 0; } }; self.update = function () { self.x += self.speed; // Handle moving obstacles if (self.type === 'moving') { self.moveTime += self.moveSpeed; self.y = self.startY + Math.sin(self.moveTime) * self.moveRange; } // Remove if off screen if (self.x < -100) { self.destroy(); } }; return self; }); var Particle = Container.expand(function () { var self = Container.call(this); var particleGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); // Set random velocity self.velocity = { x: -5 + Math.random() * 10, y: -10 + Math.random() * 5 }; self.gravity = 0.5; self.lifetime = 30 + Math.random() * 30; self.age = 0; self.update = function () { // Apply physics self.velocity.y += self.gravity; self.x += self.velocity.x; self.y += self.velocity.y; // Age the particle self.age++; // Fade out as it ages particleGraphics.alpha = Math.max(0, 1 - self.age / self.lifetime); // Destroy when lifetime ends if (self.age >= self.lifetime) { self.destroy(); } }; return self; }); var Platform = Container.expand(function () { var self = Container.call(this); self.speed = -12; var platformGraphics = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.x += self.speed; // Remove if off screen if (self.x < -platformGraphics.width) { self.destroy(); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); self.velocity = { x: 0, y: 0 }; self.gravity = 0.8; self.jumpForce = -20; self.isJumping = false; self.isDead = false; self.isFlying = false; // Get player avatar color from storage var playerColor = storage.avatarColor || 0xffa600; var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5, tint: playerColor }); self.update = function () { if (self.isDead) { return; } // Apply gravity if not flying if (!self.isFlying) { self.velocity.y += self.gravity; } else { // In flying mode, go up slowly self.velocity.y = -5; } // Apply velocity self.y += self.velocity.y; // Simple rotation based on velocity playerGraphics.rotation += 0.05; // Check floor collision if (self.y > groundLevel - playerGraphics.height / 2) { self.y = groundLevel - playerGraphics.height / 2; self.velocity.y = 0; self.isJumping = false; } }; self.jump = function () { if (!self.isJumping && !self.isFlying) { self.velocity.y = self.jumpForce; self.isJumping = true; LK.getSound('jump').play(); } }; self.toggleFlying = function () { self.isFlying = !self.isFlying; // Change player appearance when flying if (self.isFlying) { tween(playerGraphics, { scaleY: 0.7, scaleX: 1.2 }, { duration: 200 }); } else { tween(playerGraphics, { scaleY: 1, scaleX: 1 }, { duration: 200 }); } }; self.die = function () { if (self.isDead) { return; } self.isDead = true; LK.getSound('crash').play(); // Explosion effect for (var i = 0; i < 10; i++) { createParticle(self.x, self.y); } // Hide player playerGraphics.alpha = 0; // Game over after a short delay LK.setTimeout(function () { LK.showGameOver(); }, 1000); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x331111 // Dark red background }); /**** * Game Code ****/ // Global variables var player; var obstacles = []; var gems = []; var platforms = []; var backgroundFires = []; var particles = []; var groundLevel = 2732 - 100; // Ground is 100px from bottom var score = 0; var obstacleSpeed = -12; var obstacleTimer = 0; var obstacleInterval = 120; // Frames between obstacles var level = 1; var gameStarted = false; var isGameOver = false; // Game UI elements var scoreText = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(1.0, 0); LK.gui.topRight.addChild(scoreText); var levelText = new Text2('Level: 1', { size: 80, fill: 0xFFFFFF }); levelText.anchor.set(0.0, 0); LK.gui.topLeft.addChild(levelText); // Move the level text away from the top left corner (platform menu area) levelText.x = 120; levelText.y = 20; var gemCountText = new Text2('Gems: ' + (storage.gems || 0), { size: 60, fill: 0x00FFFF }); gemCountText.anchor.set(0.5, 0); LK.gui.top.addChild(gemCountText); // Create a tap to start message var startText = new Text2('Tap to Start', { size: 120, fill: 0xFFFFFF }); startText.anchor.set(0.5, 0.5); LK.gui.center.addChild(startText); // Create the ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0.5, anchorY: 0.0, x: 2048 / 2, y: groundLevel })); // Create the player player = game.addChild(new Player()); player.x = 500; player.y = groundLevel - 100; // Update the obstacle speed based on level function updateDifficulty() { // Increase speed as level increases obstacleSpeed = -12 - level; // Decrease interval between obstacles as level increases obstacleInterval = Math.max(60, 120 - level * 5); // Update all current obstacles and platforms for (var i = 0; i < obstacles.length; i++) { obstacles[i].speed = obstacleSpeed; } for (var i = 0; i < platforms.length; i++) { platforms[i].speed = obstacleSpeed; } for (var i = 0; i < gems.length; i++) { gems[i].speed = obstacleSpeed; } // Update level text levelText.setText('Level: ' + level); } // Create a new obstacle function createObstacle() { var obstacle = new Obstacle(); obstacle.x = 2048 + 100; // Start just off-screen obstacle.y = groundLevel - obstacle.height / 2; obstacle.speed = obstacleSpeed; // Random obstacle type var type = Math.random(); if (type < 0.3) { obstacle.setType('spikes'); } else if (type < 0.6 && level > 1) { obstacle.setType('moving'); // Position moving obstacles higher so they move up and down obstacle.y -= 150; } obstacles.push(obstacle); game.addChild(obstacle); // Sometimes add platforms after obstacles if (Math.random() < 0.4) { createPlatform(obstacle.x + 350, groundLevel - 200 - Math.random() * 150); } // Sometimes add gems if (Math.random() < 0.3) { createGem(obstacle.x + 150, obstacle.y - 150); } } // Create a platform function createPlatform(x, y) { var platform = new Platform(); platform.x = x || 2048 + 100; // Start just off-screen platform.y = y || groundLevel - 300; platform.speed = obstacleSpeed; platforms.push(platform); game.addChild(platform); } // Create a gem function createGem(x, y) { var gem = new Gem(); gem.x = x || 2048 + 100; // Start just off-screen gem.y = y || groundLevel - 200; gem.speed = obstacleSpeed; gems.push(gem); game.addChild(gem); } // Create a background fire function createBackgroundFire() { var fire = new BackgroundFire(); fire.x = 2048 + Math.random() * 500; fire.y = groundLevel + 10; // Slightly below ground level backgroundFires.push(fire); game.addChild(fire); } // Create a particle function createParticle(x, y) { var particle = new Particle(); particle.x = x; particle.y = y; particles.push(particle); game.addChild(particle); } // Check collision between player and obstacles function checkCollisions() { // Check obstacle collisions for (var i = 0; i < obstacles.length; i++) { if (player.intersects(obstacles[i]) && !player.isDead) { player.die(); return; } } // Check gem collections for (var i = 0; i < gems.length; i++) { if (!gems[i].collected && player.intersects(gems[i])) { gems[i].collect(); score += 10; updateScore(); } } // Check platform collisions var onPlatform = false; for (var i = 0; i < platforms.length; i++) { if (player.intersects(platforms[i]) && player.y < platforms[i].y - 10 && player.velocity.y > 0) { player.y = platforms[i].y - platforms[i].height / 2 - player.height / 2; player.velocity.y = 0; player.isJumping = false; onPlatform = true; } } } // Update score display function updateScore() { scoreText.setText('Score: ' + score); gemCountText.setText('Gems: ' + (storage.gems || 0)); // Check for level up if (score >= level * 100) { levelUp(); } // Update high score if (score > storage.highScore) { storage.highScore = score; } } // Level up function function levelUp() { level++; // Flash level text LK.effects.flashObject(levelText, 0xffff00, 500); // Update difficulty updateDifficulty(); } // Start the game function startGame() { if (gameStarted) { return; } gameStarted = true; startText.visible = false; // Start background music LK.playMusic('bgmusic', { fade: { start: 0, end: 0.7, duration: 1000 } }); // Add initial obstacles and fire effects createObstacle(); for (var i = 0; i < 5; i++) { createBackgroundFire(); } // Start score counter scoreInterval = LK.setInterval(function () { if (!player.isDead) { score++; updateScore(); } }, 1000); } // Handle game input game.down = function (x, y, obj) { if (!gameStarted) { startGame(); return; } // Jump when tapping upper half of screen if (y < 2732 / 2) { player.jump(); } // Toggle flying mode when tapping lower half else { player.toggleFlying(); } }; // Main game update game.update = function () { if (!gameStarted) { return; } // Spawn obstacles at intervals obstacleTimer++; if (obstacleTimer >= obstacleInterval && !player.isDead) { createObstacle(); obstacleTimer = 0; } // Spawn background fires if (LK.ticks % 120 === 0 && !player.isDead) { createBackgroundFire(); } // Update all game elements player.update(); for (var i = obstacles.length - 1; i >= 0; i--) { obstacles[i].update(); if (!obstacles[i].parent) { obstacles.splice(i, 1); } } for (var i = gems.length - 1; i >= 0; i--) { gems[i].update(); if (!gems[i].parent) { gems.splice(i, 1); } } for (var i = platforms.length - 1; i >= 0; i--) { platforms[i].update(); if (!platforms[i].parent) { platforms.splice(i, 1); } } for (var i = backgroundFires.length - 1; i >= 0; i--) { backgroundFires[i].update(); if (!backgroundFires[i].parent) { backgroundFires.splice(i, 1); } } for (var i = particles.length - 1; i >= 0; i--) { particles[i].update(); if (!particles[i].parent) { particles.splice(i, 1); } } // Check collisions if (!player.isDead) { checkCollisions(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
gems: 0,
avatarColor: 16754176
});
/****
* Classes
****/
var BackgroundFire = Container.expand(function () {
var self = Container.call(this);
self.speed = -3; // Slower than game elements for parallax effect
var fireGraphics = self.attachAsset('backgroundFire', {
anchorX: 0.5,
anchorY: 1.0,
alpha: 0.7
});
// Randomize initial scale
var scale = 0.5 + Math.random() * 1.0;
fireGraphics.scale.set(scale, scale);
// Animation variables
self.waveTime = Math.random() * Math.PI * 2; // Random start phase
self.update = function () {
self.x += self.speed;
// Create fire wave effect
self.waveTime += 0.1;
var waveScale = Math.sin(self.waveTime) * 0.2;
fireGraphics.scaleX = scale + waveScale;
fireGraphics.scaleY = scale - waveScale / 2;
// Remove if off screen
if (self.x < -fireGraphics.width) {
self.destroy();
}
};
return self;
});
var Gem = Container.expand(function () {
var self = Container.call(this);
self.speed = -12;
self.collected = false;
var gemGraphics = self.attachAsset('gem', {
anchorX: 0.5,
anchorY: 0.5
});
// Add pulsing animation
self.pulseTime = 0;
self.update = function () {
self.x += self.speed;
// Pulsing animation
self.pulseTime += 0.1;
var scale = 0.9 + Math.sin(self.pulseTime) * 0.1;
gemGraphics.scale.set(scale, scale);
// Remove if off screen
if (self.x < -100) {
self.destroy();
}
};
self.collect = function () {
if (self.collected) {
return;
}
self.collected = true;
LK.getSound('collect').play();
// Animate gem collection
tween(gemGraphics, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
// Update game stats
storage.gems = (storage.gems || 0) + 1;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
self.speed = -12;
self.type = 'standard'; // standard, spikes, moving
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.setType = function (newType) {
self.type = newType;
if (newType === 'spikes') {
obstacleGraphics = self.removeChild(obstacleGraphics);
obstacleGraphics = self.attachAsset('spikes', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (newType === 'moving') {
// Add a slight tint to show it's a moving obstacle
obstacleGraphics.tint = 0xff9900;
// Start movement animation
self.startY = self.y;
self.moveRange = 150;
self.moveSpeed = 0.05;
self.moveTime = 0;
}
};
self.update = function () {
self.x += self.speed;
// Handle moving obstacles
if (self.type === 'moving') {
self.moveTime += self.moveSpeed;
self.y = self.startY + Math.sin(self.moveTime) * self.moveRange;
}
// Remove if off screen
if (self.x < -100) {
self.destroy();
}
};
return self;
});
var Particle = Container.expand(function () {
var self = Container.call(this);
var particleGraphics = self.attachAsset('particle', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
});
// Set random velocity
self.velocity = {
x: -5 + Math.random() * 10,
y: -10 + Math.random() * 5
};
self.gravity = 0.5;
self.lifetime = 30 + Math.random() * 30;
self.age = 0;
self.update = function () {
// Apply physics
self.velocity.y += self.gravity;
self.x += self.velocity.x;
self.y += self.velocity.y;
// Age the particle
self.age++;
// Fade out as it ages
particleGraphics.alpha = Math.max(0, 1 - self.age / self.lifetime);
// Destroy when lifetime ends
if (self.age >= self.lifetime) {
self.destroy();
}
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
self.speed = -12;
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.x += self.speed;
// Remove if off screen
if (self.x < -platformGraphics.width) {
self.destroy();
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
self.velocity = {
x: 0,
y: 0
};
self.gravity = 0.8;
self.jumpForce = -20;
self.isJumping = false;
self.isDead = false;
self.isFlying = false;
// Get player avatar color from storage
var playerColor = storage.avatarColor || 0xffa600;
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5,
tint: playerColor
});
self.update = function () {
if (self.isDead) {
return;
}
// Apply gravity if not flying
if (!self.isFlying) {
self.velocity.y += self.gravity;
} else {
// In flying mode, go up slowly
self.velocity.y = -5;
}
// Apply velocity
self.y += self.velocity.y;
// Simple rotation based on velocity
playerGraphics.rotation += 0.05;
// Check floor collision
if (self.y > groundLevel - playerGraphics.height / 2) {
self.y = groundLevel - playerGraphics.height / 2;
self.velocity.y = 0;
self.isJumping = false;
}
};
self.jump = function () {
if (!self.isJumping && !self.isFlying) {
self.velocity.y = self.jumpForce;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.toggleFlying = function () {
self.isFlying = !self.isFlying;
// Change player appearance when flying
if (self.isFlying) {
tween(playerGraphics, {
scaleY: 0.7,
scaleX: 1.2
}, {
duration: 200
});
} else {
tween(playerGraphics, {
scaleY: 1,
scaleX: 1
}, {
duration: 200
});
}
};
self.die = function () {
if (self.isDead) {
return;
}
self.isDead = true;
LK.getSound('crash').play();
// Explosion effect
for (var i = 0; i < 10; i++) {
createParticle(self.x, self.y);
}
// Hide player
playerGraphics.alpha = 0;
// Game over after a short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x331111 // Dark red background
});
/****
* Game Code
****/
// Global variables
var player;
var obstacles = [];
var gems = [];
var platforms = [];
var backgroundFires = [];
var particles = [];
var groundLevel = 2732 - 100; // Ground is 100px from bottom
var score = 0;
var obstacleSpeed = -12;
var obstacleTimer = 0;
var obstacleInterval = 120; // Frames between obstacles
var level = 1;
var gameStarted = false;
var isGameOver = false;
// Game UI elements
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(1.0, 0);
LK.gui.topRight.addChild(scoreText);
var levelText = new Text2('Level: 1', {
size: 80,
fill: 0xFFFFFF
});
levelText.anchor.set(0.0, 0);
LK.gui.topLeft.addChild(levelText);
// Move the level text away from the top left corner (platform menu area)
levelText.x = 120;
levelText.y = 20;
var gemCountText = new Text2('Gems: ' + (storage.gems || 0), {
size: 60,
fill: 0x00FFFF
});
gemCountText.anchor.set(0.5, 0);
LK.gui.top.addChild(gemCountText);
// Create a tap to start message
var startText = new Text2('Tap to Start', {
size: 120,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(startText);
// Create the ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0.5,
anchorY: 0.0,
x: 2048 / 2,
y: groundLevel
}));
// Create the player
player = game.addChild(new Player());
player.x = 500;
player.y = groundLevel - 100;
// Update the obstacle speed based on level
function updateDifficulty() {
// Increase speed as level increases
obstacleSpeed = -12 - level;
// Decrease interval between obstacles as level increases
obstacleInterval = Math.max(60, 120 - level * 5);
// Update all current obstacles and platforms
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].speed = obstacleSpeed;
}
for (var i = 0; i < platforms.length; i++) {
platforms[i].speed = obstacleSpeed;
}
for (var i = 0; i < gems.length; i++) {
gems[i].speed = obstacleSpeed;
}
// Update level text
levelText.setText('Level: ' + level);
}
// Create a new obstacle
function createObstacle() {
var obstacle = new Obstacle();
obstacle.x = 2048 + 100; // Start just off-screen
obstacle.y = groundLevel - obstacle.height / 2;
obstacle.speed = obstacleSpeed;
// Random obstacle type
var type = Math.random();
if (type < 0.3) {
obstacle.setType('spikes');
} else if (type < 0.6 && level > 1) {
obstacle.setType('moving');
// Position moving obstacles higher so they move up and down
obstacle.y -= 150;
}
obstacles.push(obstacle);
game.addChild(obstacle);
// Sometimes add platforms after obstacles
if (Math.random() < 0.4) {
createPlatform(obstacle.x + 350, groundLevel - 200 - Math.random() * 150);
}
// Sometimes add gems
if (Math.random() < 0.3) {
createGem(obstacle.x + 150, obstacle.y - 150);
}
}
// Create a platform
function createPlatform(x, y) {
var platform = new Platform();
platform.x = x || 2048 + 100; // Start just off-screen
platform.y = y || groundLevel - 300;
platform.speed = obstacleSpeed;
platforms.push(platform);
game.addChild(platform);
}
// Create a gem
function createGem(x, y) {
var gem = new Gem();
gem.x = x || 2048 + 100; // Start just off-screen
gem.y = y || groundLevel - 200;
gem.speed = obstacleSpeed;
gems.push(gem);
game.addChild(gem);
}
// Create a background fire
function createBackgroundFire() {
var fire = new BackgroundFire();
fire.x = 2048 + Math.random() * 500;
fire.y = groundLevel + 10; // Slightly below ground level
backgroundFires.push(fire);
game.addChild(fire);
}
// Create a particle
function createParticle(x, y) {
var particle = new Particle();
particle.x = x;
particle.y = y;
particles.push(particle);
game.addChild(particle);
}
// Check collision between player and obstacles
function checkCollisions() {
// Check obstacle collisions
for (var i = 0; i < obstacles.length; i++) {
if (player.intersects(obstacles[i]) && !player.isDead) {
player.die();
return;
}
}
// Check gem collections
for (var i = 0; i < gems.length; i++) {
if (!gems[i].collected && player.intersects(gems[i])) {
gems[i].collect();
score += 10;
updateScore();
}
}
// Check platform collisions
var onPlatform = false;
for (var i = 0; i < platforms.length; i++) {
if (player.intersects(platforms[i]) && player.y < platforms[i].y - 10 && player.velocity.y > 0) {
player.y = platforms[i].y - platforms[i].height / 2 - player.height / 2;
player.velocity.y = 0;
player.isJumping = false;
onPlatform = true;
}
}
}
// Update score display
function updateScore() {
scoreText.setText('Score: ' + score);
gemCountText.setText('Gems: ' + (storage.gems || 0));
// Check for level up
if (score >= level * 100) {
levelUp();
}
// Update high score
if (score > storage.highScore) {
storage.highScore = score;
}
}
// Level up function
function levelUp() {
level++;
// Flash level text
LK.effects.flashObject(levelText, 0xffff00, 500);
// Update difficulty
updateDifficulty();
}
// Start the game
function startGame() {
if (gameStarted) {
return;
}
gameStarted = true;
startText.visible = false;
// Start background music
LK.playMusic('bgmusic', {
fade: {
start: 0,
end: 0.7,
duration: 1000
}
});
// Add initial obstacles and fire effects
createObstacle();
for (var i = 0; i < 5; i++) {
createBackgroundFire();
}
// Start score counter
scoreInterval = LK.setInterval(function () {
if (!player.isDead) {
score++;
updateScore();
}
}, 1000);
}
// Handle game input
game.down = function (x, y, obj) {
if (!gameStarted) {
startGame();
return;
}
// Jump when tapping upper half of screen
if (y < 2732 / 2) {
player.jump();
}
// Toggle flying mode when tapping lower half
else {
player.toggleFlying();
}
};
// Main game update
game.update = function () {
if (!gameStarted) {
return;
}
// Spawn obstacles at intervals
obstacleTimer++;
if (obstacleTimer >= obstacleInterval && !player.isDead) {
createObstacle();
obstacleTimer = 0;
}
// Spawn background fires
if (LK.ticks % 120 === 0 && !player.isDead) {
createBackgroundFire();
}
// Update all game elements
player.update();
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].update();
if (!obstacles[i].parent) {
obstacles.splice(i, 1);
}
}
for (var i = gems.length - 1; i >= 0; i--) {
gems[i].update();
if (!gems[i].parent) {
gems.splice(i, 1);
}
}
for (var i = platforms.length - 1; i >= 0; i--) {
platforms[i].update();
if (!platforms[i].parent) {
platforms.splice(i, 1);
}
}
for (var i = backgroundFires.length - 1; i >= 0; i--) {
backgroundFires[i].update();
if (!backgroundFires[i].parent) {
backgroundFires.splice(i, 1);
}
}
for (var i = particles.length - 1; i >= 0; i--) {
particles[i].update();
if (!particles[i].parent) {
particles.splice(i, 1);
}
}
// Check collisions
if (!player.isDead) {
checkCollisions();
}
};