Code edit (1 edits merged)
Please save this source code
User prompt
shoot the stars only if enemies clicked by mouse and let the click on the screen for movement of the player ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Add shot for the ninja to shoot enemies 'star' asset . ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
fix ladder collision so the player can climb it, it stuck before it!
User prompt
reduce player health by 10 when touched by enemies.
User prompt
Add healthbar for ninja player 100/100 on the top left side of the screen, add healthbar for enemies above them like a small bar.
User prompt
Import of asset
User prompt
Import of asset
User prompt
Import of asset
User prompt
Import of asset
User prompt
the player can't reach the ladders!
User prompt
The edges collisions of platforms are thick make them thin a bit.
Code edit (9 edits merged)
Please save this source code
User prompt
make sur the player doesn't out from platforms only by ladder, increase speed of climbing ladder, change climbing to be a movement by hold to move player not by click.
Code edit (1 edits merged)
Please save this source code
User prompt
Add more distance for the climbing movement of the player on ladders, don't let it out from any terrain by any movement vertical or horizontal V/H
User prompt
let the player step on the other platforms like before to collect coins in it, it stuck on their edges. and the movement when climbing on ladders is slow so add some speed for that.
User prompt
remove diagonal movement let only vertical or horizontal when holding mouse button.
User prompt
add vertical movment for the player it can't go up to the ladder!
User prompt
let the player climb the ladder when reach it!
User prompt
fix the player after finishing distance of ladder it outs and continue moving till out from the screen! it must step on the terrains when finishing climbing the ladder not to continue going up!.
User prompt
Limit the distance of player movement to be in the terrains or in ladder only so it will not out of it or from the screen, the enemies must not change their area from terrain to another, let 4 enemies only each one in its area and they can't teleport to another terrain, the enemies can move horizontal and add vertical movement tow.
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var gamePos = game.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 253
Code edit (1 edits merged)
Please save this source code
User prompt
Platform Climber
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
// Gentle floating animation
self.floatOffset = 0;
self.originalY = 0;
self.update = function () {
if (!self.collected) {
self.floatOffset += 0.1;
self.y = self.originalY + Math.sin(self.floatOffset) * 5;
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 1
});
self.speed = 1.5;
self.direction = 1;
self.verticalSpeed = 1;
self.verticalDirection = 1;
self.platformBounds = {
left: 0,
right: 500,
top: 0,
bottom: 0
};
self.assignedPlatform = 0;
self.maxHealth = 50;
self.health = 50;
// Create health bar background
self.healthBarBg = self.attachAsset('enemyHealthBarBg', {
anchorX: 0.5,
anchorY: 1
});
self.healthBarBg.x = 0;
self.healthBarBg.y = -120;
// Create health bar
self.healthBar = self.attachAsset('enemyHealthBar', {
anchorX: 0.5,
anchorY: 1
});
self.healthBar.x = 0;
self.healthBar.y = -120;
self.updateHealthBar = function () {
var healthPercent = self.health / self.maxHealth;
self.healthBar.width = 60 * healthPercent;
if (healthPercent > 0.6) {
self.healthBar.tint = 0x00ff00;
} else if (healthPercent > 0.3) {
self.healthBar.tint = 0xffff00;
} else {
self.healthBar.tint = 0xff0000;
}
};
self.update = function () {
// Horizontal movement
self.x += self.speed * self.direction;
// Bounce off platform edges horizontally
if (self.x <= self.platformBounds.left || self.x >= self.platformBounds.right) {
self.direction *= -1;
}
// Vertical movement within platform area
self.y += self.verticalSpeed * self.verticalDirection;
// Bounce off platform edges vertically
if (self.y <= self.platformBounds.top || self.y >= self.platformBounds.bottom) {
self.verticalDirection *= -1;
}
};
return self;
});
var Ladder = Container.expand(function () {
var self = Container.call(this);
var ladderGraphics = self.attachAsset('ladder', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 1
});
self.speed = 7;
self.climbSpeed = 10;
self.isClimbing = false;
self.currentPlatform = null;
self.targetY = 0;
self.maxHealth = 100;
self.health = 100;
self.lastShot = 0;
self.shootCooldown = 30; // 30 ticks = 0.5 seconds
self.update = function () {
// Handle climbing movement
if (self.isClimbing) {
if (Math.abs(self.y - self.targetY) > 8) {
// Increased from 8 to 20 for more climbing distance
if (self.y > self.targetY) {
self.y -= self.climbSpeed;
} else {
self.y += self.climbSpeed;
}
// Ensure player doesn't go beyond terrain boundaries while climbing
self.y = Math.max(100, Math.min(2632, self.y));
} else {
// Snap exactly to target platform position
self.y = self.targetY;
self.isClimbing = false;
// Clear any movement flags to prevent continued movement
moveUp = false;
moveDown = false;
}
} else {
// Player can now climb ladders freely with hold-to-move controls
// No automatic climbing logic needed here
}
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 30;
self.targetX = 0;
self.targetY = 0;
self.active = true;
self.shootAt = function (targetX, targetY) {
self.targetX = targetX;
self.targetY = targetY;
// Calculate distance for animation duration
var distance = Math.sqrt(Math.pow(targetX - self.x, 2) + Math.pow(targetY - self.y, 2));
var duration = distance * 10; // Adjust speed by changing multiplier
// Use tween to animate star to target
tween(self, {
x: targetX,
y: targetY,
rotation: Math.PI * 4
}, {
duration: duration,
easing: tween.linear,
onFinish: function onFinish() {
self.active = false;
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var currentLevel = 1;
var coinsCollected = 0;
var totalCoins = 5;
var platforms = [];
var ladders = [];
var coins = [];
var enemies = [];
var stars = [];
var player;
// Platform positions (central hub + 4 outer platforms in 2x2 grid)
var platformPositions = [{
x: 1024,
y: 1366
},
// Center platform
{
x: 524,
y: 922
},
// Top-left
{
x: 1524,
y: 922
},
// Top-right
{
x: 524,
y: 1800
},
// Bottom-left
{
x: 1524,
y: 1800
} // Bottom-right
];
// Add background
var background = game.attachAsset('background1', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Create platforms
for (var i = 0; i < platformPositions.length; i++) {
var platform = new Platform();
platform.x = platformPositions[i].x;
platform.y = platformPositions[i].y;
platforms.push(platform);
game.addChild(platform);
}
// Create ladders connecting platforms
var ladderConnections = [{
from: 0,
to: 1
},
// Center to top-left
{
from: 0,
to: 2
},
// Center to top-right
{
from: 0,
to: 3
},
// Center to bottom-left
{
from: 0,
to: 4
} // Center to bottom-right
];
for (var i = 0; i < ladderConnections.length; i++) {
var connection = ladderConnections[i];
var fromPlatform = platforms[connection.from];
var toPlatform = platforms[connection.to];
var ladder = new Ladder();
ladder.x = (fromPlatform.x + toPlatform.x) / 2;
ladder.y = (fromPlatform.y + toPlatform.y) / 2;
ladders.push(ladder);
game.addChild(ladder);
}
// Create coins on each platform
for (var i = 0; i < platforms.length; i++) {
var coin = new Coin();
coin.x = platforms[i].x;
coin.y = platforms[i].y - 50;
coin.originalY = coin.y;
coins.push(coin);
game.addChild(coin);
}
// Create player
player = new Player();
player.x = platforms[0].x; // Start on center platform
player.y = platforms[0].y;
player.currentPlatform = 0;
game.addChild(player);
// Create enemies based on level
function spawnEnemies() {
// Clear existing enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].destroy();
}
enemies = [];
// Spawn exactly 4 enemies, one on each outer platform (excluding center platform at index 0)
for (var i = 1; i < platforms.length; i++) {
var enemy = new Enemy();
enemy.x = platforms[i].x;
enemy.y = platforms[i].y;
enemy.assignedPlatform = i;
// Set platform boundaries to keep enemy confined to its platform
enemy.platformBounds.left = platforms[i].x - 250;
enemy.platformBounds.right = platforms[i].x + 250;
enemy.platformBounds.top = platforms[i].y - 100;
enemy.platformBounds.bottom = platforms[i].y + 50;
enemies.push(enemy);
game.addChild(enemy);
}
}
// Initial enemy spawn
spawnEnemies();
// Player health bar
var playerHealthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0,
anchorY: 0
});
playerHealthBarBg.x = 120;
playerHealthBarBg.y = 20;
LK.gui.topLeft.addChild(playerHealthBarBg);
var playerHealthBar = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0
});
playerHealthBar.x = 120;
playerHealthBar.y = 20;
LK.gui.topLeft.addChild(playerHealthBar);
var healthText = new Text2('Health: 100/100', {
size: 40,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
healthText.x = 120;
healthText.y = 50;
LK.gui.topLeft.addChild(healthText);
// Score display
var scoreText = new Text2('Coins: 0/' + totalCoins, {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Level display
var levelText = new Text2('Level: ' + currentLevel, {
size: 50,
fill: 0xFFFFFF
});
levelText.anchor.set(1, 0);
LK.gui.topRight.addChild(levelText);
// Movement controls
var moveLeft = false;
var moveRight = false;
var moveUp = false;
var moveDown = false;
// Touch controls
game.down = function (x, y, obj) {
// Use the x, y parameters directly as they are already in game coordinates
var gamePos = {
x: x,
y: y
};
// Calculate distances for both horizontal and vertical movement
var horizontalDistance = Math.abs(gamePos.x - player.x);
var verticalDistance = Math.abs(gamePos.y - player.y);
// Reset all movement flags first
moveLeft = false;
moveRight = false;
moveUp = false;
moveDown = false;
// Check for ladder climbing first - if near ladder, only allow vertical movement
var nearLadder = false;
for (var i = 0; i < ladders.length; i++) {
var ladder = ladders[i];
if (Math.abs(gamePos.x - ladder.x) < 200 && Math.abs(gamePos.y - ladder.y) < 250) {
nearLadder = true;
// Only vertical movement when near ladder
if (gamePos.y < player.y - 50) {
moveUp = true;
} else if (gamePos.y > player.y + 50) {
moveDown = true;
}
break;
}
}
// If not near ladder, check for enemy shooting first, then movement
if (!nearLadder) {
// Check if tap is on an enemy
var enemyClicked = false;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var enemyDistance = Math.sqrt(Math.pow(gamePos.x - enemy.x, 2) + Math.pow(gamePos.y - enemy.y, 2));
if (enemyDistance < 80) {
// Enemy click radius
// Shoot at the clicked enemy if cooldown allows
if (LK.ticks - player.lastShot > player.shootCooldown) {
var star = new Star();
star.x = player.x;
star.y = player.y - 50; // Shoot from slightly above player
star.shootAt(enemy.x, enemy.y);
stars.push(star);
game.addChild(star);
player.lastShot = LK.ticks;
LK.getSound('shoot').play();
}
enemyClicked = true;
break;
}
}
// If no enemy was clicked, handle movement
if (!enemyClicked) {
if (horizontalDistance > verticalDistance) {
// Horizontal movement takes priority
if (gamePos.x < player.x - 50) {
moveLeft = true;
} else if (gamePos.x > player.x + 50) {
moveRight = true;
}
} else {
// Vertical movement takes priority
if (gamePos.y < player.y - 50) {
moveUp = true;
} else if (gamePos.y > player.y + 50) {
moveDown = true;
}
}
}
}
};
game.up = function (x, y, obj) {
moveLeft = false;
moveRight = false;
moveUp = false;
moveDown = false;
};
// Game update loop
game.update = function () {
// Handle player movement
if (!player.isClimbing) {
if (moveLeft) {
player.x -= player.speed;
// Ensure player doesn't go beyond left boundary
player.x = Math.max(20, player.x);
}
if (moveRight) {
player.x += player.speed;
// Ensure player doesn't go beyond right boundary
player.x = Math.min(2028, player.x);
}
if (moveUp) {
player.y -= player.speed;
// Ensure player doesn't go beyond top boundary
player.y = Math.max(100, player.y);
}
if (moveDown) {
player.y += player.speed;
// Ensure player doesn't go beyond bottom boundary
player.y = Math.min(2632, player.y);
}
// Platform boundary checking - keep player on current platform unless using ladder
if (player.currentPlatform !== null && !player.isClimbing) {
var currentPlatform = platforms[player.currentPlatform];
// Horizontal platform boundaries
var platformLeft = currentPlatform.x - 200;
var platformRight = currentPlatform.x + 200;
// Vertical platform boundaries
var platformTop = currentPlatform.y - 100;
var platformBottom = currentPlatform.y + 100;
// Check if player is trying to move outside platform boundaries
if (player.x < platformLeft || player.x > platformRight || player.y < platformTop || player.y > platformBottom) {
// Only allow if player is near a ladder - increased detection range
var nearLadder = false;
for (var ladderIndex = 0; ladderIndex < ladders.length; ladderIndex++) {
var ladder = ladders[ladderIndex];
if (Math.abs(player.x - ladder.x) < 200 && Math.abs(player.y - ladder.y) < 250) {
nearLadder = true;
break;
}
}
// If not near ladder, constrain to platform
if (!nearLadder) {
player.x = Math.max(platformLeft, Math.min(platformRight, player.x));
player.y = Math.max(platformTop, Math.min(platformBottom, player.y));
}
}
}
// Allow player to move between platforms by updating current platform based on proximity
if (player.currentPlatform !== null) {
// Check if player is close to any platform to update current platform
var closestPlatformIndex = 0;
var closestDistance = Math.abs(player.y - platforms[0].y);
for (var i = 1; i < platforms.length; i++) {
var distance = Math.abs(player.y - platforms[i].y);
if (distance < closestDistance && Math.abs(player.x - platforms[i].x) < 200) {
closestDistance = distance;
closestPlatformIndex = i;
}
}
// Update current platform if player is close enough to a different platform
if (Math.abs(player.x - platforms[closestPlatformIndex].x) < 200 && Math.abs(player.y - platforms[closestPlatformIndex].y) < 100) {
player.currentPlatform = closestPlatformIndex;
}
}
// Keep player within screen bounds
player.x = Math.max(20, Math.min(2028, player.x));
player.y = Math.max(100, Math.min(2632, player.y));
// Additional check: if player is climbing and goes out of bounds, stop climbing
if (player.isClimbing && (player.y <= 100 || player.y >= 2632)) {
player.isClimbing = false;
moveUp = false;
moveDown = false;
// Snap to nearest platform
var nearestPlatform = platforms[0];
var nearestDistance = Math.abs(player.y - nearestPlatform.y);
for (var i = 1; i < platforms.length; i++) {
var distance = Math.abs(player.y - platforms[i].y);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestPlatform = platforms[i];
player.currentPlatform = i;
}
}
player.y = nearestPlatform.y;
}
// Check for ladder climbing with hold-to-move
if (moveUp || moveDown) {
for (var i = 0; i < ladders.length; i++) {
var ladder = ladders[i];
if (Math.abs(player.x - ladder.x) < 200) {
// Snap to ladder horizontally
player.x = ladder.x;
// Direct climbing movement based on held direction
if (moveUp) {
player.y -= player.climbSpeed;
// Ensure doesn't go above screen
player.y = Math.max(100, player.y);
} else if (moveDown) {
player.y += player.climbSpeed;
// Ensure doesn't go below screen
player.y = Math.min(2632, player.y);
}
// Update current platform based on proximity while climbing
var closestPlatformIndex = 0;
var closestDistance = Math.abs(player.y - platforms[0].y);
for (var j = 1; j < platforms.length; j++) {
var distance = Math.abs(player.y - platforms[j].y);
if (distance < closestDistance && Math.abs(platforms[j].x - ladder.x) < 100) {
closestDistance = distance;
closestPlatformIndex = j;
}
}
// Snap to platform if very close
if (closestDistance < 30) {
player.y = platforms[closestPlatformIndex].y;
player.currentPlatform = closestPlatformIndex;
}
break;
}
}
}
}
// Check coin collection
for (var i = 0; i < coins.length; i++) {
var coin = coins[i];
if (!coin.collected && player.intersects(coin)) {
coin.collected = true;
coin.alpha = 0;
coinsCollected++;
LK.setScore(coinsCollected);
scoreText.setText('Coins: ' + coinsCollected + '/' + totalCoins);
LK.getSound('coinCollect').play();
// Check win condition
if (coinsCollected >= totalCoins) {
LK.showYouWin();
}
}
}
// Update player health bar
function updatePlayerHealthBar() {
var healthPercent = player.health / player.maxHealth;
playerHealthBar.width = 200 * healthPercent;
if (healthPercent > 0.6) {
playerHealthBar.tint = 0x00ff00;
} else if (healthPercent > 0.3) {
playerHealthBar.tint = 0xffff00;
} else {
playerHealthBar.tint = 0xff0000;
}
healthText.setText('Health: ' + player.health + '/' + player.maxHealth);
}
// Update and check star collisions
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
// Check star-enemy collisions
var hitEnemy = false;
for (var j = 0; j < enemies.length; j++) {
var enemy = enemies[j];
if (star.active && star.intersects(enemy)) {
// Damage enemy
enemy.health -= 25;
enemy.updateHealthBar();
// Flash enemy red
tween(enemy, {
tint: 0xFF0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(enemy, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
LK.getSound('enemyHit').play();
hitEnemy = true;
// Remove enemy if health <= 0
if (enemy.health <= 0) {
enemy.destroy();
enemies.splice(j, 1);
j--; // Adjust index after removal
}
break;
}
}
// Remove star if hit enemy or inactive
if (hitEnemy || !star.active) {
tween.stop(star); // Stop any ongoing tween
star.destroy();
stars.splice(i, 1);
}
}
// Check enemy collisions
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
if (player.intersects(enemy)) {
// Initialize lastHit if not exists
if (enemy.lastHit === undefined) {
enemy.lastHit = 0;
}
// Only damage if enough time has passed (1 second = 60 ticks)
if (LK.ticks - enemy.lastHit > 60) {
player.health -= 10;
enemy.lastHit = LK.ticks;
updatePlayerHealthBar();
LK.getSound('enemyHit').play();
LK.effects.flashScreen(0xff0000, 500);
if (player.health <= 0) {
LK.showGameOver();
}
}
}
// Update enemy health bars
enemy.updateHealthBar();
}
// Level progression (spawn more enemies every 30 seconds)
if (LK.ticks % (60 * 30) === 0 && coinsCollected < totalCoins) {
currentLevel++;
levelText.setText('Level: ' + currentLevel);
spawnEnemies();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -147,9 +147,9 @@
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
- self.speed = 15;
+ self.speed = 30;
self.targetX = 0;
self.targetY = 0;
self.active = true;
self.shootAt = function (targetX, targetY) {
@@ -628,9 +628,11 @@
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
if (player.intersects(enemy)) {
// Initialize lastHit if not exists
- if (enemy.lastHit === undefined) enemy.lastHit = 0;
+ if (enemy.lastHit === undefined) {
+ enemy.lastHit = 0;
+ }
// Only damage if enough time has passed (1 second = 60 ticks)
if (LK.ticks - enemy.lastHit > 60) {
player.health -= 10;
enemy.lastHit = LK.ticks;
coin, hd colors. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Scary blue background of forest, moon, small owl on tree, HD colors. In-Game asset. 2d. High contrast. No shadows
Scary graveyard with different things around it scary things spiders, web spider, skulls, swords, grass, trees.. In-Game asset. 2d. High contrast. No shadows
Scary wallpaper without characters, with all colors, HD colors. In-Game asset. 3d. High contrast. No shadows