User prompt
sağa üzt köşede BetlSrc yazsın
User prompt
health yazısı biraz daha sağa doğru olsun
User prompt
öldükten sonra ilk başladığımız çubukta spawn olsun
User prompt
health bölümünde 3 tane kalp resmi olsun
User prompt
karakter öldüğünde tekrar çubuğun üzerinde spawn olsun
User prompt
yukarıda gösteerilen 3 tane kalp olsun ve her kırmızıya değdiğinde 1 can gitsin
User prompt
biraz dah yükseğe zıplasın
User prompt
zıplama tuşu çalışsın
User prompt
zıplama tuşu çalışsın
User prompt
zıplama ve yana gitme tuşlarını yan yana yap
User prompt
karakter çubuğun üzerinden spawnlansın
User prompt
start above the character bar
User prompt
start above the chracter bar
Code edit (1 edits merged)
Please save this source code
User prompt
Super Jump Adventure
Initial prompt
ı have a mario game
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Button = Container.expand(function () { var self = Container.call(this); // Create button var buttonShape = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5, width: 100, height: 100 }); // Text for button var buttonText = new Text2('', { size: 50, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); // Setup button self.setup = function (text, color) { buttonText.setText(text); buttonShape.tint = color || 0x444444; }; // Event handlers self.down = function (x, y, obj) { buttonShape.alpha = 0.7; if (self.onPress) { self.onPress(); } }; self.up = function (x, y, obj) { buttonShape.alpha = 1; }; return self; }); var Coin = Container.expand(function () { var self = Container.call(this); // Create coin sprite var coinSprite = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); // Add spinning animation self.update = function () { coinSprite.rotation += 0.05; }; // Collect animation self.collect = function () { // Play collection sound LK.getSound('coin').play(); // Animate coin collection tween(self, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); // Create enemy sprite var enemySprite = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); // Physics and behavior properties self.vx = -2; // Initial direction self.patrolDistance = 300; self.startX = 0; // Initialize patrol points self.setup = function (startX) { self.startX = startX; self.leftBound = startX - self.patrolDistance / 2; self.rightBound = startX + self.patrolDistance / 2; self.x = startX; }; // Update enemy behavior self.update = function () { // Move horizontally self.x += self.vx; // Change direction if reached patrol bounds if (self.x <= self.leftBound) { self.vx = Math.abs(self.vx); } else if (self.x >= self.rightBound) { self.vx = -Math.abs(self.vx); } }; return self; }); var HeartDisplay = Container.expand(function () { var self = Container.call(this); var hearts = []; var maxHearts = 3; // Initialize hearts self.init = function () { for (var i = 0; i < maxHearts; i++) { var heart = self.attachAsset('heart', { anchorX: 0.5, anchorY: 0.5, x: i * 50 }); hearts.push(heart); } }; // Update hearts based on current health self.updateHearts = function (health) { for (var i = 0; i < maxHearts; i++) { hearts[i].visible = i < health; } }; return self; }); var Hero = Container.expand(function () { var self = Container.call(this); // Create hero sprite var heroSprite = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); // Physics properties self.vx = 0; self.vy = 0; self.onGround = false; self.jumpForce = -30; self.gravity = 1; self.maxVy = 20; self.speed = 10; self.health = 3; // Flag to track if hero is moving self.isMovingRight = false; self.isMovingLeft = false; // Used to track if jump button is pressed self.isJumping = false; // Update hero physics self.update = function () { // Apply movement based on direction if (self.isMovingRight) { self.vx = self.speed; } else if (self.isMovingLeft) { self.vx = -self.speed; } else { self.vx = 0; } // Try to jump if jump button is pressed if (self.isJumping && self.onGround) { self.jump(); } // Apply gravity if (!self.onGround) { self.vy += self.gravity; if (self.vy > self.maxVy) { self.vy = self.maxVy; } } // Update position self.x += self.vx; self.y += self.vy; // Reset onGround flag every frame // Will be set to true during collision detection if applicable self.onGround = false; }; // Handle jump self.jump = function () { // Check if jump button is pressed or if isJumping flag is set if (self.onGround && self.isJumping) { self.vy = self.jumpForce; self.onGround = false; LK.getSound('jump').play(); } }; // Handle collision with platforms self.handlePlatformCollision = function (platform) { // Get bounding boxes var heroBox = { x: self.x - heroSprite.width / 2, y: self.y - heroSprite.height / 2, width: heroSprite.width, height: heroSprite.height }; var platformBox = { x: platform.x - platform.width / 2, y: platform.y - platform.height / 2, width: platform.width, height: platform.height }; // Calculate overlap var overlapX = Math.max(0, Math.min(heroBox.x + heroBox.width, platformBox.x + platformBox.width) - Math.max(heroBox.x, platformBox.x)); var overlapY = Math.max(0, Math.min(heroBox.y + heroBox.height, platformBox.y + platformBox.height) - Math.max(heroBox.y, platformBox.y)); // Handle collision if there is overlap if (overlapX > 0 && overlapY > 0) { // Determine if collision is more horizontal or vertical if (overlapX > overlapY) { // Vertical collision // Coming from above if (heroBox.y + heroBox.height / 2 < platformBox.y + platformBox.height / 2) { self.y = platformBox.y - heroBox.height / 2; self.vy = 0; self.onGround = true; } // Coming from below else if (self.vy < 0) { self.y = platformBox.y + platformBox.height + heroBox.height / 2; self.vy = 0; } } else { // Horizontal collision if (heroBox.x + heroBox.width / 2 < platformBox.x + platformBox.width / 2) { self.x = platformBox.x - heroBox.width / 2; } else { self.x = platformBox.x + platformBox.width + heroBox.width / 2; } self.vx = 0; } return true; } return false; }; // Handle damage self.takeDamage = function () { if (!self.invulnerable) { self.health--; self.invulnerable = true; // Flash effect LK.effects.flashObject(self, 0xFF0000, 1000); // Make vulnerable again after 1.5 seconds LK.setTimeout(function () { self.invulnerable = false; }, 1500); // Play hit sound LK.getSound('hit').play(); // Update heart display updateUI(); // Check for game over if (self.health <= 0) { LK.showGameOver(); } } }; return self; }); var Platform = Container.expand(function () { var self = Container.call(this); // Create platform sprite var platformSprite = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Always backgroundColor is black }); /**** * Game Code ****/ // Background music // Sound effects // Collectible assets // Character assets // Platform assets // Game state variables var hero; var platforms = []; var enemies = []; var coins = []; var level = 1; var score = 0; var cameraOffset = 0; var gameStarted = false; var leftButton; var rightButton; var jumpButton; // UI elements var scoreTxt; var levelTxt; var healthTxt; var heartDisplay; // Level configuration var levelConfig = { // Platform configurations for different levels platforms: [ // Level 1 [{ x: 300, y: 2500 }, { x: 600, y: 2300 }, { x: 900, y: 2100 }, { x: 1200, y: 2300 }, { x: 1500, y: 2100 }, { x: 1800, y: 1900 }, { x: 300, y: 1700 }, { x: 600, y: 1500 }, { x: 1200, y: 1500 }, { x: 1800, y: 1300 }, { x: 300, y: 1100 }, { x: 600, y: 900 }, { x: 900, y: 700 }, { x: 1200, y: 500 }, { x: 1500, y: 300 }, { x: 1800, y: 100 }]], // Enemy configurations enemies: [ // Level 1 [{ x: 900, y: 2070 }, { x: 1500, y: 2070 }, { x: 600, y: 1470 }, { x: 1200, y: 1470 }, { x: 900, y: 670 }]], // Coin configurations coins: [ // Level 1 [{ x: 300, y: 2450 }, { x: 600, y: 2250 }, { x: 900, y: 2050 }, { x: 1200, y: 2250 }, { x: 1500, y: 2050 }, { x: 1800, y: 1850 }, { x: 300, y: 1650 }, { x: 600, y: 1450 }, { x: 1200, y: 1450 }, { x: 1800, y: 1250 }, { x: 300, y: 1050 }, { x: 600, y: 850 }, { x: 900, y: 650 }, { x: 1200, y: 450 }, { x: 1500, y: 250 }, { x: 1800, y: 50 }]] }; // Initialize level function setupLevel() { // Clear existing objects clearLevel(); // Create ground var ground = new Platform(); ground.x = 2048 / 2; ground.y = 2732 - 40; game.addChild(ground); platforms.push(ground); // Create platforms var levelPlatforms = levelConfig.platforms[level - 1] || levelConfig.platforms[0]; for (var i = 0; i < levelPlatforms.length; i++) { var platform = new Platform(); platform.x = levelPlatforms[i].x; platform.y = levelPlatforms[i].y; game.addChild(platform); platforms.push(platform); } // Create enemies var levelEnemies = levelConfig.enemies[level - 1] || levelConfig.enemies[0]; for (var i = 0; i < levelEnemies.length; i++) { var enemy = new Enemy(); enemy.setup(levelEnemies[i].x); enemy.y = levelEnemies[i].y; game.addChild(enemy); enemies.push(enemy); } // Create coins var levelCoins = levelConfig.coins[level - 1] || levelConfig.coins[0]; for (var i = 0; i < levelCoins.length; i++) { var coin = new Coin(); coin.x = levelCoins[i].x; coin.y = levelCoins[i].y; game.addChild(coin); coins.push(coin); } // Create hero hero = new Hero(); // Store the initial spawn platform for respawn var initialSpawnPlatform = platforms[1] || platforms[0]; // platforms[1] is the first non-ground platform if (initialSpawnPlatform) { hero.x = initialSpawnPlatform.x; hero.y = initialSpawnPlatform.y - 70; } else { hero.x = 200; hero.y = 2400; } game.addChild(hero); // Update score display updateUI(); } // Clear all level objects function clearLevel() { // Remove platforms for (var i = platforms.length - 1; i >= 0; i--) { platforms[i].destroy(); } platforms = []; // Remove enemies for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); } enemies = []; // Remove coins for (var i = coins.length - 1; i >= 0; i--) { coins[i].destroy(); } coins = []; // Remove hero if exists if (hero) { hero.destroy(); hero = null; } } // Update UI displays function updateUI() { scoreTxt.setText("Score: " + score); levelTxt.setText("Level: " + level); healthTxt.setText("Health: " + (hero ? hero.health : 0)); if (heartDisplay && hero) { heartDisplay.updateHearts(hero.health); } } // Setup controls function setupControls() { // Left movement button leftButton = new Button(); leftButton.setup("<", 0x4444FF); leftButton.x = 150; leftButton.y = 2532; leftButton.onPress = function () { hero.isMovingLeft = true; hero.isMovingRight = false; }; leftButton.up = function () { hero.isMovingLeft = false; }; game.addChild(leftButton); // Right movement button rightButton = new Button(); rightButton.setup(">", 0x4444FF); rightButton.x = 300; rightButton.y = 2532; rightButton.onPress = function () { hero.isMovingRight = true; hero.isMovingLeft = false; }; rightButton.up = function () { hero.isMovingRight = false; }; game.addChild(rightButton); // Jump button jumpButton = new Button(); jumpButton.setup("^", 0xFF4444); jumpButton.x = 450; // Position next to the right movement button jumpButton.y = 2532; jumpButton.onPress = function () { hero.isJumping = true; // We don't need to call hero.jump() here, it will be handled in the update loop }; jumpButton.up = function () { hero.isJumping = false; }; game.addChild(jumpButton); } // Setup UI function setupUI() { // Score display scoreTxt = new Text2("Score: 0", { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); // Add 'BetlSrc' label to the top right corner var betlsrcLabel = new Text2("BetlSrc", { size: 60, fill: 0xFFFFFF }); betlsrcLabel.anchor.set(1, 0); betlsrcLabel.x = -20; // Slightly inset from the right edge betlsrcLabel.y = 0; LK.gui.topRight.addChild(betlsrcLabel); // Level display levelTxt = new Text2("Level: 1", { size: 60, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); // Health display healthTxt = new Text2("Health: 3", { size: 60, fill: 0xFFFFFF }); healthTxt.anchor.set(1, 0); LK.gui.topLeft.addChild(healthTxt); healthTxt.x = 250; // Move further right as requested // Heart display heartDisplay = new HeartDisplay(); heartDisplay.x = 200; heartDisplay.y = 100; heartDisplay.init(); LK.gui.topLeft.addChild(heartDisplay); // Make sure hearts are visible and properly spaced heartDisplay.updateHearts(3); } // Initialize game function initGame() { // Set score to zero score = 0; LK.setScore(0); // Setup UI elements setupUI(); // Setup level setupLevel(); // Setup controls setupControls(); // Play background music LK.playMusic('bgmusic', { fade: { start: 0, end: 0.7, duration: 1000 } }); // Mark game as started gameStarted = true; } // Handle collisions function handleCollisions() { // Hero-platform collisions for (var i = 0; i < platforms.length; i++) { hero.handlePlatformCollision(platforms[i]); } // Hero-enemy collisions for (var i = enemies.length - 1; i >= 0; i--) { if (hero.intersects(enemies[i])) { // Check if hero is jumping on enemy from above if (hero.vy > 0 && hero.y < enemies[i].y - 30) { // Destroy enemy enemies[i].destroy(); enemies.splice(i, 1); // Bounce hero hero.vy = hero.jumpForce * 0.6; // Add score score += 100; LK.setScore(score); updateUI(); } else { // Hero takes damage hero.takeDamage(); updateUI(); } } } // Hero-coin collisions for (var i = coins.length - 1; i >= 0; i--) { if (hero.intersects(coins[i])) { // Collect coin coins[i].collect(); coins.splice(i, 1); // Add score score += 10; LK.setScore(score); updateUI(); } } // Check for level completion (all coins collected) if (coins.length === 0) { // Level completed level++; // Check if player completed all levels if (level > levelConfig.platforms.length) { // Game completed LK.showYouWin(); } else { // Setup next level setupLevel(); } } } // Keep hero within bounds function enforceWorldBounds() { // Keep hero within horizontal bounds if (hero.x < 50) { hero.x = 50; } else if (hero.x > 2048 - 50) { hero.x = 2048 - 50; } // Check if hero fell off the bottom if (hero.y > 2732 + 100) { hero.takeDamage(); // Respawn on the initial spawn platform if (typeof initialSpawnPlatform !== "undefined" && initialSpawnPlatform) { hero.x = initialSpawnPlatform.x; hero.y = initialSpawnPlatform.y - 70; } else { // fallback if not set hero.x = 200; hero.y = 2400; } hero.vx = 0; hero.vy = 0; updateUI(); } // Check if hero reached the top (level complete) if (hero.y < 0) { // Level completed level++; // Check if player completed all levels if (level > levelConfig.platforms.length) { // Game completed LK.showYouWin(); } else { // Setup next level setupLevel(); } } } // Handle global touch events game.down = function (x, y, obj) { if (!gameStarted) { initGame(); } }; // Game update loop game.update = function () { if (!gameStarted) { return; } // Update hero if (hero) { hero.update(); } // Update enemies for (var i = 0; i < enemies.length; i++) { enemies[i].update(); } // Update coins for (var i = 0; i < coins.length; i++) { coins[i].update(); } // Handle collisions handleCollisions(); // Enforce world boundaries enforceWorldBounds(); }; // Setup initial "tap to start" message var startText = new Text2("Tap to Start", { size: 100, fill: 0xFFFFFF }); startText.anchor.set(0.5, 0.5); startText.x = 2048 / 2; startText.y = 2732 / 2; game.addChild(startText); // Remove start text when game starts LK.setInterval(function () { if (gameStarted && startText.parent) { startText.destroy(); } }, 100);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Button = Container.expand(function () {
var self = Container.call(this);
// Create button
var buttonShape = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
width: 100,
height: 100
});
// Text for button
var buttonText = new Text2('', {
size: 50,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
// Setup button
self.setup = function (text, color) {
buttonText.setText(text);
buttonShape.tint = color || 0x444444;
};
// Event handlers
self.down = function (x, y, obj) {
buttonShape.alpha = 0.7;
if (self.onPress) {
self.onPress();
}
};
self.up = function (x, y, obj) {
buttonShape.alpha = 1;
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
// Create coin sprite
var coinSprite = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
// Add spinning animation
self.update = function () {
coinSprite.rotation += 0.05;
};
// Collect animation
self.collect = function () {
// Play collection sound
LK.getSound('coin').play();
// Animate coin collection
tween(self, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Create enemy sprite
var enemySprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Physics and behavior properties
self.vx = -2; // Initial direction
self.patrolDistance = 300;
self.startX = 0;
// Initialize patrol points
self.setup = function (startX) {
self.startX = startX;
self.leftBound = startX - self.patrolDistance / 2;
self.rightBound = startX + self.patrolDistance / 2;
self.x = startX;
};
// Update enemy behavior
self.update = function () {
// Move horizontally
self.x += self.vx;
// Change direction if reached patrol bounds
if (self.x <= self.leftBound) {
self.vx = Math.abs(self.vx);
} else if (self.x >= self.rightBound) {
self.vx = -Math.abs(self.vx);
}
};
return self;
});
var HeartDisplay = Container.expand(function () {
var self = Container.call(this);
var hearts = [];
var maxHearts = 3;
// Initialize hearts
self.init = function () {
for (var i = 0; i < maxHearts; i++) {
var heart = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
x: i * 50
});
hearts.push(heart);
}
};
// Update hearts based on current health
self.updateHearts = function (health) {
for (var i = 0; i < maxHearts; i++) {
hearts[i].visible = i < health;
}
};
return self;
});
var Hero = Container.expand(function () {
var self = Container.call(this);
// Create hero sprite
var heroSprite = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
// Physics properties
self.vx = 0;
self.vy = 0;
self.onGround = false;
self.jumpForce = -30;
self.gravity = 1;
self.maxVy = 20;
self.speed = 10;
self.health = 3;
// Flag to track if hero is moving
self.isMovingRight = false;
self.isMovingLeft = false;
// Used to track if jump button is pressed
self.isJumping = false;
// Update hero physics
self.update = function () {
// Apply movement based on direction
if (self.isMovingRight) {
self.vx = self.speed;
} else if (self.isMovingLeft) {
self.vx = -self.speed;
} else {
self.vx = 0;
}
// Try to jump if jump button is pressed
if (self.isJumping && self.onGround) {
self.jump();
}
// Apply gravity
if (!self.onGround) {
self.vy += self.gravity;
if (self.vy > self.maxVy) {
self.vy = self.maxVy;
}
}
// Update position
self.x += self.vx;
self.y += self.vy;
// Reset onGround flag every frame
// Will be set to true during collision detection if applicable
self.onGround = false;
};
// Handle jump
self.jump = function () {
// Check if jump button is pressed or if isJumping flag is set
if (self.onGround && self.isJumping) {
self.vy = self.jumpForce;
self.onGround = false;
LK.getSound('jump').play();
}
};
// Handle collision with platforms
self.handlePlatformCollision = function (platform) {
// Get bounding boxes
var heroBox = {
x: self.x - heroSprite.width / 2,
y: self.y - heroSprite.height / 2,
width: heroSprite.width,
height: heroSprite.height
};
var platformBox = {
x: platform.x - platform.width / 2,
y: platform.y - platform.height / 2,
width: platform.width,
height: platform.height
};
// Calculate overlap
var overlapX = Math.max(0, Math.min(heroBox.x + heroBox.width, platformBox.x + platformBox.width) - Math.max(heroBox.x, platformBox.x));
var overlapY = Math.max(0, Math.min(heroBox.y + heroBox.height, platformBox.y + platformBox.height) - Math.max(heroBox.y, platformBox.y));
// Handle collision if there is overlap
if (overlapX > 0 && overlapY > 0) {
// Determine if collision is more horizontal or vertical
if (overlapX > overlapY) {
// Vertical collision
// Coming from above
if (heroBox.y + heroBox.height / 2 < platformBox.y + platformBox.height / 2) {
self.y = platformBox.y - heroBox.height / 2;
self.vy = 0;
self.onGround = true;
}
// Coming from below
else if (self.vy < 0) {
self.y = platformBox.y + platformBox.height + heroBox.height / 2;
self.vy = 0;
}
} else {
// Horizontal collision
if (heroBox.x + heroBox.width / 2 < platformBox.x + platformBox.width / 2) {
self.x = platformBox.x - heroBox.width / 2;
} else {
self.x = platformBox.x + platformBox.width + heroBox.width / 2;
}
self.vx = 0;
}
return true;
}
return false;
};
// Handle damage
self.takeDamage = function () {
if (!self.invulnerable) {
self.health--;
self.invulnerable = true;
// Flash effect
LK.effects.flashObject(self, 0xFF0000, 1000);
// Make vulnerable again after 1.5 seconds
LK.setTimeout(function () {
self.invulnerable = false;
}, 1500);
// Play hit sound
LK.getSound('hit').play();
// Update heart display
updateUI();
// Check for game over
if (self.health <= 0) {
LK.showGameOver();
}
}
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
// Create platform sprite
var platformSprite = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Always backgroundColor is black
});
/****
* Game Code
****/
// Background music
// Sound effects
// Collectible assets
// Character assets
// Platform assets
// Game state variables
var hero;
var platforms = [];
var enemies = [];
var coins = [];
var level = 1;
var score = 0;
var cameraOffset = 0;
var gameStarted = false;
var leftButton;
var rightButton;
var jumpButton;
// UI elements
var scoreTxt;
var levelTxt;
var healthTxt;
var heartDisplay;
// Level configuration
var levelConfig = {
// Platform configurations for different levels
platforms: [
// Level 1
[{
x: 300,
y: 2500
}, {
x: 600,
y: 2300
}, {
x: 900,
y: 2100
}, {
x: 1200,
y: 2300
}, {
x: 1500,
y: 2100
}, {
x: 1800,
y: 1900
}, {
x: 300,
y: 1700
}, {
x: 600,
y: 1500
}, {
x: 1200,
y: 1500
}, {
x: 1800,
y: 1300
}, {
x: 300,
y: 1100
}, {
x: 600,
y: 900
}, {
x: 900,
y: 700
}, {
x: 1200,
y: 500
}, {
x: 1500,
y: 300
}, {
x: 1800,
y: 100
}]],
// Enemy configurations
enemies: [
// Level 1
[{
x: 900,
y: 2070
}, {
x: 1500,
y: 2070
}, {
x: 600,
y: 1470
}, {
x: 1200,
y: 1470
}, {
x: 900,
y: 670
}]],
// Coin configurations
coins: [
// Level 1
[{
x: 300,
y: 2450
}, {
x: 600,
y: 2250
}, {
x: 900,
y: 2050
}, {
x: 1200,
y: 2250
}, {
x: 1500,
y: 2050
}, {
x: 1800,
y: 1850
}, {
x: 300,
y: 1650
}, {
x: 600,
y: 1450
}, {
x: 1200,
y: 1450
}, {
x: 1800,
y: 1250
}, {
x: 300,
y: 1050
}, {
x: 600,
y: 850
}, {
x: 900,
y: 650
}, {
x: 1200,
y: 450
}, {
x: 1500,
y: 250
}, {
x: 1800,
y: 50
}]]
};
// Initialize level
function setupLevel() {
// Clear existing objects
clearLevel();
// Create ground
var ground = new Platform();
ground.x = 2048 / 2;
ground.y = 2732 - 40;
game.addChild(ground);
platforms.push(ground);
// Create platforms
var levelPlatforms = levelConfig.platforms[level - 1] || levelConfig.platforms[0];
for (var i = 0; i < levelPlatforms.length; i++) {
var platform = new Platform();
platform.x = levelPlatforms[i].x;
platform.y = levelPlatforms[i].y;
game.addChild(platform);
platforms.push(platform);
}
// Create enemies
var levelEnemies = levelConfig.enemies[level - 1] || levelConfig.enemies[0];
for (var i = 0; i < levelEnemies.length; i++) {
var enemy = new Enemy();
enemy.setup(levelEnemies[i].x);
enemy.y = levelEnemies[i].y;
game.addChild(enemy);
enemies.push(enemy);
}
// Create coins
var levelCoins = levelConfig.coins[level - 1] || levelConfig.coins[0];
for (var i = 0; i < levelCoins.length; i++) {
var coin = new Coin();
coin.x = levelCoins[i].x;
coin.y = levelCoins[i].y;
game.addChild(coin);
coins.push(coin);
}
// Create hero
hero = new Hero();
// Store the initial spawn platform for respawn
var initialSpawnPlatform = platforms[1] || platforms[0]; // platforms[1] is the first non-ground platform
if (initialSpawnPlatform) {
hero.x = initialSpawnPlatform.x;
hero.y = initialSpawnPlatform.y - 70;
} else {
hero.x = 200;
hero.y = 2400;
}
game.addChild(hero);
// Update score display
updateUI();
}
// Clear all level objects
function clearLevel() {
// Remove platforms
for (var i = platforms.length - 1; i >= 0; i--) {
platforms[i].destroy();
}
platforms = [];
// Remove enemies
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
}
enemies = [];
// Remove coins
for (var i = coins.length - 1; i >= 0; i--) {
coins[i].destroy();
}
coins = [];
// Remove hero if exists
if (hero) {
hero.destroy();
hero = null;
}
}
// Update UI displays
function updateUI() {
scoreTxt.setText("Score: " + score);
levelTxt.setText("Level: " + level);
healthTxt.setText("Health: " + (hero ? hero.health : 0));
if (heartDisplay && hero) {
heartDisplay.updateHearts(hero.health);
}
}
// Setup controls
function setupControls() {
// Left movement button
leftButton = new Button();
leftButton.setup("<", 0x4444FF);
leftButton.x = 150;
leftButton.y = 2532;
leftButton.onPress = function () {
hero.isMovingLeft = true;
hero.isMovingRight = false;
};
leftButton.up = function () {
hero.isMovingLeft = false;
};
game.addChild(leftButton);
// Right movement button
rightButton = new Button();
rightButton.setup(">", 0x4444FF);
rightButton.x = 300;
rightButton.y = 2532;
rightButton.onPress = function () {
hero.isMovingRight = true;
hero.isMovingLeft = false;
};
rightButton.up = function () {
hero.isMovingRight = false;
};
game.addChild(rightButton);
// Jump button
jumpButton = new Button();
jumpButton.setup("^", 0xFF4444);
jumpButton.x = 450; // Position next to the right movement button
jumpButton.y = 2532;
jumpButton.onPress = function () {
hero.isJumping = true;
// We don't need to call hero.jump() here, it will be handled in the update loop
};
jumpButton.up = function () {
hero.isJumping = false;
};
game.addChild(jumpButton);
}
// Setup UI
function setupUI() {
// Score display
scoreTxt = new Text2("Score: 0", {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
// Add 'BetlSrc' label to the top right corner
var betlsrcLabel = new Text2("BetlSrc", {
size: 60,
fill: 0xFFFFFF
});
betlsrcLabel.anchor.set(1, 0);
betlsrcLabel.x = -20; // Slightly inset from the right edge
betlsrcLabel.y = 0;
LK.gui.topRight.addChild(betlsrcLabel);
// Level display
levelTxt = new Text2("Level: 1", {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
// Health display
healthTxt = new Text2("Health: 3", {
size: 60,
fill: 0xFFFFFF
});
healthTxt.anchor.set(1, 0);
LK.gui.topLeft.addChild(healthTxt);
healthTxt.x = 250; // Move further right as requested
// Heart display
heartDisplay = new HeartDisplay();
heartDisplay.x = 200;
heartDisplay.y = 100;
heartDisplay.init();
LK.gui.topLeft.addChild(heartDisplay);
// Make sure hearts are visible and properly spaced
heartDisplay.updateHearts(3);
}
// Initialize game
function initGame() {
// Set score to zero
score = 0;
LK.setScore(0);
// Setup UI elements
setupUI();
// Setup level
setupLevel();
// Setup controls
setupControls();
// Play background music
LK.playMusic('bgmusic', {
fade: {
start: 0,
end: 0.7,
duration: 1000
}
});
// Mark game as started
gameStarted = true;
}
// Handle collisions
function handleCollisions() {
// Hero-platform collisions
for (var i = 0; i < platforms.length; i++) {
hero.handlePlatformCollision(platforms[i]);
}
// Hero-enemy collisions
for (var i = enemies.length - 1; i >= 0; i--) {
if (hero.intersects(enemies[i])) {
// Check if hero is jumping on enemy from above
if (hero.vy > 0 && hero.y < enemies[i].y - 30) {
// Destroy enemy
enemies[i].destroy();
enemies.splice(i, 1);
// Bounce hero
hero.vy = hero.jumpForce * 0.6;
// Add score
score += 100;
LK.setScore(score);
updateUI();
} else {
// Hero takes damage
hero.takeDamage();
updateUI();
}
}
}
// Hero-coin collisions
for (var i = coins.length - 1; i >= 0; i--) {
if (hero.intersects(coins[i])) {
// Collect coin
coins[i].collect();
coins.splice(i, 1);
// Add score
score += 10;
LK.setScore(score);
updateUI();
}
}
// Check for level completion (all coins collected)
if (coins.length === 0) {
// Level completed
level++;
// Check if player completed all levels
if (level > levelConfig.platforms.length) {
// Game completed
LK.showYouWin();
} else {
// Setup next level
setupLevel();
}
}
}
// Keep hero within bounds
function enforceWorldBounds() {
// Keep hero within horizontal bounds
if (hero.x < 50) {
hero.x = 50;
} else if (hero.x > 2048 - 50) {
hero.x = 2048 - 50;
}
// Check if hero fell off the bottom
if (hero.y > 2732 + 100) {
hero.takeDamage();
// Respawn on the initial spawn platform
if (typeof initialSpawnPlatform !== "undefined" && initialSpawnPlatform) {
hero.x = initialSpawnPlatform.x;
hero.y = initialSpawnPlatform.y - 70;
} else {
// fallback if not set
hero.x = 200;
hero.y = 2400;
}
hero.vx = 0;
hero.vy = 0;
updateUI();
}
// Check if hero reached the top (level complete)
if (hero.y < 0) {
// Level completed
level++;
// Check if player completed all levels
if (level > levelConfig.platforms.length) {
// Game completed
LK.showYouWin();
} else {
// Setup next level
setupLevel();
}
}
}
// Handle global touch events
game.down = function (x, y, obj) {
if (!gameStarted) {
initGame();
}
};
// Game update loop
game.update = function () {
if (!gameStarted) {
return;
}
// Update hero
if (hero) {
hero.update();
}
// Update enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
}
// Update coins
for (var i = 0; i < coins.length; i++) {
coins[i].update();
}
// Handle collisions
handleCollisions();
// Enforce world boundaries
enforceWorldBounds();
};
// Setup initial "tap to start" message
var startText = new Text2("Tap to Start", {
size: 100,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startText.x = 2048 / 2;
startText.y = 2732 / 2;
game.addChild(startText);
// Remove start text when game starts
LK.setInterval(function () {
if (gameStarted && startText.parent) {
startText.destroy();
}
}, 100);