/****
* Classes
****/
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
self.x -= self.speed;
if (self.x < -50) {
self.destroy();
}
};
});
// Define a class for floating text that appears and fades away
var FloatingText = Container.expand(function () {
var self = Container.call(this);
// Generate random color for the text
var randomColor = Math.floor(Math.random() * 0xFFFFFF);
var text = new Text2('+1', {
size: 120,
// Increased text size from 60 to 120
fill: randomColor // Random color instead of fixed yellow
});
text.anchor.set(0.5, 0.5);
self.addChild(text);
self.lifetime = 0;
self.maxLifetime = 60; // 1 second at 60fps
self.velocityY = -3; // Move upward
self.update = function () {
self.lifetime++;
self.y += self.velocityY;
// Fade out as lifetime increases
self.alpha = 1 - self.lifetime / self.maxLifetime;
// Remove when lifetime is over
if (self.lifetime >= self.maxLifetime) {
self.destroy();
}
};
return self;
});
// Define a class for flying enemies
var FlyingEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('flyingEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 7;
self.amplitude = 100;
self.frequency = 0.03;
self.initialY = 0;
self.angle = Math.random() * Math.PI * 2;
self.passed = false;
self.update = function () {
self.x -= self.speed;
self.y = self.initialY + Math.sin(self.angle) * self.amplitude;
self.angle += self.frequency;
if (self.x < -100) {
self.destroy();
}
};
return self;
});
// Define a class for plant enemies
var PlantEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('plantEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.passed = false;
self.canJump = true;
self.jumpInterval = Math.floor(Math.random() * 100) + 50;
self.jumpCounter = 0;
self.velocityY = 0;
self.isJumping = false;
self.update = function () {
self.x -= self.speed;
// Jump logic
self.jumpCounter++;
if (self.jumpCounter >= self.jumpInterval && self.canJump && !self.isJumping) {
self.isJumping = true;
self.velocityY = -15;
self.jumpCounter = 0;
}
if (self.isJumping) {
self.y += self.velocityY;
self.velocityY += 0.6;
if (self.y >= 2732 / 2) {
self.y = 2732 / 2;
self.isJumping = false;
self.velocityY = 0;
}
}
if (self.x < -100) {
self.destroy();
}
};
return self;
});
//<Assets used in the game will automatically appear here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.jumpHeight = 25;
self.isJumping = false;
self.velocityY = 0;
self.update = function () {
if (self.isJumping) {
self.y += self.velocityY;
self.velocityY += 0.3; // Decreased gravity effect by 30%
if (self.y >= 2732 / 2) {
// Ground level
self.y = 2732 / 2;
self.isJumping = false;
self.velocityY = 0;
}
}
};
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.velocityY = -self.jumpHeight;
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Play background music
LK.playMusic('school');
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
background.x = 0;
background.y = 0;
var background2 = game.addChild(LK.getAsset('background2', {
anchorX: 0,
anchorY: 0
}));
background2.x = 0;
background2.y = 2732 - background2.height; // Position at the bottom of the screen
// Initialize player
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// Initialize enemies
var enemies = [];
var enemySpawnInterval = 100;
var enemySpawnCounter = 0;
var lastEnemyType = -1; // Track the last enemy type that was spawned
var sameTypeCount = 0; // Counter for consecutive same-type enemies
var canSpawn = true; // Flag to control enemy spawning
var lastScoreCheckpoint = 0; // Track the last score milestone for speed increases
var speedMultiplier = 1.0; // Base speed multiplier
// Create a new Text2 object to display the score
var scoreText = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
// Add the score text to the game GUI at the top center of the screen
LK.gui.top.addChild(scoreText);
scoreText.x = 2048 / 2;
scoreText.y = 0;
// Handle game updates
game.update = function () {
player.update();
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval && canSpawn) {
// Check if any enemies are at the screen edge (about to enter)
var enemiesEnteringScreen = false;
for (var i = 0; i < enemies.length; i++) {
if (enemies[i].x >= 2048 - 300) {
// Buffer zone at screen edge
enemiesEnteringScreen = true;
break;
}
}
if (!enemiesEnteringScreen) {
// Randomly choose enemy type
var enemyType = Math.floor(Math.random() * 3);
// Check if we need to avoid the same enemy type
if (enemyType === lastEnemyType) {
sameTypeCount++;
// If we already have 2 of the same type, choose a different type
if (sameTypeCount >= 2) {
do {
enemyType = Math.floor(Math.random() * 3);
} while (enemyType === lastEnemyType);
sameTypeCount = 0;
}
} else {
sameTypeCount = 0;
}
var enemy;
if (enemyType === 0) {
enemy = new Enemy();
enemy.x = 2048;
enemy.y = 2732 / 2;
enemy.speed *= speedMultiplier;
} else if (enemyType === 1) {
enemy = new FlyingEnemy();
enemy.x = 2048;
enemy.y = 2732 / 3; // Flying enemy starts higher
enemy.initialY = enemy.y;
enemy.speed *= speedMultiplier;
} else {
enemy = new PlantEnemy();
enemy.x = 2048;
enemy.y = 2732 / 2;
enemy.speed *= speedMultiplier;
}
// Save the current enemy type as the last one
lastEnemyType = enemyType;
enemy.passedMiddle = false; // Initialize the middle crossing property
enemies.push(enemy);
game.addChild(enemy);
// Randomize the spawn interval for the next enemy
enemySpawnInterval = Math.floor(Math.random() * 150) + 50;
enemySpawnCounter = 0;
// Prevent new enemies from spawning until current one crosses the middle
canSpawn = false;
}
}
// Update floating text elements
for (var k = game.children.length - 1; k >= 0; k--) {
if (game.children[k] instanceof FloatingText) {
game.children[k].update();
}
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
// Check if enemy has just crossed the middle of the screen
if (enemies[j].x < 2048 / 2 && !enemies[j].passedMiddle) {
enemies[j].passedMiddle = true;
// Allow new enemy to spawn when current enemy passes the middle
canSpawn = true;
}
if (player.intersects(enemies[j])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
} else if (player.x > enemies[j].x && !enemies[j].passed) {
enemies[j].passed = true;
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore());
// Check if score is a multiple of 5 and increase speed
var currentScore = LK.getScore();
if (currentScore % 5 === 0 && currentScore > lastScoreCheckpoint) {
lastScoreCheckpoint = currentScore;
speedMultiplier *= 1.1; // Increase speed by 10%
console.log("Speed increased! New multiplier: " + speedMultiplier);
}
// Create floating +1 text
var floatingText = new FloatingText();
floatingText.x = player.x;
floatingText.y = player.y - 100;
game.addChild(floatingText);
}
}
};
// Handle player jump
game.down = function (x, y, obj) {
player.jump();
}; /****
* Classes
****/
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
self.x -= self.speed;
if (self.x < -50) {
self.destroy();
}
};
});
// Define a class for floating text that appears and fades away
var FloatingText = Container.expand(function () {
var self = Container.call(this);
// Generate random color for the text
var randomColor = Math.floor(Math.random() * 0xFFFFFF);
var text = new Text2('+1', {
size: 120,
// Increased text size from 60 to 120
fill: randomColor // Random color instead of fixed yellow
});
text.anchor.set(0.5, 0.5);
self.addChild(text);
self.lifetime = 0;
self.maxLifetime = 60; // 1 second at 60fps
self.velocityY = -3; // Move upward
self.update = function () {
self.lifetime++;
self.y += self.velocityY;
// Fade out as lifetime increases
self.alpha = 1 - self.lifetime / self.maxLifetime;
// Remove when lifetime is over
if (self.lifetime >= self.maxLifetime) {
self.destroy();
}
};
return self;
});
// Define a class for flying enemies
var FlyingEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('flyingEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 7;
self.amplitude = 100;
self.frequency = 0.03;
self.initialY = 0;
self.angle = Math.random() * Math.PI * 2;
self.passed = false;
self.update = function () {
self.x -= self.speed;
self.y = self.initialY + Math.sin(self.angle) * self.amplitude;
self.angle += self.frequency;
if (self.x < -100) {
self.destroy();
}
};
return self;
});
// Define a class for plant enemies
var PlantEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('plantEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.passed = false;
self.canJump = true;
self.jumpInterval = Math.floor(Math.random() * 100) + 50;
self.jumpCounter = 0;
self.velocityY = 0;
self.isJumping = false;
self.update = function () {
self.x -= self.speed;
// Jump logic
self.jumpCounter++;
if (self.jumpCounter >= self.jumpInterval && self.canJump && !self.isJumping) {
self.isJumping = true;
self.velocityY = -15;
self.jumpCounter = 0;
}
if (self.isJumping) {
self.y += self.velocityY;
self.velocityY += 0.6;
if (self.y >= 2732 / 2) {
self.y = 2732 / 2;
self.isJumping = false;
self.velocityY = 0;
}
}
if (self.x < -100) {
self.destroy();
}
};
return self;
});
//<Assets used in the game will automatically appear here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.jumpHeight = 25;
self.isJumping = false;
self.velocityY = 0;
self.update = function () {
if (self.isJumping) {
self.y += self.velocityY;
self.velocityY += 0.3; // Decreased gravity effect by 30%
if (self.y >= 2732 / 2) {
// Ground level
self.y = 2732 / 2;
self.isJumping = false;
self.velocityY = 0;
}
}
};
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.velocityY = -self.jumpHeight;
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Play background music
LK.playMusic('school');
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
background.x = 0;
background.y = 0;
var background2 = game.addChild(LK.getAsset('background2', {
anchorX: 0,
anchorY: 0
}));
background2.x = 0;
background2.y = 2732 - background2.height; // Position at the bottom of the screen
// Initialize player
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// Initialize enemies
var enemies = [];
var enemySpawnInterval = 100;
var enemySpawnCounter = 0;
var lastEnemyType = -1; // Track the last enemy type that was spawned
var sameTypeCount = 0; // Counter for consecutive same-type enemies
var canSpawn = true; // Flag to control enemy spawning
var lastScoreCheckpoint = 0; // Track the last score milestone for speed increases
var speedMultiplier = 1.0; // Base speed multiplier
// Create a new Text2 object to display the score
var scoreText = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
// Add the score text to the game GUI at the top center of the screen
LK.gui.top.addChild(scoreText);
scoreText.x = 2048 / 2;
scoreText.y = 0;
// Handle game updates
game.update = function () {
player.update();
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval && canSpawn) {
// Check if any enemies are at the screen edge (about to enter)
var enemiesEnteringScreen = false;
for (var i = 0; i < enemies.length; i++) {
if (enemies[i].x >= 2048 - 300) {
// Buffer zone at screen edge
enemiesEnteringScreen = true;
break;
}
}
if (!enemiesEnteringScreen) {
// Randomly choose enemy type
var enemyType = Math.floor(Math.random() * 3);
// Check if we need to avoid the same enemy type
if (enemyType === lastEnemyType) {
sameTypeCount++;
// If we already have 2 of the same type, choose a different type
if (sameTypeCount >= 2) {
do {
enemyType = Math.floor(Math.random() * 3);
} while (enemyType === lastEnemyType);
sameTypeCount = 0;
}
} else {
sameTypeCount = 0;
}
var enemy;
if (enemyType === 0) {
enemy = new Enemy();
enemy.x = 2048;
enemy.y = 2732 / 2;
enemy.speed *= speedMultiplier;
} else if (enemyType === 1) {
enemy = new FlyingEnemy();
enemy.x = 2048;
enemy.y = 2732 / 3; // Flying enemy starts higher
enemy.initialY = enemy.y;
enemy.speed *= speedMultiplier;
} else {
enemy = new PlantEnemy();
enemy.x = 2048;
enemy.y = 2732 / 2;
enemy.speed *= speedMultiplier;
}
// Save the current enemy type as the last one
lastEnemyType = enemyType;
enemy.passedMiddle = false; // Initialize the middle crossing property
enemies.push(enemy);
game.addChild(enemy);
// Randomize the spawn interval for the next enemy
enemySpawnInterval = Math.floor(Math.random() * 150) + 50;
enemySpawnCounter = 0;
// Prevent new enemies from spawning until current one crosses the middle
canSpawn = false;
}
}
// Update floating text elements
for (var k = game.children.length - 1; k >= 0; k--) {
if (game.children[k] instanceof FloatingText) {
game.children[k].update();
}
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
// Check if enemy has just crossed the middle of the screen
if (enemies[j].x < 2048 / 2 && !enemies[j].passedMiddle) {
enemies[j].passedMiddle = true;
// Allow new enemy to spawn when current enemy passes the middle
canSpawn = true;
}
if (player.intersects(enemies[j])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
} else if (player.x > enemies[j].x && !enemies[j].passed) {
enemies[j].passed = true;
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore());
// Check if score is a multiple of 5 and increase speed
var currentScore = LK.getScore();
if (currentScore % 5 === 0 && currentScore > lastScoreCheckpoint) {
lastScoreCheckpoint = currentScore;
speedMultiplier *= 1.1; // Increase speed by 10%
console.log("Speed increased! New multiplier: " + speedMultiplier);
}
// Create floating +1 text
var floatingText = new FloatingText();
floatingText.x = player.x;
floatingText.y = player.y - 100;
game.addChild(floatingText);
}
}
};
// Handle player jump
game.down = function (x, y, obj) {
player.jump();
};