/**** * Classes ****/ // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = []; obstacleGraphics[0] = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); obstacleGraphics[1] = self.attachAsset('obstacle_2', { anchorX: 0.5, anchorY: 0.5 }); self.currentFrame = 0; // Start with the first frame self.graphics = obstacleGraphics[self.currentFrame]; // No code to insert self.speed = 10; // Initial speed self.acceleration = 0.1; // Acceleration self._move_migrated = function () { self.y += self.speed; // Move obstacle down self.speed += self.acceleration; // Increase speed // Switch frames every 300ms if (LK.ticks % 18 == 0) { self.currentFrame = (self.currentFrame + 1) % 2; self.removeChildren(); self.addChild(obstacleGraphics[self.currentFrame]); } // Correctly scale the obstacle size as it moves down the screen // Correctly scale the obstacle size as it moves down the screen var screenHeight = 2732; // Full screen height for scaling calculation var baseScale = 1.0; // Base scale at the top var targetScale = 1.5; // Target scale at the bottom var progress = self.y / screenHeight; // Progress ratio from top (0) to bottom (1) var scaleFactor = baseScale + (targetScale - baseScale) * progress * 0.5; // Linear interpolation self.scale.set(scaleFactor, scaleFactor); // Apply scale factor uniformly }; }); // Assets will be automatically created based on usage in the code. // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = []; playerGraphics[0] = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); playerGraphics[1] = self.attachAsset('player_2', { anchorX: 0.5, anchorY: 0.5 }); self.direction = 1; // 1 for right, -1 for left self.currentFrame = 0; // Start with the first frame self.baseY = 0; // Initialize baseY self.isPulling = false; // Initialize isPulling self.currentScale = 1.0; // Initialize currentScale self._update_migrated = function () { // Player movement logic self.x += 20 * self.direction; // Increase player speed self.removeChildren(); self.addChild(playerGraphics[self.currentFrame]); // Update graphics to current frame if (self.x < 50) { // Adjust for player's outer edge self.x = 50; self.direction = 1; } else if (self.x > 1998) { // Adjust for player's outer edge self.x = 1998; self.direction = -1; } // Handle animation frames self.handleAnimation(); // Player vertical movement and scaling logic var maxDistance = 450; // Maximum distance from baseY for scaling if (self.isPulling) { // Decrease player's Y position until a maximum of 200 pixels below the baseY is reached if (self.y < self.baseY + maxDistance) { self.y += 10; // Incremental decrease } } else { // Move player back towards baseY at a predefined speed until it reaches baseY if (self.y > self.baseY) { self.y -= 10; // Predefined speed } } // Check for collision with obstacles for (var i = 0; i < obstacles.length; i++) { var playerBounds = self.getBounds(); var obstacleBounds = obstacles[i].getBounds(); if (self.intersects(obstacles[i]) && obstacles[i].y + obstacles[i].height / 2 > self.y - self.height / 2 * self.currentScale && obstacles[i].y - obstacles[i].height / 2 < self.y + self.height / 2 * self.currentScale) { var playerBounds = self.getBounds(); var obstacleBounds = obstacles[i].getBounds(); if (playerBounds.x < obstacleBounds.x + obstacleBounds.width && playerBounds.x + playerBounds.width > obstacleBounds.x && playerBounds.y < obstacleBounds.y + obstacleBounds.height && playerBounds.y + playerBounds.height > obstacleBounds.y) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } } // Calculate the distance from baseY and scale player graphics var distanceFromBaseY = Math.min(self.y - self.baseY, maxDistance); var scale = 1.0 + distanceFromBaseY / maxDistance * 0.3; // Linearly interpolate scale between 100% and 125% self.currentScale = scale; playerGraphics.forEach(function (graphic) { graphic.scale.set(scale, scale); // Apply scale factor uniformly to all player graphics }); }; self.handleAnimation = function () { // Switch frames every 200ms if (LK.ticks % 12 == 0) { self.currentFrame = (self.currentFrame + 1) % 2; self.graphics = playerGraphics[self.currentFrame]; } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Init game with black background }); /**** * Game Code ****/ // Create BackgroundContainer, MidgroundContainer and ForegroundContainer var BackgroundContainer = new Container(); var MidgroundContainer = new Container(); var ForegroundContainer = new Container(); // Add the containers to the game in the correct order game.addChild(BackgroundContainer); game.addChild(MidgroundContainer); game.addChild(ForegroundContainer); BackgroundContainer.handleBackgroundAnimation = function () { // Move the backgrounds down background.y += 10; background2.y += 10; // If the first background has moved off the screen, destroy it and recreate it above the second background if (background.y > 2732 * 1.5) { background.destroy(); background = BackgroundContainer.attachAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: background2.y - 2732, width: 2048, height: 2732 }); } // If the second background has moved off the screen, destroy it and recreate it above the first background if (background2.y > 2732 * 1.5) { background2.destroy(); background2 = BackgroundContainer.attachAsset('background2', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: background.y - 2732, width: 2048, height: 2732 }); } }; var background = BackgroundContainer.attachAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, width: 2048, height: 2732 }); var background2 = BackgroundContainer.attachAsset('background2', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: -2732 / 2, width: 2048, height: 2732 }); // Global variables var player; var obstacles = []; var isFrozen = false; var score = 10; // Initialize the score to 10 var scoreTxt; // Declare fuelConsumptionInterval in global scope for accessibility var fuelConsumptionInterval; // Initialize player function initPlayer() { player = game.addChild(new Player()); player.x = 2048 / 2; // Start position player.y = 2732 * 0.75; player.baseY = player.y; // Set baseY to starting Y position player.isPulling = false; // Set isPulling to false } // Initialize score display function initScoreDisplay() { scoreTxt = new Text2(score.toString(), { size: 150, fill: "#ffffff", align: "center", stroke: "#000000", strokeThickness: 10 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); scoreTxt.y = 10; } // Update score display function updateScoreDisplay() { scoreTxt.setText(score.toString()); } // Generate obstacles function generateObstacle() { var obstacle = new Obstacle(); obstacle.x = Math.random() * (2048 - 600) + 300; // Random width with increased padding obstacle.y = 0; // Start from the top edge obstacles.push(obstacle); game.addChild(obstacle); } // Game tick LK.on('tick', function () { BackgroundContainer.handleBackgroundAnimation(); // Update player player._update_migrated(); if (!isFrozen) { // Move obstacles for (var i = obstacles.length - 1; i >= 0; i--) { obstacles[i]._move_migrated(); // Check collision if (player.intersects(obstacles[i]) && obstacles[i].y + obstacles[i].height / 2 > player.y - player.height / 2 * player.currentScale && obstacles[i].y - obstacles[i].height / 2 < player.y + player.height / 2 * player.currentScale) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } // Remove off-screen obstacles if (obstacles[i].y - obstacles[i].height > 2732) { obstacles[i].destroy(); obstacles.splice(i, 1); score += 5; // Increase score by 5 for every enemy that reaches the bottom updateScoreDisplay(); } } // Generate obstacles if (LK.ticks % Math.max(1, 120 - Math.floor(score / 5)) == 0) { // Every 2 seconds, decreased by score/10 generateObstacle(); } } }); // Initialize game elements function initGame() { score = 10; // Ensure score starts at 10 for each new game initPlayer(); initScoreDisplay(); } initGame(); // Add a down event handler to the game object to set isFrozen to true when the screen is pressed game.down = function (x, y, obj) { console.log("game.down event handler triggered"); console.log("Screen pressed at: ", x, y); isFrozen = true; player.isPulling = true; // Set player.isPulling to true when screen is pressed if (player.y < player.baseY + 500) { // Ensure vertical movement does not start if player's Y position is already 200 pixels below baseY // Start or reset fuel consumption interval on game down event LK.clearInterval(fuelConsumptionInterval); // Clear any existing interval fuelConsumptionInterval = LK.setInterval(function () { // Start a new interval if (score > 0 && isFrozen) { score -= 1; updateScoreDisplay(); } else if (score <= 0) { LK.clearInterval(fuelConsumptionInterval); fuelConsumptionInterval = null; // Reset interval ID LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } else { LK.clearInterval(fuelConsumptionInterval); fuelConsumptionInterval = null; // Reset interval ID } }, 200); } }; // Add an up event handler to the game object to set isFrozen to false when the screen is released game.up = function (x, y, obj) { console.log("game.up event handler triggered"); console.log("Screen released at: ", x, y); isFrozen = false; player.isPulling = false; // Set player.isPulling to false when screen is released LK.clearInterval(fuelConsumptionInterval); fuelConsumptionInterval = null; // Ensure the interval is cleared and reset };
/****
* Classes
****/
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = [];
obstacleGraphics[0] = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
obstacleGraphics[1] = self.attachAsset('obstacle_2', {
anchorX: 0.5,
anchorY: 0.5
});
self.currentFrame = 0; // Start with the first frame
self.graphics = obstacleGraphics[self.currentFrame];
// No code to insert
self.speed = 10; // Initial speed
self.acceleration = 0.1; // Acceleration
self._move_migrated = function () {
self.y += self.speed; // Move obstacle down
self.speed += self.acceleration; // Increase speed
// Switch frames every 300ms
if (LK.ticks % 18 == 0) {
self.currentFrame = (self.currentFrame + 1) % 2;
self.removeChildren();
self.addChild(obstacleGraphics[self.currentFrame]);
}
// Correctly scale the obstacle size as it moves down the screen
// Correctly scale the obstacle size as it moves down the screen
var screenHeight = 2732; // Full screen height for scaling calculation
var baseScale = 1.0; // Base scale at the top
var targetScale = 1.5; // Target scale at the bottom
var progress = self.y / screenHeight; // Progress ratio from top (0) to bottom (1)
var scaleFactor = baseScale + (targetScale - baseScale) * progress * 0.5; // Linear interpolation
self.scale.set(scaleFactor, scaleFactor); // Apply scale factor uniformly
};
});
// Assets will be automatically created based on usage in the code.
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = [];
playerGraphics[0] = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
playerGraphics[1] = self.attachAsset('player_2', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1; // 1 for right, -1 for left
self.currentFrame = 0; // Start with the first frame
self.baseY = 0; // Initialize baseY
self.isPulling = false; // Initialize isPulling
self.currentScale = 1.0; // Initialize currentScale
self._update_migrated = function () {
// Player movement logic
self.x += 20 * self.direction; // Increase player speed
self.removeChildren();
self.addChild(playerGraphics[self.currentFrame]); // Update graphics to current frame
if (self.x < 50) {
// Adjust for player's outer edge
self.x = 50;
self.direction = 1;
} else if (self.x > 1998) {
// Adjust for player's outer edge
self.x = 1998;
self.direction = -1;
}
// Handle animation frames
self.handleAnimation();
// Player vertical movement and scaling logic
var maxDistance = 450; // Maximum distance from baseY for scaling
if (self.isPulling) {
// Decrease player's Y position until a maximum of 200 pixels below the baseY is reached
if (self.y < self.baseY + maxDistance) {
self.y += 10; // Incremental decrease
}
} else {
// Move player back towards baseY at a predefined speed until it reaches baseY
if (self.y > self.baseY) {
self.y -= 10; // Predefined speed
}
}
// Check for collision with obstacles
for (var i = 0; i < obstacles.length; i++) {
var playerBounds = self.getBounds();
var obstacleBounds = obstacles[i].getBounds();
if (self.intersects(obstacles[i]) && obstacles[i].y + obstacles[i].height / 2 > self.y - self.height / 2 * self.currentScale && obstacles[i].y - obstacles[i].height / 2 < self.y + self.height / 2 * self.currentScale) {
var playerBounds = self.getBounds();
var obstacleBounds = obstacles[i].getBounds();
if (playerBounds.x < obstacleBounds.x + obstacleBounds.width && playerBounds.x + playerBounds.width > obstacleBounds.x && playerBounds.y < obstacleBounds.y + obstacleBounds.height && playerBounds.y + playerBounds.height > obstacleBounds.y) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
}
// Calculate the distance from baseY and scale player graphics
var distanceFromBaseY = Math.min(self.y - self.baseY, maxDistance);
var scale = 1.0 + distanceFromBaseY / maxDistance * 0.3; // Linearly interpolate scale between 100% and 125%
self.currentScale = scale;
playerGraphics.forEach(function (graphic) {
graphic.scale.set(scale, scale); // Apply scale factor uniformly to all player graphics
});
};
self.handleAnimation = function () {
// Switch frames every 200ms
if (LK.ticks % 12 == 0) {
self.currentFrame = (self.currentFrame + 1) % 2;
self.graphics = playerGraphics[self.currentFrame];
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Create BackgroundContainer, MidgroundContainer and ForegroundContainer
var BackgroundContainer = new Container();
var MidgroundContainer = new Container();
var ForegroundContainer = new Container();
// Add the containers to the game in the correct order
game.addChild(BackgroundContainer);
game.addChild(MidgroundContainer);
game.addChild(ForegroundContainer);
BackgroundContainer.handleBackgroundAnimation = function () {
// Move the backgrounds down
background.y += 10;
background2.y += 10;
// If the first background has moved off the screen, destroy it and recreate it above the second background
if (background.y > 2732 * 1.5) {
background.destroy();
background = BackgroundContainer.attachAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: background2.y - 2732,
width: 2048,
height: 2732
});
}
// If the second background has moved off the screen, destroy it and recreate it above the first background
if (background2.y > 2732 * 1.5) {
background2.destroy();
background2 = BackgroundContainer.attachAsset('background2', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: background.y - 2732,
width: 2048,
height: 2732
});
}
};
var background = BackgroundContainer.attachAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
width: 2048,
height: 2732
});
var background2 = BackgroundContainer.attachAsset('background2', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: -2732 / 2,
width: 2048,
height: 2732
});
// Global variables
var player;
var obstacles = [];
var isFrozen = false;
var score = 10; // Initialize the score to 10
var scoreTxt;
// Declare fuelConsumptionInterval in global scope for accessibility
var fuelConsumptionInterval;
// Initialize player
function initPlayer() {
player = game.addChild(new Player());
player.x = 2048 / 2; // Start position
player.y = 2732 * 0.75;
player.baseY = player.y; // Set baseY to starting Y position
player.isPulling = false; // Set isPulling to false
}
// Initialize score display
function initScoreDisplay() {
scoreTxt = new Text2(score.toString(), {
size: 150,
fill: "#ffffff",
align: "center",
stroke: "#000000",
strokeThickness: 10
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 10;
}
// Update score display
function updateScoreDisplay() {
scoreTxt.setText(score.toString());
}
// Generate obstacles
function generateObstacle() {
var obstacle = new Obstacle();
obstacle.x = Math.random() * (2048 - 600) + 300; // Random width with increased padding
obstacle.y = 0; // Start from the top edge
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Game tick
LK.on('tick', function () {
BackgroundContainer.handleBackgroundAnimation();
// Update player
player._update_migrated();
if (!isFrozen) {
// Move obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i]._move_migrated();
// Check collision
if (player.intersects(obstacles[i]) && obstacles[i].y + obstacles[i].height / 2 > player.y - player.height / 2 * player.currentScale && obstacles[i].y - obstacles[i].height / 2 < player.y + player.height / 2 * player.currentScale) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
// Remove off-screen obstacles
if (obstacles[i].y - obstacles[i].height > 2732) {
obstacles[i].destroy();
obstacles.splice(i, 1);
score += 5; // Increase score by 5 for every enemy that reaches the bottom
updateScoreDisplay();
}
}
// Generate obstacles
if (LK.ticks % Math.max(1, 120 - Math.floor(score / 5)) == 0) {
// Every 2 seconds, decreased by score/10
generateObstacle();
}
}
});
// Initialize game elements
function initGame() {
score = 10; // Ensure score starts at 10 for each new game
initPlayer();
initScoreDisplay();
}
initGame();
// Add a down event handler to the game object to set isFrozen to true when the screen is pressed
game.down = function (x, y, obj) {
console.log("game.down event handler triggered");
console.log("Screen pressed at: ", x, y);
isFrozen = true;
player.isPulling = true; // Set player.isPulling to true when screen is pressed
if (player.y < player.baseY + 500) {
// Ensure vertical movement does not start if player's Y position is already 200 pixels below baseY
// Start or reset fuel consumption interval on game down event
LK.clearInterval(fuelConsumptionInterval); // Clear any existing interval
fuelConsumptionInterval = LK.setInterval(function () {
// Start a new interval
if (score > 0 && isFrozen) {
score -= 1;
updateScoreDisplay();
} else if (score <= 0) {
LK.clearInterval(fuelConsumptionInterval);
fuelConsumptionInterval = null; // Reset interval ID
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
} else {
LK.clearInterval(fuelConsumptionInterval);
fuelConsumptionInterval = null; // Reset interval ID
}
}, 200);
}
};
// Add an up event handler to the game object to set isFrozen to false when the screen is released
game.up = function (x, y, obj) {
console.log("game.up event handler triggered");
console.log("Screen released at: ", x, y);
isFrozen = false;
player.isPulling = false; // Set player.isPulling to false when screen is released
LK.clearInterval(fuelConsumptionInterval);
fuelConsumptionInterval = null; // Ensure the interval is cleared and reset
};