/****
* 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 collectibleGraphics = self.attachAsset('collectible', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = collectibleGraphics.width;
self.height = collectibleGraphics.height;
self.collected = false;
// Add a pulsing animation
function pulse() {
tween(collectibleGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(collectibleGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: pulse
});
}
});
}
pulse();
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('collect').play();
// Animate the collectible when collected
tween(collectibleGraphics, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.visible = false;
}
});
return true;
}
return false;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obstacleGraphics.width;
self.height = obstacleGraphics.height;
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = platformGraphics.width;
self.height = platformGraphics.height;
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 = {
x: 0,
y: 0
};
self.gravity = 0.8;
self.jumpForce = -18;
self.isJumping = false;
self.isDead = false;
self.speed = 8;
self.jump = function () {
if (!self.isJumping && !self.isDead) {
self.velocity.y = self.jumpForce;
self.isJumping = true;
LK.getSound('jump').play();
// Rotate the player when jumping
tween(playerGraphics, {
rotation: Math.PI * 2
}, {
duration: 500,
easing: tween.easeOut
});
}
};
self.die = function () {
if (!self.isDead) {
self.isDead = true;
LK.getSound('death').play();
// Flash the player red
LK.effects.flashObject(self, 0xff0000, 500);
// Show game over after a short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
};
self.invincible = false; // Add invincibility property
self.invincibilityDuration = 1000; // Duration in milliseconds
self.update = function () {
if (self.isDead || self.invincible) {
return;
}
// Apply gravity
self.velocity.y += self.gravity;
// Apply velocity
self.y += self.velocity.y;
self.x += self.speed;
// Check if player fell off the screen
if (self.y > 2732 + 200) {
self.reset(); // Reset player position instead of dying
}
};
self.reset = function () {
self.velocity = {
x: 0,
y: 0
};
self.isJumping = false;
self.isDead = false;
self.x = 250;
self.y = 2732 / 2;
playerGraphics.rotation = 0;
};
return self;
});
var Spike = Container.expand(function () {
var self = Container.call(this);
var spikeGraphics = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 0.5
});
// Make it look more like a spike (rotate to point upward)
spikeGraphics.rotation = Math.PI / 4; // 45 degrees
self.width = spikeGraphics.width;
self.height = spikeGraphics.height;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x34495e
});
/****
* Game Code
****/
// Game variables
var LevelGenerator = function LevelGenerator() {
var self = {};
self.generateLevel = function (difficulty, startX) {
var elements = [];
var x = startX || 500;
var spacing = 300 - difficulty * 20; // Reduce spacing as difficulty increases
var platformCount = 10 + difficulty * 5;
// Generate platforms with obstacles and collectibles
for (var i = 0; i < platformCount; i++) {
// Create a platform
var platform = new Platform();
platform.x = x;
platform.y = 2732 / 2 + 200 + Math.sin(i * 0.4) * 150;
elements.push(platform);
// Randomly add obstacles based on difficulty
if (Math.random() < 0.3 + difficulty * 0.1) {
var obstacle = new Obstacle();
obstacle.x = x;
obstacle.y = platform.y - platform.height / 2 - obstacle.height / 2;
elements.push(obstacle);
}
// Randomly add spikes based on difficulty
if (Math.random() < 0.2 + difficulty * 0.05) {
var spike = new Spike();
spike.x = x + (Math.random() * 100 - 50);
spike.y = platform.y - platform.height / 2 - spike.height / 2;
elements.push(spike);
}
// Randomly add collectibles
if (Math.random() < 0.4) {
var collectible = new Collectible();
collectible.x = x;
collectible.y = platform.y - 120;
elements.push(collectible);
}
// Increase x position for next platform
x += spacing + Math.random() * 100;
}
return {
elements: elements,
endX: x
};
};
return self;
};
var player;
var platforms = [];
var obstacles = [];
var spikes = [];
var collectibles = [];
var levelGenerator;
var currentLevel = 1;
var levelEndX = 0;
var gameStarted = false;
var cameraOffset = 0;
// Setup score text
var scoreTxt = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Setup level text
var levelTxt = new Text2('LEVEL 1', {
size: 80,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
levelTxt.y = 120;
LK.gui.top.addChild(levelTxt);
// Setup instructions
var instructionsTxt = new Text2('TAP TO JUMP', {
size: 80,
fill: 0xFFFFFF
});
instructionsTxt.anchor.set(0.5, 0.5);
instructionsTxt.alpha = 0.8;
LK.gui.center.addChild(instructionsTxt);
// Initialize level generator
levelGenerator = new LevelGenerator();
// Create player
player = new Player();
player.reset();
game.addChild(player);
// Generate first level
function generateNewLevel() {
// Clear existing level elements
for (var i = platforms.length - 1; i >= 0; i--) {
game.removeChild(platforms[i]);
platforms.splice(i, 1);
}
for (var i = obstacles.length - 1; i >= 0; i--) {
game.removeChild(obstacles[i]);
obstacles.splice(i, 1);
}
for (var i = spikes.length - 1; i >= 0; i--) {
game.removeChild(spikes[i]);
spikes.splice(i, 1);
}
for (var i = collectibles.length - 1; i >= 0; i--) {
game.removeChild(collectibles[i]);
collectibles.splice(i, 1);
}
// Generate new level
var level = levelGenerator.generateLevel(currentLevel - 1, 500);
levelEndX = level.endX;
// Add elements to the game
for (var i = 0; i < level.elements.length; i++) {
var element = level.elements[i];
game.addChild(element);
// Add to appropriate array for collision detection
if (element instanceof Platform) {
platforms.push(element);
} else if (element instanceof Obstacle) {
obstacles.push(element);
} else if (element instanceof Spike) {
spikes.push(element);
} else if (element instanceof Collectible) {
collectibles.push(element);
}
}
// Update level text
levelTxt.setText('LEVEL ' + currentLevel);
}
// Check player collisions
function checkCollisions() {
// Check platform collisions
var onGround = false;
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
// Simple collision detection
if (player.x + 40 > platform.x - platform.width / 2 && player.x - 40 < platform.x + platform.width / 2 && player.y + 40 > platform.y - platform.height / 2 && player.y + 40 < platform.y + platform.height / 2 && player.velocity.y > 0) {
player.y = platform.y - platform.height / 2 - 40;
player.velocity.y = 0;
player.isJumping = false;
onGround = true;
}
}
// Check obstacle collisions
for (var i = 0; i < obstacles.length; i++) {
var obstacle = obstacles[i];
if (player.intersects(obstacle) && !player.invincible) {
player.die(); // Trigger player death
player.invincible = true; // Set player to invincible
LK.setTimeout(function () {
// Reset invincibility after duration
player.invincible = false;
}, player.invincibilityDuration);
}
}
// Check spike collisions
for (var i = 0; i < spikes.length; i++) {
var spike = spikes[i];
if (player.intersects(spike) && !player.invincible) {
player.die(); // Trigger player death
player.invincible = true; // Set player to invincible
LK.setTimeout(function () {
// Reset invincibility after duration
player.invincible = false;
}, player.invincibilityDuration);
}
}
// Check collectible collisions
for (var i = 0; i < collectibles.length; i++) {
var collectible = collectibles[i];
if (!collectible.collected && player.intersects(collectible)) {
if (collectible.collect()) {
// Increase score
LK.setScore(LK.getScore() + 10);
scoreTxt.setText(LK.getScore());
}
}
}
// If we're not on ground and not already jumping, start falling
if (!onGround && !player.isJumping) {
player.isJumping = true;
}
// Check if player reached the end of the level
if (player.x > levelEndX - 300) {
// Level complete, generate new level
currentLevel++;
player.reset();
generateNewLevel();
// Show level complete animation
var levelCompleteTxt = new Text2('LEVEL COMPLETE!', {
size: 120,
fill: 0xFFFFFF
});
levelCompleteTxt.anchor.set(0.5, 0.5);
LK.gui.center.addChild(levelCompleteTxt);
tween(levelCompleteTxt, {
alpha: 0
}, {
duration: 1500,
onFinish: function onFinish() {
LK.gui.center.removeChild(levelCompleteTxt);
}
});
}
}
// Camera follow player
function updateCamera() {
// Make the camera follow the player horizontally
cameraOffset = player.x - 500;
// Apply camera offset to all elements
for (var i = 0; i < platforms.length; i++) {
platforms[i].x = platforms[i]._originalX - cameraOffset;
}
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].x = obstacles[i]._originalX - cameraOffset;
}
for (var i = 0; i < spikes.length; i++) {
spikes[i].x = spikes[i]._originalX - cameraOffset;
}
for (var i = 0; i < collectibles.length; i++) {
collectibles[i].x = collectibles[i]._originalX - cameraOffset;
}
}
// Handler for tap/click events
game.down = function (x, y, obj) {
if (!gameStarted) {
gameStarted = true;
instructionsTxt.visible = false;
generateNewLevel();
// Start playing the background music
LK.playMusic('gameMusic');
} else {
player.jump();
}
};
// Main game update function
game.update = function () {
if (!gameStarted) {
return;
}
// Update player
player.update();
// Check collisions
checkCollisions();
// Store original positions for camera offset calculations
if (LK.ticks === 1) {
for (var i = 0; i < platforms.length; i++) {
platforms[i]._originalX = platforms[i].x;
}
for (var i = 0; i < obstacles.length; i++) {
obstacles[i]._originalX = obstacles[i].x;
}
for (var i = 0; i < spikes.length; i++) {
spikes[i]._originalX = spikes[i].x;
}
for (var i = 0; i < collectibles.length; i++) {
collectibles[i]._originalX = collectibles[i].x;
}
}
// Update camera
// updateCamera(); // Uncomment to implement scrolling camera
}; ===================================================================
--- original.js
+++ change.js
@@ -313,10 +313,10 @@
}
// Check obstacle collisions
for (var i = 0; i < obstacles.length; i++) {
var obstacle = obstacles[i];
- if (player.intersects(obstacle)) {
- player.velocity.x = -player.speed; // Push player back instead of dying
+ if (player.intersects(obstacle) && !player.invincible) {
+ player.die(); // Trigger player death
player.invincible = true; // Set player to invincible
LK.setTimeout(function () {
// Reset invincibility after duration
player.invincible = false;
@@ -325,10 +325,10 @@
}
// Check spike collisions
for (var i = 0; i < spikes.length; i++) {
var spike = spikes[i];
- if (player.intersects(spike)) {
- player.velocity.x = -player.speed; // Push player back instead of dying
+ if (player.intersects(spike) && !player.invincible) {
+ player.die(); // Trigger player death
player.invincible = true; // Set player to invincible
LK.setTimeout(function () {
// Reset invincibility after duration
player.invincible = false;