User prompt
Interesante actualización, pero no debe tomar en cuenta la ubicación del puntero, que al saltar solo tome en cuenta su ubicación y que debe saltar al muro opuesto al que se encuentra de manera perpendicular
User prompt
Pero el problema es que el stickman al hacer su salto lo hace desde el centro del muro en el que se encuentra cuando debería ser desde la ubicación desde donde se encuentra
Code edit (1 edits merged)
Please save this source code
User prompt
Wall Runner Impact
Initial prompt
Quiero que realices un juego de la siguiente manera, un stickman puede correr por las paredes del marco de la pantalla, puede saltar pero cuando usa su habilidad salta al lado opuesto de la pantalla volando a gran velocidad y generando un impacto sobre el marco, hay una bolita brillante que rebota por las paredes volando de manera aleatoria, cuando el stickman la toca se repara el terreno, sin embargo, el stickman cada vez se le acaba el terreno conforme lo va destruyendo
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Orb = Container.expand(function () {
var self = Container.call(this);
var orbGraphics = self.attachAsset('orb', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = (Math.random() - 0.5) * 8;
self.velocityY = (Math.random() - 0.5) * 8;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
// Bounce off walls
if (self.x <= 40 || self.x >= 2008) {
self.velocityX *= -1;
self.x = Math.max(40, Math.min(2008, self.x));
}
if (self.y <= 40 || self.y >= 2692) {
self.velocityY *= -1;
self.y = Math.max(40, Math.min(2692, self.y));
}
// Glowing effect
orbGraphics.alpha = 0.7 + 0.3 * Math.sin(LK.ticks * 0.1);
};
return self;
});
var Stickman = Container.expand(function () {
var self = Container.call(this);
var stickmanGraphics = self.attachAsset('stickman', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.wall = 'bottom'; // current wall: 'top', 'right', 'bottom', 'left'
self.wallProgress = 0; // progress along current wall (0-1)
self.isJumping = false;
self.jumpStartWall = '';
self.jumpStartProgress = 0;
self.jumpProgress = 0;
self.update = function () {
if (self.isJumping) {
self.jumpProgress += 0.04;
var startPos = self.getWallPosition(self.jumpStartWall, self.jumpStartProgress);
var endPos = self.getWallPosition(self.getOppositeWall(self.jumpStartWall), 0.5);
self.x = startPos.x + (endPos.x - startPos.x) * self.jumpProgress;
self.y = startPos.y + (endPos.y - startPos.y) * self.jumpProgress;
if (self.jumpProgress >= 1) {
self.isJumping = false;
self.wall = self.getOppositeWall(self.jumpStartWall);
self.wallProgress = 0.5;
self.jumpProgress = 0;
// Create impact effect
createImpactEffect(self.x, self.y);
damageTerrain(self.x, self.y);
LK.getSound('impact').play();
}
} else {
self.wallProgress += self.speed / 1000;
if (self.wallProgress > 1) {
self.wallProgress = 0;
self.wall = self.getNextWall();
}
var pos = self.getWallPosition(self.wall, self.wallProgress);
self.x = pos.x;
self.y = pos.y;
// Damage terrain as stickman runs
if (LK.ticks % 15 === 0) {
damageTerrain(self.x, self.y);
}
}
};
self.getWallPosition = function (wall, progress) {
switch (wall) {
case 'top':
return {
x: progress * 2048,
y: 60
};
case 'right':
return {
x: 1988,
y: 60 + progress * (2732 - 120)
};
case 'bottom':
return {
x: (1 - progress) * 2048,
y: 2672
};
case 'left':
return {
x: 60,
y: 2672 - progress * (2732 - 120)
};
}
};
self.getNextWall = function () {
var walls = ['top', 'right', 'bottom', 'left'];
var currentIndex = walls.indexOf(self.wall);
return walls[(currentIndex + 1) % 4];
};
self.getOppositeWall = function (wall) {
switch (wall) {
case 'top':
return 'bottom';
case 'bottom':
return 'top';
case 'left':
return 'right';
case 'right':
return 'left';
}
};
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.jumpStartWall = self.wall;
self.jumpStartProgress = self.wallProgress;
self.jumpProgress = 0;
LK.getSound('jump').play();
}
};
return self;
});
var TerrainBlock = Container.expand(function () {
var self = Container.call(this);
var terrainGraphics = self.attachAsset('terrain', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.maxHealth = 3;
self.damage = function () {
self.health--;
terrainGraphics.alpha = self.health / self.maxHealth;
if (self.health <= 0) {
self.destroy();
return true; // Block destroyed
}
return false;
};
self.repair = function () {
self.health = self.maxHealth;
terrainGraphics.alpha = 1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var stickman;
var orb;
var terrainBlocks = [];
var orbsCollected = 0;
var gameTime = 0;
var destructionRate = 1;
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0x000000
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create orbs collected display
var orbTxt = new Text2('Orbs: 0', {
size: 60,
fill: 0xFFD700
});
orbTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(orbTxt);
// Initialize stickman
stickman = game.addChild(new Stickman());
var pos = stickman.getWallPosition('bottom', 0);
stickman.x = pos.x;
stickman.y = pos.y;
// Initialize orb
orb = game.addChild(new Orb());
orb.x = 1024;
orb.y = 1366;
// Create initial terrain blocks around perimeter
function createInitialTerrain() {
// Top wall
for (var i = 0; i < 17; i++) {
var block = new TerrainBlock();
block.x = i * 120 + 60;
block.y = 20;
terrainBlocks.push(block);
game.addChild(block);
}
// Bottom wall
for (var i = 0; i < 17; i++) {
var block = new TerrainBlock();
block.x = i * 120 + 60;
block.y = 2712;
terrainBlocks.push(block);
game.addChild(block);
}
// Left wall
for (var i = 1; i < 22; i++) {
var block = new TerrainBlock();
block.x = 20;
block.y = i * 120 + 60;
terrainBlocks.push(block);
game.addChild(block);
}
// Right wall
for (var i = 1; i < 22; i++) {
var block = new TerrainBlock();
block.x = 2028;
block.y = i * 120 + 60;
terrainBlocks.push(block);
game.addChild(block);
}
}
function createImpactEffect(x, y) {
var effect = LK.getAsset('impactEffect', {
anchorX: 0.5,
anchorY: 0.5,
x: x,
y: y,
alpha: 0.8
});
game.addChild(effect);
tween(effect, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 500,
onFinish: function onFinish() {
effect.destroy();
}
});
}
function damageTerrain(x, y) {
var damageRadius = 150;
for (var i = terrainBlocks.length - 1; i >= 0; i--) {
var block = terrainBlocks[i];
var distance = Math.sqrt((block.x - x) * (block.x - x) + (block.y - y) * (block.y - y));
if (distance < damageRadius) {
if (block.damage()) {
terrainBlocks.splice(i, 1);
}
}
}
}
function repairTerrain() {
for (var i = 0; i < terrainBlocks.length; i++) {
terrainBlocks[i].repair();
}
}
function checkCollisions() {
// Check orb collision
var distance = Math.sqrt((stickman.x - orb.x) * (stickman.x - orb.x) + (stickman.y - orb.y) * (stickman.y - orb.y));
if (distance < 70) {
orbsCollected++;
LK.setScore(LK.getScore() + 100);
scoreTxt.setText('Score: ' + LK.getScore());
orbTxt.setText('Orbs: ' + orbsCollected);
// Repair terrain
repairTerrain();
// Respawn orb
orb.x = 200 + Math.random() * 1648;
orb.y = 200 + Math.random() * 2332;
orb.velocityX = (Math.random() - 0.5) * 8;
orb.velocityY = (Math.random() - 0.5) * 8;
LK.getSound('collect').play();
// Flash effect
LK.effects.flashScreen(0xFFD700, 300);
}
}
function checkGameOver() {
if (terrainBlocks.length < 10) {
LK.showGameOver();
}
}
// Initialize terrain
createInitialTerrain();
// Game controls
game.down = function (x, y, obj) {
stickman.jump();
};
// Main game loop
game.update = function () {
gameTime++;
// Increase destruction rate over time
if (gameTime % 1800 === 0) {
// Every 30 seconds
destructionRate += 0.5;
}
// Random terrain destruction
if (Math.random() < 0.001 * destructionRate && terrainBlocks.length > 0) {
var randomIndex = Math.floor(Math.random() * terrainBlocks.length);
var block = terrainBlocks[randomIndex];
if (block.damage()) {
terrainBlocks.splice(randomIndex, 1);
}
}
// Update score based on survival time
if (gameTime % 60 === 0) {
// Every second
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
}
checkCollisions();
checkGameOver();
}; ===================================================================
--- original.js
+++ change.js
@@ -47,15 +47,15 @@
self.update = function () {
if (self.isJumping) {
self.jumpProgress += 0.04;
var startPos = self.getWallPosition(self.jumpStartWall, self.jumpStartProgress);
- var endPos = self.getWallPosition(self.getOppositeWall(self.jumpStartWall), self.jumpStartProgress);
+ var endPos = self.getWallPosition(self.getOppositeWall(self.jumpStartWall), 0.5);
self.x = startPos.x + (endPos.x - startPos.x) * self.jumpProgress;
self.y = startPos.y + (endPos.y - startPos.y) * self.jumpProgress;
if (self.jumpProgress >= 1) {
self.isJumping = false;
self.wall = self.getOppositeWall(self.jumpStartWall);
- self.wallProgress = self.jumpStartProgress;
+ self.wallProgress = 0.5;
self.jumpProgress = 0;
// Create impact effect
createImpactEffect(self.x, self.y);
damageTerrain(self.x, self.y);
Un stickman con una posición de corredor. In-Game asset. 2d. High contrast. No shadows
Cesped en forma de rectangulo como con el pasto arriba tierra y algunas rocas irregulares. In-Game asset. 2d. High contrast. No shadows
Stickman delgado en posición fetal y que este todo relleno de negro
Quitale el fondo
Bebidas energéticas verdes. In-Game asset. 2d. High contrast. No shadows
1 Lata verde con un rayo, sin fondo. In-Game asset. 2d. High contrast. No shadows
Change the green of the grass to dark green