User prompt
Oyuncu 3 canı olsun ve uzaylılara temas ettiğinde eriyerek ilk başlayan platforma geri dönsün ve ekran karar verdikten sonra canı gösterildisin sonra tekrar başlasın ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
oyuncu eridikten sonra şekli değişmesin eski şekline geri dönsün ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
oyuncu erisin ama sonrasında kaldığı yerden devam etsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Oyuncu uzaylılar tarafından öldürüldüğünde eriyerek yok olan bir görüntüde ölsün ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
oyuncu aşağı düşünce ölsün
User prompt
puanları, uzaylıları ve platformları çoğalmak gerekiyor ve üste doğru gitsin bir süre sonra uzay mekiğini görelim
Remix started
Copy Astro Jump: Space Platformer
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Collectible (Star)
var Collectible = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = 80;
self.height = 80;
return self;
});
// Enemy (Alien or Robot)
var Enemy = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('alien', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ENEMY_WIDTH;
self.height = ENEMY_HEIGHT;
self.vx = 3 + Math.random() * 2;
self.direction = Math.random() < 0.5 ? -1 : 1;
self.lastX = 0;
self.update = function () {
self.x += self.vx * self.direction;
// Turn at platform edges
for (var i = 0; i < platforms.length; ++i) {
var p = platforms[i];
if (Math.abs(self.y - p.y) < 10) {
if (self.x - self.width / 2 < p.x - p.width / 2 || self.x + self.width / 2 > p.x + p.width / 2) {
self.direction *= -1;
}
}
}
// Clamp to world
if (self.x < ENEMY_WIDTH / 2) self.direction = 1;
if (self.x > 2048 - ENEMY_WIDTH / 2) self.direction = -1;
self.lastX = self.x;
};
return self;
});
// Platform
var Platform = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = PLATFORM_WIDTH;
self.height = PLATFORM_HEIGHT;
return self;
});
// --- ASSET CLASSES ---
// Player (Astronaut)
var Player = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('astronaut', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = PLAYER_WIDTH;
self.height = PLAYER_HEIGHT;
self.vx = 0;
self.vy = 0;
self.isOnGround = false;
self.canDoubleJump = true;
self.lastY = 0;
self.lastX = 0;
self.lastWasIntersectingEnemy = false;
self.lastWasIntersectingRocket = false;
self.jetpackExhaust = null;
self.update = function () {
// Gravity
self.vy += GRAVITY;
// Jetpack exhaust effect (show when jumping or double jumping)
if (self.vy < -2) {
if (!self.jetpackExhaust) {
self.jetpackExhaust = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.0,
scaleX: 0.3,
scaleY: 0.3,
y: self.height / 2 + 10
});
self.jetpackExhaust.alpha = 0.7;
}
self.jetpackExhaust.x = 0;
self.jetpackExhaust.y = self.height / 2 + 10;
self.jetpackExhaust.visible = true;
} else if (self.jetpackExhaust) {
self.jetpackExhaust.visible = false;
}
// Move
self.x += self.vx;
self.y += self.vy;
// Clamp to world bounds
if (self.x < PLAYER_WIDTH / 2) self.x = PLAYER_WIDTH / 2;
if (self.x > 2048 - PLAYER_WIDTH / 2) self.x = 2048 - PLAYER_WIDTH / 2;
if (self.y > 2732 - PLAYER_HEIGHT / 2) self.y = 2732 - PLAYER_HEIGHT / 2;
// Platform collision
self.isOnGround = false;
for (var i = 0; i < platforms.length; ++i) {
var p = platforms[i];
// Only check if falling
if (self.vy >= 0 && self.y + self.height / 2 > p.y - p.height / 2 && self.y + self.height / 2 - self.vy <= p.y - p.height / 2) {
// Check horizontal overlap
if (self.x + self.width / 2 > p.x - p.width / 2 && self.x - self.width / 2 < p.x + p.width / 2) {
// Land on platform
self.y = p.y - p.height / 2 - self.height / 2;
self.vy = 0;
self.isOnGround = true;
self.canDoubleJump = true;
isJumping = false;
}
}
}
// Enemy collision
var hitEnemy = null;
for (var i = 0; i < enemies.length; ++i) {
var e = enemies[i];
if (self.intersects(e)) {
// Check if landing on top
if (self.lastY + self.height / 2 <= e.y - e.height / 2 && self.y + self.height / 2 > e.y - e.height / 2 && self.vy > 0) {
// Defeat enemy
hitEnemy = e;
break;
} else {
// Hit from side or below: lose life with melting animation
if (!self.lastWasIntersectingEnemy) {
// Create melting death animation
tween(self, {
scaleY: 0.1,
alpha: 0.3,
tint: 0xFF4500
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
// Reset player appearance after animation - restore all properties
self.scaleY = 1;
self.alpha = 1;
self.tint = 0xFFFFFF;
}
});
loseLife();
self.lastWasIntersectingEnemy = true;
}
}
} else {
self.lastWasIntersectingEnemy = false;
}
}
if (hitEnemy) {
// Remove enemy, bounce up
score += 100;
updateScore();
if (LK.getSound && LK.getSound('enemyDefeat')) LK.getSound('enemyDefeat').play();
hitEnemy.destroy();
enemies.splice(enemies.indexOf(hitEnemy), 1);
self.vy = JUMP_VELOCITY / 1.5;
}
// Collectibles
for (var i = collectibles.length - 1; i >= 0; --i) {
var c = collectibles[i];
if (self.intersects(c)) {
score += 50;
updateScore();
if (LK.getSound && LK.getSound('collect')) LK.getSound('collect').play();
c.destroy();
collectibles.splice(i, 1);
}
}
// Rocket (level end)
if (!self.lastWasIntersectingRocket && self.intersects(rocket)) {
// Win!
LK.showYouWin();
lastYouWin = true;
}
self.lastWasIntersectingRocket = self.intersects(rocket);
// Fall off screen
if (self.y > 2732) {
loseLife();
}
// Update last positions
self.lastY = self.y;
self.lastX = self.x;
};
return self;
});
// Rocket (Level End)
var Rocket = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('rocket', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = 180;
self.height = 260;
return self;
});
/****
* Initialize Game
****/
// --- UI ---
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// --- Astro Jump: Space Platformer Main Game Logic ---
// --- GLOBALS ---
var GRAVITY = 0.3; // Low gravity for floaty jumps
var JUMP_VELOCITY = -18; // High jump
var PLAYER_MOVE_SPEED = 12;
var PLAYER_START_LIVES = 3;
var PLAYER_WIDTH = 120;
var PLAYER_HEIGHT = 140;
var ENEMY_WIDTH = 110;
var ENEMY_HEIGHT = 110;
var PLATFORM_WIDTH = 320;
var PLATFORM_HEIGHT = 60;
var LEVEL_END_X = 1800;
var LEVEL_END_Y = -100;
var platforms = [];
var enemies = [];
var collectibles = [];
var player = null;
var rocket = null;
var score = 0;
var lives = PLAYER_START_LIVES;
var scoreTxt = null;
var livesTxt = null;
var isJumping = false;
var isFalling = false;
var jumpKeyDown = false;
var dragNode = null;
var lastGameOver = false;
var lastYouWin = false;
// --- CUSTOM IMAGE BACKGROUND ---
// Replace parallax starfield with a custom image background that scrolls horizontally with the player
// Please upload your background image to LK and use its asset id below:
var bgImage = LK.getAsset('space_bg', {
anchorX: 0,
anchorY: 0,
scaleX: 1,
scaleY: 1,
x: 0,
y: 0
});
game.addChildAt(bgImage, 0); // Always behind everything
// Used to track last player X for background scroll
var lastPlayerX = 0;
// --- UI ---
scoreTxt = new Text2('Score: 0', {
size: 90,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Pixel heart asset
livesTxt = new Container();
livesTxt.hearts = [];
for (var i = 0; i < PLAYER_START_LIVES; ++i) {
var heart = LK.getAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
heart.x = i * 70;
heart.y = 0;
livesTxt.addChild(heart);
livesTxt.hearts.push(heart);
}
livesTxt.x = 0;
livesTxt.y = 0;
LK.gui.topRight.addChild(livesTxt);
// --- LEVEL SETUP ---
function setupLevel() {
// Clear previous
for (var i = 0; i < platforms.length; ++i) platforms[i].destroy();
for (var i = 0; i < enemies.length; ++i) enemies[i].destroy();
for (var i = 0; i < collectibles.length; ++i) collectibles[i].destroy();
if (player) player.destroy();
if (rocket) rocket.destroy();
platforms = [];
enemies = [];
collectibles = [];
// Platforms - More platforms going upward
var platData = [{
x: 400,
y: 2200
}, {
x: 800,
y: 1900
}, {
x: 600,
y: 1700
}, {
x: 1000,
y: 1500
}, {
x: 1400,
y: 1300
}, {
x: 1100,
y: 1100
}, {
x: 1500,
y: 900
}, {
x: 900,
y: 700
}, {
x: 1300,
y: 500
}, {
x: 1700,
y: 300
}, {
x: 1200,
y: 100
}, {
x: LEVEL_END_X,
y: LEVEL_END_Y
}];
for (var i = 0; i < platData.length; ++i) {
var p = new Platform();
p.x = platData[i].x;
p.y = platData[i].y;
platforms.push(p);
game.addChild(p);
}
// Enemies - More enemies across platforms
var enemyData = [{
x: 800,
y: 1800
}, {
x: 600,
y: 1600
}, {
x: 1000,
y: 1400
}, {
x: 1400,
y: 1200
}, {
x: 1100,
y: 1000
}, {
x: 1500,
y: 800
}, {
x: 900,
y: 600
}, {
x: 1300,
y: 400
}];
for (var i = 0; i < enemyData.length; ++i) {
var e = new Enemy();
e.x = enemyData[i].x;
e.y = enemyData[i].y;
enemies.push(e);
game.addChild(e);
}
// Collectibles - More stars across all platforms
var starData = [{
x: 400,
y: 2100
}, {
x: 800,
y: 1800
}, {
x: 600,
y: 1600
}, {
x: 1000,
y: 1400
}, {
x: 1400,
y: 1200
}, {
x: 1100,
y: 1000
}, {
x: 1500,
y: 800
}, {
x: 900,
y: 600
}, {
x: 1300,
y: 400
}, {
x: 1700,
y: 200
}, {
x: 1200,
y: 50
}];
for (var i = 0; i < starData.length; ++i) {
var c = new Collectible();
c.x = starData[i].x;
c.y = starData[i].y;
collectibles.push(c);
game.addChild(c);
}
// Rocket
rocket = new Rocket();
rocket.x = LEVEL_END_X;
rocket.y = LEVEL_END_Y - 150;
game.addChild(rocket);
// Player
player = new Player();
player.x = 400;
player.y = 2100;
game.addChild(player);
// Reset UI
updateScore();
updateLives();
lastGameOver = false;
lastYouWin = false;
}
setupLevel();
LK.playMusic('chiptune');
// --- UI Update ---
function updateScore() {
scoreTxt.setText('Score: ' + score);
}
function updateLives() {
for (var i = 0; i < livesTxt.hearts.length; ++i) {
livesTxt.hearts[i].visible = i < lives;
}
}
// --- Lose Life ---
function loseLife() {
if (lastGameOver) return;
// Store current position before losing life
var respawnX = player.x;
var respawnY = player.y;
lives -= 1;
updateLives();
if (lives <= 0) {
LK.showGameOver();
lastGameOver = true;
} else {
// Respawn player at the position where they died
player.x = respawnX;
player.y = respawnY;
player.vx = 0;
player.vy = 0;
}
}
// --- GAME CONTROLS (Touch/Drag) ---
game.down = function (x, y, obj) {
// Only allow controls if player exists
if (!player) return;
// Get screen width and height
var screenWidth = 2048;
var screenHeight = 2732;
// Define control regions
var leftRegion = screenWidth * 0.5;
var jumpRegionY = screenHeight * 0.7; // bottom 30% of screen
// If tap is in bottom 30% of screen, treat as jump
if (y > jumpRegionY) {
if (player.isOnGround) {
player.vy = JUMP_VELOCITY;
player.isOnGround = false;
player.canDoubleJump = true;
if (LK.getSound && LK.getSound('jump')) LK.getSound('jump').play();
} else if (player.canDoubleJump) {
player.vy = JUMP_VELOCITY;
player.canDoubleJump = false;
if (LK.getSound && LK.getSound('jump')) LK.getSound('jump').play();
}
// No horizontal movement on jump tap
// player.vx = 0; // Don't stop movement on jump
return;
}
// If tap is on left half, move left
if (x < leftRegion) {
player.vx = -PLAYER_MOVE_SPEED;
}
// If tap is on right half, move right
else {
player.vx = PLAYER_MOVE_SPEED;
}
};
game.up = function (x, y, obj) {
dragNode = null;
if (player) {
player.vx = 0;
}
};
game.move = function (x, y, obj) {
// No drag-based movement; handled by vx in update
};
// --- GAME LOOP ---
game.update = function () {
// --- Custom background image scroll ---
// Only scroll if player exists
if (player) {
// Calculate horizontal movement since last frame
var dx = player.x - lastPlayerX;
// Scroll background horizontally at a slow rate for parallax effect
// (Adjust 0.3 for desired parallax speed)
bgImage.x -= dx * 0.3;
// Wrap background horizontally for infinite effect
if (bgImage.x <= -2048) {
bgImage.x += 2048;
} else if (bgImage.x >= 2048) {
bgImage.x -= 2048;
}
lastPlayerX = player.x;
}
// Player update
if (player) player.update();
// Enemies update
for (var i = 0; i < enemies.length; ++i) {
enemies[i].update();
}
// Win/Lose handled in player.update
}; ===================================================================
--- original.js
+++ change.js
@@ -137,32 +137,20 @@
if (!self.lastWasIntersectingEnemy) {
// Create melting death animation
tween(self, {
scaleY: 0.1,
- alpha: 0.3
+ alpha: 0.3,
+ tint: 0xFF4500
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
- // Reset player appearance after animation
+ // Reset player appearance after animation - restore all properties
self.scaleY = 1;
self.alpha = 1;
+ self.tint = 0xFFFFFF;
}
});
- // Also make player "melt" by changing tint to red-orange
- tween(self, {
- tint: 0xFF4500
- }, {
- duration: 400,
- onFinish: function onFinish() {
- // Reset tint after melting effect
- tween(self, {
- tint: 0xFFFFFF
- }, {
- duration: 400
- });
- }
- });
loseLife();
self.lastWasIntersectingEnemy = true;
}
}