/****
* 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
});
self.speed = 0;
self.init = function (speed) {
self.speed = speed || 10;
// Add rotating animation
tween(coinGraphics, {
rotation: Math.PI * 2
}, {
duration: 1500,
onFinish: function onFinish() {
coinGraphics.rotation = 0;
self.init(self.speed);
}
});
};
self.update = function () {
self.x -= self.speed;
// Remove if off screen
if (self.x < -coinGraphics.width) {
self.destroy();
}
};
return self;
});
var Ground = Container.expand(function () {
var self = Container.call(this);
var groundGraphics = self.attachAsset('ground', {
anchorX: 0,
anchorY: 0
});
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.type = "normal"; // normal, low, high
self.init = function (type, speed) {
self.type = type || "normal";
self.speed = speed || 10;
// Adjust obstacle appearance based on type
if (self.type === "low") {
obstacleGraphics.scaleY = 0.5;
obstacleGraphics.y = obstacleGraphics.height * 0.25;
} else if (self.type === "high") {
obstacleGraphics.y = -obstacleGraphics.height * 0.5;
}
};
self.update = function () {
self.x -= self.speed;
// Remove if off screen
if (self.x < -obstacleGraphics.width) {
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.vSpeed = 0;
self.gravity = 0.8;
self.jumpPower = -20;
self.onGround = false;
self.isSliding = false;
self.isDashing = false;
self.slideTimer = 0;
self.dashTimer = 0;
self.isDoubleJumpEnabled = false;
self.hasDoubleJumped = false;
self.isInvincible = false;
self.invincibleTimer = 0;
self.jump = function () {
if (self.onGround) {
self.vSpeed = self.jumpPower;
self.onGround = false;
LK.getSound('jump').play();
} else if (self.isDoubleJumpEnabled && !self.hasDoubleJumped) {
self.vSpeed = self.jumpPower * 0.8;
self.hasDoubleJumped = true;
LK.getSound('jump').play();
}
};
self.slide = function () {
if (!self.isSliding && self.onGround) {
self.isSliding = true;
self.slideTimer = 45; // 45 frames = 0.75 seconds at 60fps
// Make player half height when sliding
tween(playerGraphics, {
scaleY: 0.5,
y: playerGraphics.height * 0.25
}, {
duration: 200,
easing: tween.easeOut
});
}
};
self.dash = function () {
if (!self.isDashing) {
self.isDashing = true;
self.dashTimer = 20; // 20 frames = 0.33 seconds at 60fps
LK.getSound('powerup_collect').play();
}
};
self.applyDoubleJump = function () {
self.isDoubleJumpEnabled = true;
self.hasDoubleJumped = false;
};
self.applyInvincibility = function () {
self.isInvincible = true;
self.invincibleTimer = 300; // 5 seconds
// Flash effect for invincibility
var flashInterval = LK.setInterval(function () {
playerGraphics.alpha = playerGraphics.alpha === 1 ? 0.4 : 1;
}, 100);
LK.setTimeout(function () {
LK.clearInterval(flashInterval);
playerGraphics.alpha = 1;
}, 5000);
};
self.resetSlide = function () {
self.isSliding = false;
tween(playerGraphics, {
scaleY: 1,
y: 0
}, {
duration: 200,
easing: tween.easeOut
});
};
self.update = function () {
// Apply gravity
self.vSpeed += self.gravity;
self.y += self.vSpeed;
// Handle collision with ground
if (self.y > groundY - playerGraphics.height / 2) {
self.y = groundY - playerGraphics.height / 2;
self.vSpeed = 0;
self.onGround = true;
self.hasDoubleJumped = false;
}
// Handle slide timer
if (self.isSliding) {
self.slideTimer--;
if (self.slideTimer <= 0) {
self.resetSlide();
}
}
// Handle dash timer
if (self.isDashing) {
self.dashTimer--;
if (self.dashTimer <= 0) {
self.isDashing = false;
}
}
// Handle invincibility timer
if (self.isInvincible) {
self.invincibleTimer--;
if (self.invincibleTimer <= 0) {
self.isInvincible = false;
}
}
// Keep player within bounds
if (self.x < 200) {
self.x = 200;
}
if (self.x > 800) {
self.x = 800;
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.type = "doubleJump"; // doubleJump or invincibility
self.init = function (type, speed) {
self.type = type || "doubleJump";
self.speed = speed || 10;
// Different colors for different powerups
if (self.type === "doubleJump") {
powerupGraphics.tint = 0x9b59b6; // Purple
} else if (self.type === "invincibility") {
powerupGraphics.tint = 0xf39c12; // Orange
}
// Add floating animation
tween(self, {
y: self.y - 20
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self, {
y: self.y + 20
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (!self.destroyed) {
self.init(self.type, self.speed);
}
}
});
}
});
};
self.update = function () {
self.x -= self.speed;
// Remove if off screen
if (self.x < -powerupGraphics.width) {
self.destroyed = true;
self.destroy();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game variables
var player;
var obstacles = [];
var coins = [];
var powerups = [];
var ground;
var groundY;
var gameSpeed = 10;
var gameStarted = false;
var score = 0;
var distance = 0;
var coinCount = 0;
var spawnTimer = 0;
var speedIncreaseTimer = 0;
var lastSpawnType = "";
// Setup UI
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
var coinsTxt = new Text2('Coins: 0', {
size: 60,
fill: 0xFFFFFF
});
coinsTxt.anchor.set(0, 0);
coinsTxt.y = 70;
LK.gui.topRight.addChild(coinsTxt);
var promptTxt = new Text2('Tap to Start', {
size: 100,
fill: 0xFFFFFF
});
promptTxt.anchor.set(0.5, 0.5);
LK.gui.center.addChild(promptTxt);
// Initialize game elements
function initGame() {
// Create ground
ground = new Ground();
ground.y = 2732 - 100; // Position at bottom of screen
game.addChild(ground);
groundY = ground.y;
// Create player
player = new Player();
player.x = 400;
player.y = groundY - 75;
game.addChild(player);
// Reset game variables
gameSpeed = 10;
obstacles = [];
coins = [];
powerups = [];
score = 0;
distance = 0;
coinCount = 0;
spawnTimer = 0;
speedIncreaseTimer = 0;
// Update UI
updateScore();
updateCoins();
// Play background music
LK.playMusic('bgmusic', {
loop: true,
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});
}
// Start the game
function startGame() {
gameStarted = true;
promptTxt.visible = false;
}
// Update score display
function updateScore() {
scoreTxt.setText('Score: ' + Math.floor(score));
}
// Update coin display
function updateCoins() {
coinsTxt.setText('Coins: ' + coinCount);
}
// Spawn obstacle
function spawnObstacle() {
var obstacle = new Obstacle();
// Determine obstacle type
var types = ["normal", "low", "high"];
var type = types[Math.floor(Math.random() * types.length)];
// Avoid spawning same type twice in a row
if (type === lastSpawnType && Math.random() > 0.3) {
type = types[(types.indexOf(type) + 1) % types.length];
}
lastSpawnType = type;
obstacle.init(type, gameSpeed);
obstacle.x = 2048 + obstacle.width / 2;
obstacle.y = groundY - obstacle.height / 2;
game.addChild(obstacle);
obstacles.push(obstacle);
}
// Spawn coin
function spawnCoin(x, y) {
var coin = new Coin();
coin.init(gameSpeed);
// If no position specified, use random position
if (x === undefined || y === undefined) {
coin.x = 2048 + coin.width / 2;
// Position coins at different heights
var heightOptions = [groundY - 200,
// Above ground
groundY - 400,
// Higher jump
groundY - 100 // Low position
];
coin.y = heightOptions[Math.floor(Math.random() * heightOptions.length)];
} else {
coin.x = x;
coin.y = y;
}
game.addChild(coin);
coins.push(coin);
}
// Spawn coin line
function spawnCoinLine() {
var baseX = 2048 + 50;
var baseY = groundY - 200 - Math.random() * 200;
for (var i = 0; i < 5; i++) {
spawnCoin(baseX + i * 100, baseY);
}
}
// Spawn power-up
function spawnPowerUp() {
var powerup = new PowerUp();
// Randomly choose power-up type
var type = Math.random() > 0.5 ? "doubleJump" : "invincibility";
powerup.init(type, gameSpeed);
powerup.x = 2048 + powerup.width / 2;
powerup.y = groundY - 300 - Math.random() * 100;
game.addChild(powerup);
powerups.push(powerup);
}
// Handle player collision with obstacles
function checkCollisions() {
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (player.intersects(obstacle) && !player.isInvincible) {
// Game over
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
LK.setScore(Math.floor(score));
LK.showGameOver();
return;
}
}
// Check coin collisions
for (var j = coins.length - 1; j >= 0; j--) {
var coin = coins[j];
if (player.intersects(coin)) {
// Collect coin
LK.getSound('coin_collect').play();
coinCount++;
score += 10;
updateCoins();
updateScore();
coin.destroy();
coins.splice(j, 1);
}
}
// Check power-up collisions
for (var k = powerups.length - 1; k >= 0; k--) {
var powerup = powerups[k];
if (player.intersects(powerup)) {
// Apply power-up effect
LK.getSound('powerup_collect').play();
if (powerup.type === "doubleJump") {
player.applyDoubleJump();
} else if (powerup.type === "invincibility") {
player.applyInvincibility();
}
score += 25;
updateScore();
powerup.destroyed = true;
powerup.destroy();
powerups.splice(k, 1);
}
}
}
// Handle player input
game.down = function (x, y, obj) {
if (!gameStarted) {
startGame();
return;
}
// Detect tap position
if (y < groundY - 400) {
// Upper screen - Jump
player.jump();
} else if (y > groundY - 200) {
// Lower screen - Slide
player.slide();
} else {
// Middle screen - Dash
player.dash();
}
};
// Update game state
game.update = function () {
if (!gameStarted) {
if (!ground) {
initGame();
}
return;
}
// Update player
player.update();
// Update all obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].update();
// Remove if destroyed
if (obstacles[i].destroyed) {
obstacles.splice(i, 1);
}
}
// Update all coins
for (var j = coins.length - 1; j >= 0; j--) {
coins[j].update();
// Remove if destroyed
if (coins[j].destroyed) {
coins.splice(j, 1);
}
}
// Update all power-ups
for (var k = powerups.length - 1; k >= 0; k--) {
powerups[k].update();
// Remove if destroyed
if (powerups[k].destroyed) {
powerups.splice(k, 1);
}
}
// Check for collisions
checkCollisions();
// Spawn logic
spawnTimer++;
// Spawn obstacle every 70-100 frames (depending on game speed)
var spawnRate = Math.max(100 - gameSpeed, 70);
if (spawnTimer >= spawnRate) {
spawnTimer = 0;
// Determine what to spawn
var rand = Math.random();
if (rand < 0.6) {
// 60% chance for obstacle
spawnObstacle();
} else if (rand < 0.9) {
// 30% chance for coin line
spawnCoinLine();
} else {
// 10% chance for power-up
spawnPowerUp();
}
}
// Increase game speed over time
speedIncreaseTimer++;
if (speedIncreaseTimer >= 300) {
// Every 5 seconds
speedIncreaseTimer = 0;
gameSpeed += 0.5;
// Update speed of all moving objects
for (var o = 0; o < obstacles.length; o++) {
obstacles[o].speed = gameSpeed;
}
for (var c = 0; c < coins.length; c++) {
coins[c].speed = gameSpeed;
}
for (var p = 0; p < powerups.length; p++) {
powerups[p].speed = gameSpeed;
}
}
// Update score based on distance
distance += gameSpeed / 60;
score = distance * 10;
// Update score display every 10 frames
if (LK.ticks % 10 === 0) {
updateScore();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,537 @@
-/****
+/****
+* 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
+ });
+ self.speed = 0;
+ self.init = function (speed) {
+ self.speed = speed || 10;
+ // Add rotating animation
+ tween(coinGraphics, {
+ rotation: Math.PI * 2
+ }, {
+ duration: 1500,
+ onFinish: function onFinish() {
+ coinGraphics.rotation = 0;
+ self.init(self.speed);
+ }
+ });
+ };
+ self.update = function () {
+ self.x -= self.speed;
+ // Remove if off screen
+ if (self.x < -coinGraphics.width) {
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Ground = Container.expand(function () {
+ var self = Container.call(this);
+ var groundGraphics = self.attachAsset('ground', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0;
+ self.type = "normal"; // normal, low, high
+ self.init = function (type, speed) {
+ self.type = type || "normal";
+ self.speed = speed || 10;
+ // Adjust obstacle appearance based on type
+ if (self.type === "low") {
+ obstacleGraphics.scaleY = 0.5;
+ obstacleGraphics.y = obstacleGraphics.height * 0.25;
+ } else if (self.type === "high") {
+ obstacleGraphics.y = -obstacleGraphics.height * 0.5;
+ }
+ };
+ self.update = function () {
+ self.x -= self.speed;
+ // Remove if off screen
+ if (self.x < -obstacleGraphics.width) {
+ 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.vSpeed = 0;
+ self.gravity = 0.8;
+ self.jumpPower = -20;
+ self.onGround = false;
+ self.isSliding = false;
+ self.isDashing = false;
+ self.slideTimer = 0;
+ self.dashTimer = 0;
+ self.isDoubleJumpEnabled = false;
+ self.hasDoubleJumped = false;
+ self.isInvincible = false;
+ self.invincibleTimer = 0;
+ self.jump = function () {
+ if (self.onGround) {
+ self.vSpeed = self.jumpPower;
+ self.onGround = false;
+ LK.getSound('jump').play();
+ } else if (self.isDoubleJumpEnabled && !self.hasDoubleJumped) {
+ self.vSpeed = self.jumpPower * 0.8;
+ self.hasDoubleJumped = true;
+ LK.getSound('jump').play();
+ }
+ };
+ self.slide = function () {
+ if (!self.isSliding && self.onGround) {
+ self.isSliding = true;
+ self.slideTimer = 45; // 45 frames = 0.75 seconds at 60fps
+ // Make player half height when sliding
+ tween(playerGraphics, {
+ scaleY: 0.5,
+ y: playerGraphics.height * 0.25
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ }
+ };
+ self.dash = function () {
+ if (!self.isDashing) {
+ self.isDashing = true;
+ self.dashTimer = 20; // 20 frames = 0.33 seconds at 60fps
+ LK.getSound('powerup_collect').play();
+ }
+ };
+ self.applyDoubleJump = function () {
+ self.isDoubleJumpEnabled = true;
+ self.hasDoubleJumped = false;
+ };
+ self.applyInvincibility = function () {
+ self.isInvincible = true;
+ self.invincibleTimer = 300; // 5 seconds
+ // Flash effect for invincibility
+ var flashInterval = LK.setInterval(function () {
+ playerGraphics.alpha = playerGraphics.alpha === 1 ? 0.4 : 1;
+ }, 100);
+ LK.setTimeout(function () {
+ LK.clearInterval(flashInterval);
+ playerGraphics.alpha = 1;
+ }, 5000);
+ };
+ self.resetSlide = function () {
+ self.isSliding = false;
+ tween(playerGraphics, {
+ scaleY: 1,
+ y: 0
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ };
+ self.update = function () {
+ // Apply gravity
+ self.vSpeed += self.gravity;
+ self.y += self.vSpeed;
+ // Handle collision with ground
+ if (self.y > groundY - playerGraphics.height / 2) {
+ self.y = groundY - playerGraphics.height / 2;
+ self.vSpeed = 0;
+ self.onGround = true;
+ self.hasDoubleJumped = false;
+ }
+ // Handle slide timer
+ if (self.isSliding) {
+ self.slideTimer--;
+ if (self.slideTimer <= 0) {
+ self.resetSlide();
+ }
+ }
+ // Handle dash timer
+ if (self.isDashing) {
+ self.dashTimer--;
+ if (self.dashTimer <= 0) {
+ self.isDashing = false;
+ }
+ }
+ // Handle invincibility timer
+ if (self.isInvincible) {
+ self.invincibleTimer--;
+ if (self.invincibleTimer <= 0) {
+ self.isInvincible = false;
+ }
+ }
+ // Keep player within bounds
+ if (self.x < 200) {
+ self.x = 200;
+ }
+ if (self.x > 800) {
+ self.x = 800;
+ }
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerupGraphics = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0;
+ self.type = "doubleJump"; // doubleJump or invincibility
+ self.init = function (type, speed) {
+ self.type = type || "doubleJump";
+ self.speed = speed || 10;
+ // Different colors for different powerups
+ if (self.type === "doubleJump") {
+ powerupGraphics.tint = 0x9b59b6; // Purple
+ } else if (self.type === "invincibility") {
+ powerupGraphics.tint = 0xf39c12; // Orange
+ }
+ // Add floating animation
+ tween(self, {
+ y: self.y - 20
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ y: self.y + 20
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ if (!self.destroyed) {
+ self.init(self.type, self.speed);
+ }
+ }
+ });
+ }
+ });
+ };
+ self.update = function () {
+ self.x -= self.speed;
+ // Remove if off screen
+ if (self.x < -powerupGraphics.width) {
+ self.destroyed = true;
+ self.destroy();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB // Sky blue background
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var obstacles = [];
+var coins = [];
+var powerups = [];
+var ground;
+var groundY;
+var gameSpeed = 10;
+var gameStarted = false;
+var score = 0;
+var distance = 0;
+var coinCount = 0;
+var spawnTimer = 0;
+var speedIncreaseTimer = 0;
+var lastSpawnType = "";
+// Setup UI
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreTxt);
+var coinsTxt = new Text2('Coins: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+coinsTxt.anchor.set(0, 0);
+coinsTxt.y = 70;
+LK.gui.topRight.addChild(coinsTxt);
+var promptTxt = new Text2('Tap to Start', {
+ size: 100,
+ fill: 0xFFFFFF
+});
+promptTxt.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(promptTxt);
+// Initialize game elements
+function initGame() {
+ // Create ground
+ ground = new Ground();
+ ground.y = 2732 - 100; // Position at bottom of screen
+ game.addChild(ground);
+ groundY = ground.y;
+ // Create player
+ player = new Player();
+ player.x = 400;
+ player.y = groundY - 75;
+ game.addChild(player);
+ // Reset game variables
+ gameSpeed = 10;
+ obstacles = [];
+ coins = [];
+ powerups = [];
+ score = 0;
+ distance = 0;
+ coinCount = 0;
+ spawnTimer = 0;
+ speedIncreaseTimer = 0;
+ // Update UI
+ updateScore();
+ updateCoins();
+ // Play background music
+ LK.playMusic('bgmusic', {
+ loop: true,
+ fade: {
+ start: 0,
+ end: 0.4,
+ duration: 1000
+ }
+ });
+}
+// Start the game
+function startGame() {
+ gameStarted = true;
+ promptTxt.visible = false;
+}
+// Update score display
+function updateScore() {
+ scoreTxt.setText('Score: ' + Math.floor(score));
+}
+// Update coin display
+function updateCoins() {
+ coinsTxt.setText('Coins: ' + coinCount);
+}
+// Spawn obstacle
+function spawnObstacle() {
+ var obstacle = new Obstacle();
+ // Determine obstacle type
+ var types = ["normal", "low", "high"];
+ var type = types[Math.floor(Math.random() * types.length)];
+ // Avoid spawning same type twice in a row
+ if (type === lastSpawnType && Math.random() > 0.3) {
+ type = types[(types.indexOf(type) + 1) % types.length];
+ }
+ lastSpawnType = type;
+ obstacle.init(type, gameSpeed);
+ obstacle.x = 2048 + obstacle.width / 2;
+ obstacle.y = groundY - obstacle.height / 2;
+ game.addChild(obstacle);
+ obstacles.push(obstacle);
+}
+// Spawn coin
+function spawnCoin(x, y) {
+ var coin = new Coin();
+ coin.init(gameSpeed);
+ // If no position specified, use random position
+ if (x === undefined || y === undefined) {
+ coin.x = 2048 + coin.width / 2;
+ // Position coins at different heights
+ var heightOptions = [groundY - 200,
+ // Above ground
+ groundY - 400,
+ // Higher jump
+ groundY - 100 // Low position
+ ];
+ coin.y = heightOptions[Math.floor(Math.random() * heightOptions.length)];
+ } else {
+ coin.x = x;
+ coin.y = y;
+ }
+ game.addChild(coin);
+ coins.push(coin);
+}
+// Spawn coin line
+function spawnCoinLine() {
+ var baseX = 2048 + 50;
+ var baseY = groundY - 200 - Math.random() * 200;
+ for (var i = 0; i < 5; i++) {
+ spawnCoin(baseX + i * 100, baseY);
+ }
+}
+// Spawn power-up
+function spawnPowerUp() {
+ var powerup = new PowerUp();
+ // Randomly choose power-up type
+ var type = Math.random() > 0.5 ? "doubleJump" : "invincibility";
+ powerup.init(type, gameSpeed);
+ powerup.x = 2048 + powerup.width / 2;
+ powerup.y = groundY - 300 - Math.random() * 100;
+ game.addChild(powerup);
+ powerups.push(powerup);
+}
+// Handle player collision with obstacles
+function checkCollisions() {
+ // Check obstacle collisions
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (player.intersects(obstacle) && !player.isInvincible) {
+ // Game over
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ LK.setScore(Math.floor(score));
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Check coin collisions
+ for (var j = coins.length - 1; j >= 0; j--) {
+ var coin = coins[j];
+ if (player.intersects(coin)) {
+ // Collect coin
+ LK.getSound('coin_collect').play();
+ coinCount++;
+ score += 10;
+ updateCoins();
+ updateScore();
+ coin.destroy();
+ coins.splice(j, 1);
+ }
+ }
+ // Check power-up collisions
+ for (var k = powerups.length - 1; k >= 0; k--) {
+ var powerup = powerups[k];
+ if (player.intersects(powerup)) {
+ // Apply power-up effect
+ LK.getSound('powerup_collect').play();
+ if (powerup.type === "doubleJump") {
+ player.applyDoubleJump();
+ } else if (powerup.type === "invincibility") {
+ player.applyInvincibility();
+ }
+ score += 25;
+ updateScore();
+ powerup.destroyed = true;
+ powerup.destroy();
+ powerups.splice(k, 1);
+ }
+ }
+}
+// Handle player input
+game.down = function (x, y, obj) {
+ if (!gameStarted) {
+ startGame();
+ return;
+ }
+ // Detect tap position
+ if (y < groundY - 400) {
+ // Upper screen - Jump
+ player.jump();
+ } else if (y > groundY - 200) {
+ // Lower screen - Slide
+ player.slide();
+ } else {
+ // Middle screen - Dash
+ player.dash();
+ }
+};
+// Update game state
+game.update = function () {
+ if (!gameStarted) {
+ if (!ground) {
+ initGame();
+ }
+ return;
+ }
+ // Update player
+ player.update();
+ // Update all obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ obstacles[i].update();
+ // Remove if destroyed
+ if (obstacles[i].destroyed) {
+ obstacles.splice(i, 1);
+ }
+ }
+ // Update all coins
+ for (var j = coins.length - 1; j >= 0; j--) {
+ coins[j].update();
+ // Remove if destroyed
+ if (coins[j].destroyed) {
+ coins.splice(j, 1);
+ }
+ }
+ // Update all power-ups
+ for (var k = powerups.length - 1; k >= 0; k--) {
+ powerups[k].update();
+ // Remove if destroyed
+ if (powerups[k].destroyed) {
+ powerups.splice(k, 1);
+ }
+ }
+ // Check for collisions
+ checkCollisions();
+ // Spawn logic
+ spawnTimer++;
+ // Spawn obstacle every 70-100 frames (depending on game speed)
+ var spawnRate = Math.max(100 - gameSpeed, 70);
+ if (spawnTimer >= spawnRate) {
+ spawnTimer = 0;
+ // Determine what to spawn
+ var rand = Math.random();
+ if (rand < 0.6) {
+ // 60% chance for obstacle
+ spawnObstacle();
+ } else if (rand < 0.9) {
+ // 30% chance for coin line
+ spawnCoinLine();
+ } else {
+ // 10% chance for power-up
+ spawnPowerUp();
+ }
+ }
+ // Increase game speed over time
+ speedIncreaseTimer++;
+ if (speedIncreaseTimer >= 300) {
+ // Every 5 seconds
+ speedIncreaseTimer = 0;
+ gameSpeed += 0.5;
+ // Update speed of all moving objects
+ for (var o = 0; o < obstacles.length; o++) {
+ obstacles[o].speed = gameSpeed;
+ }
+ for (var c = 0; c < coins.length; c++) {
+ coins[c].speed = gameSpeed;
+ }
+ for (var p = 0; p < powerups.length; p++) {
+ powerups[p].speed = gameSpeed;
+ }
+ }
+ // Update score based on distance
+ distance += gameSpeed / 60;
+ score = distance * 10;
+ // Update score display every 10 frames
+ if (LK.ticks % 10 === 0) {
+ updateScore();
+ }
+};
\ No newline at end of file