User prompt
Agrega dos botones para mover de izquierda a derecha
User prompt
Que el segundo jugador ya no se pueda controlar por tactil
User prompt
Establece un límite de velocidad para que los personajes no se teletransporte
User prompt
Que el segundo jugador sea controlado por la IA
User prompt
Que el jugador pueda saltar dos veces en el aire
User prompt
El jugador solo puede saltar una vez, arreglalo
User prompt
Arregla el salto, el jugador no puede volver a saltar al aterrizar
User prompt
Agrega un botón en pantalla para saltar y otro para golpear, solo para el jugador 1
Code edit (1 edits merged)
Please save this source code
User prompt
Battle Arena Smash
Initial prompt
Hoy quiero crear un juego estilo súper smash bros
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Fighter = Container.expand(function (playerNumber, color) {
var self = Container.call(this);
var fighterGraphics = self.attachAsset(playerNumber === 1 ? 'player1' : 'player2', {
anchorX: 0.5,
anchorY: 1.0
});
self.playerNumber = playerNumber;
self.velocityX = 0;
self.velocityY = 0;
self.onGround = false;
self.health = 0;
self.maxHealth = 100;
self.moveSpeed = 8;
self.jumpPower = 25;
self.knockbackResistance = 1.0;
self.lastHitTime = 0;
self.invulnerable = false;
self.takeDamage = function (damage, knockbackX, knockbackY) {
if (self.invulnerable) return;
self.health += damage;
self.velocityX += knockbackX * (1 + self.health / 50) / self.knockbackResistance;
self.velocityY += knockbackY * (1 + self.health / 50) / self.knockbackResistance;
// Flash effect when hit
LK.effects.flashObject(self, 0xff0000, 300);
self.invulnerable = true;
LK.setTimeout(function () {
self.invulnerable = false;
}, 500);
LK.getSound('hit').play();
};
self.attack = function (targetX, targetY) {
var attackRange = 150;
var damage = 15;
var baseKnockback = 12;
for (var i = 0; i < fighters.length; i++) {
var target = fighters[i];
if (target === self) continue;
var distance = Math.sqrt(Math.pow(target.x - self.x, 2) + Math.pow(target.y - self.y, 2));
if (distance <= attackRange) {
var angle = Math.atan2(target.y - self.y, target.x - self.x);
var knockbackX = Math.cos(angle) * baseKnockback;
var knockbackY = Math.sin(angle) * baseKnockback - 5; // Slight upward angle
target.takeDamage(damage, knockbackX, knockbackY);
}
}
};
self.update = function () {
// Apply gravity
if (!self.onGround) {
self.velocityY += 1.2;
}
// Apply friction
self.velocityX *= 0.85;
if (self.onGround) {
self.velocityX *= 0.75;
}
// Update position
self.x += self.velocityX;
self.y += self.velocityY;
// Platform collision
self.onGround = false;
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
if (self.x > platform.x - platform.width / 2 && self.x < platform.x + platform.width / 2 && self.y > platform.y - platform.height && self.y < platform.y + 10 && self.velocityY > 0) {
self.y = platform.y - platform.height;
self.velocityY = 0;
self.onGround = true;
break;
}
}
// Check if fallen off screen
if (self.y > 2900) {
self.respawn();
}
// Screen boundaries (horizontal bouncing)
if (self.x < 60) {
self.x = 60;
self.velocityX = Math.abs(self.velocityX) * 0.5;
}
if (self.x > 1988) {
self.x = 1988;
self.velocityX = -Math.abs(self.velocityX) * 0.5;
}
};
self.respawn = function () {
self.x = self.playerNumber === 1 ? 400 : 1648;
self.y = 1000;
self.velocityX = 0;
self.velocityY = 0;
self.health = 0;
if (self.playerNumber === 1) {
player2Wins++;
} else {
player1Wins++;
}
updateScoreDisplay();
if (player1Wins >= 3 || player2Wins >= 3) {
if (player1Wins >= 3) {
LK.setScore(100);
}
LK.showGameOver();
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.lifeTime = 0;
self.maxLifeTime = 600; // 10 seconds at 60fps
self.collected = false;
self.update = function () {
self.lifeTime++;
self.rotation += 0.05;
// Bounce effect
self.y += Math.sin(self.lifeTime * 0.1) * 0.5;
if (self.lifeTime > self.maxLifeTime) {
self.destroy();
for (var i = powerups.length - 1; i >= 0; i--) {
if (powerups[i] === self) {
powerups.splice(i, 1);
break;
}
}
}
// Check collection by players
if (!self.collected) {
for (var i = 0; i < fighters.length; i++) {
var fighter = fighters[i];
var distance = Math.sqrt(Math.pow(fighter.x - self.x, 2) + Math.pow(fighter.y - self.y, 2));
if (distance < 80) {
self.collected = true;
fighter.knockbackResistance = 0.5; // Temporary power boost
LK.setTimeout(function () {
fighter.knockbackResistance = 1.0;
}, 5000);
LK.getSound('powerup').play();
LK.effects.flashObject(fighter, 0xffd700, 500);
self.destroy();
for (var j = powerups.length - 1; j >= 0; j--) {
if (powerups[j] === self) {
powerups.splice(j, 1);
break;
}
}
break;
}
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Game variables
var fighters = [];
var platforms = [];
var powerups = [];
var player1Wins = 0;
var player2Wins = 0;
var draggedFighter = null;
var lastTapTime = 0;
var powerupSpawnTimer = 0;
// Create platforms
var mainPlatform = game.addChild(LK.getAsset('mainPlatform', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1400
}));
platforms.push(mainPlatform);
var leftPlatform = game.addChild(LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
x: 400,
y: 1100
}));
platforms.push(leftPlatform);
var rightPlatform = game.addChild(LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
x: 1648,
y: 1100
}));
platforms.push(rightPlatform);
var topPlatform = game.addChild(LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 800
}));
platforms.push(topPlatform);
// Create fighters
var player1 = game.addChild(new Fighter(1));
player1.x = 400;
player1.y = 1000;
fighters.push(player1);
var player2 = game.addChild(new Fighter(2));
player2.x = 1648;
player2.y = 1000;
fighters.push(player2);
// UI Elements
var scoreText = new Text2('Player 1: 0 | Player 2: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var instructionText = new Text2('Drag to move, Tap to attack', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
function updateScoreDisplay() {
scoreText.setText('Player 1: ' + player1Wins + ' | Player 2: ' + player2Wins);
}
function spawnPowerUp() {
if (powerups.length < 2) {
var powerup = game.addChild(new PowerUp());
var spawnPlatform = platforms[Math.floor(Math.random() * platforms.length)];
powerup.x = spawnPlatform.x + (Math.random() - 0.5) * (spawnPlatform.width - 100);
powerup.y = spawnPlatform.y - spawnPlatform.height - 100;
powerups.push(powerup);
}
}
// Game controls
game.down = function (x, y, obj) {
var currentTime = LK.ticks;
var tapSpeed = 20; // frames between taps for double tap
// Find closest fighter to touch point
var closestFighter = null;
var closestDistance = Infinity;
for (var i = 0; i < fighters.length; i++) {
var fighter = fighters[i];
var distance = Math.sqrt(Math.pow(fighter.x - x, 2) + Math.pow(fighter.y - y, 2));
if (distance < closestDistance && distance < 200) {
closestDistance = distance;
closestFighter = fighter;
}
}
if (closestFighter) {
// Check for double tap (attack)
if (currentTime - lastTapTime < tapSpeed) {
closestFighter.attack(x, y);
draggedFighter = null;
} else {
draggedFighter = closestFighter;
}
lastTapTime = currentTime;
}
};
game.move = function (x, y, obj) {
if (draggedFighter) {
var deltaX = x - draggedFighter.x;
var deltaY = y - draggedFighter.y;
// Move fighter towards touch point
draggedFighter.velocityX += deltaX * 0.3;
// Jump if dragging upward and on ground
if (deltaY < -50 && draggedFighter.onGround) {
draggedFighter.velocityY = -draggedFighter.jumpPower;
draggedFighter.onGround = false;
}
}
};
game.up = function (x, y, obj) {
draggedFighter = null;
};
game.update = function () {
// Spawn power-ups occasionally
powerupSpawnTimer++;
if (powerupSpawnTimer > 300) {
// Every 5 seconds
if (Math.random() < 0.3) {
spawnPowerUp();
}
powerupSpawnTimer = 0;
}
// Update all fighters
for (var i = 0; i < fighters.length; i++) {
fighters[i].update();
}
// Update all powerups
for (var i = powerups.length - 1; i >= 0; i--) {
if (powerups[i] && !powerups[i].destroyed) {
powerups[i].update();
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,309 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Fighter = Container.expand(function (playerNumber, color) {
+ var self = Container.call(this);
+ var fighterGraphics = self.attachAsset(playerNumber === 1 ? 'player1' : 'player2', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.playerNumber = playerNumber;
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.onGround = false;
+ self.health = 0;
+ self.maxHealth = 100;
+ self.moveSpeed = 8;
+ self.jumpPower = 25;
+ self.knockbackResistance = 1.0;
+ self.lastHitTime = 0;
+ self.invulnerable = false;
+ self.takeDamage = function (damage, knockbackX, knockbackY) {
+ if (self.invulnerable) return;
+ self.health += damage;
+ self.velocityX += knockbackX * (1 + self.health / 50) / self.knockbackResistance;
+ self.velocityY += knockbackY * (1 + self.health / 50) / self.knockbackResistance;
+ // Flash effect when hit
+ LK.effects.flashObject(self, 0xff0000, 300);
+ self.invulnerable = true;
+ LK.setTimeout(function () {
+ self.invulnerable = false;
+ }, 500);
+ LK.getSound('hit').play();
+ };
+ self.attack = function (targetX, targetY) {
+ var attackRange = 150;
+ var damage = 15;
+ var baseKnockback = 12;
+ for (var i = 0; i < fighters.length; i++) {
+ var target = fighters[i];
+ if (target === self) continue;
+ var distance = Math.sqrt(Math.pow(target.x - self.x, 2) + Math.pow(target.y - self.y, 2));
+ if (distance <= attackRange) {
+ var angle = Math.atan2(target.y - self.y, target.x - self.x);
+ var knockbackX = Math.cos(angle) * baseKnockback;
+ var knockbackY = Math.sin(angle) * baseKnockback - 5; // Slight upward angle
+ target.takeDamage(damage, knockbackX, knockbackY);
+ }
+ }
+ };
+ self.update = function () {
+ // Apply gravity
+ if (!self.onGround) {
+ self.velocityY += 1.2;
+ }
+ // Apply friction
+ self.velocityX *= 0.85;
+ if (self.onGround) {
+ self.velocityX *= 0.75;
+ }
+ // Update position
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Platform collision
+ self.onGround = false;
+ for (var i = 0; i < platforms.length; i++) {
+ var platform = platforms[i];
+ if (self.x > platform.x - platform.width / 2 && self.x < platform.x + platform.width / 2 && self.y > platform.y - platform.height && self.y < platform.y + 10 && self.velocityY > 0) {
+ self.y = platform.y - platform.height;
+ self.velocityY = 0;
+ self.onGround = true;
+ break;
+ }
+ }
+ // Check if fallen off screen
+ if (self.y > 2900) {
+ self.respawn();
+ }
+ // Screen boundaries (horizontal bouncing)
+ if (self.x < 60) {
+ self.x = 60;
+ self.velocityX = Math.abs(self.velocityX) * 0.5;
+ }
+ if (self.x > 1988) {
+ self.x = 1988;
+ self.velocityX = -Math.abs(self.velocityX) * 0.5;
+ }
+ };
+ self.respawn = function () {
+ self.x = self.playerNumber === 1 ? 400 : 1648;
+ self.y = 1000;
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.health = 0;
+ if (self.playerNumber === 1) {
+ player2Wins++;
+ } else {
+ player1Wins++;
+ }
+ updateScoreDisplay();
+ if (player1Wins >= 3 || player2Wins >= 3) {
+ if (player1Wins >= 3) {
+ LK.setScore(100);
+ }
+ LK.showGameOver();
+ }
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerupGraphics = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.lifeTime = 0;
+ self.maxLifeTime = 600; // 10 seconds at 60fps
+ self.collected = false;
+ self.update = function () {
+ self.lifeTime++;
+ self.rotation += 0.05;
+ // Bounce effect
+ self.y += Math.sin(self.lifeTime * 0.1) * 0.5;
+ if (self.lifeTime > self.maxLifeTime) {
+ self.destroy();
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ if (powerups[i] === self) {
+ powerups.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Check collection by players
+ if (!self.collected) {
+ for (var i = 0; i < fighters.length; i++) {
+ var fighter = fighters[i];
+ var distance = Math.sqrt(Math.pow(fighter.x - self.x, 2) + Math.pow(fighter.y - self.y, 2));
+ if (distance < 80) {
+ self.collected = true;
+ fighter.knockbackResistance = 0.5; // Temporary power boost
+ LK.setTimeout(function () {
+ fighter.knockbackResistance = 1.0;
+ }, 5000);
+ LK.getSound('powerup').play();
+ LK.effects.flashObject(fighter, 0xffd700, 500);
+ self.destroy();
+ for (var j = powerups.length - 1; j >= 0; j--) {
+ if (powerups[j] === self) {
+ powerups.splice(j, 1);
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87ceeb
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var fighters = [];
+var platforms = [];
+var powerups = [];
+var player1Wins = 0;
+var player2Wins = 0;
+var draggedFighter = null;
+var lastTapTime = 0;
+var powerupSpawnTimer = 0;
+// Create platforms
+var mainPlatform = game.addChild(LK.getAsset('mainPlatform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1400
+}));
+platforms.push(mainPlatform);
+var leftPlatform = game.addChild(LK.getAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 400,
+ y: 1100
+}));
+platforms.push(leftPlatform);
+var rightPlatform = game.addChild(LK.getAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1648,
+ y: 1100
+}));
+platforms.push(rightPlatform);
+var topPlatform = game.addChild(LK.getAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 800
+}));
+platforms.push(topPlatform);
+// Create fighters
+var player1 = game.addChild(new Fighter(1));
+player1.x = 400;
+player1.y = 1000;
+fighters.push(player1);
+var player2 = game.addChild(new Fighter(2));
+player2.x = 1648;
+player2.y = 1000;
+fighters.push(player2);
+// UI Elements
+var scoreText = new Text2('Player 1: 0 | Player 2: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+var instructionText = new Text2('Drag to move, Tap to attack', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+instructionText.anchor.set(0.5, 1);
+LK.gui.bottom.addChild(instructionText);
+function updateScoreDisplay() {
+ scoreText.setText('Player 1: ' + player1Wins + ' | Player 2: ' + player2Wins);
+}
+function spawnPowerUp() {
+ if (powerups.length < 2) {
+ var powerup = game.addChild(new PowerUp());
+ var spawnPlatform = platforms[Math.floor(Math.random() * platforms.length)];
+ powerup.x = spawnPlatform.x + (Math.random() - 0.5) * (spawnPlatform.width - 100);
+ powerup.y = spawnPlatform.y - spawnPlatform.height - 100;
+ powerups.push(powerup);
+ }
+}
+// Game controls
+game.down = function (x, y, obj) {
+ var currentTime = LK.ticks;
+ var tapSpeed = 20; // frames between taps for double tap
+ // Find closest fighter to touch point
+ var closestFighter = null;
+ var closestDistance = Infinity;
+ for (var i = 0; i < fighters.length; i++) {
+ var fighter = fighters[i];
+ var distance = Math.sqrt(Math.pow(fighter.x - x, 2) + Math.pow(fighter.y - y, 2));
+ if (distance < closestDistance && distance < 200) {
+ closestDistance = distance;
+ closestFighter = fighter;
+ }
+ }
+ if (closestFighter) {
+ // Check for double tap (attack)
+ if (currentTime - lastTapTime < tapSpeed) {
+ closestFighter.attack(x, y);
+ draggedFighter = null;
+ } else {
+ draggedFighter = closestFighter;
+ }
+ lastTapTime = currentTime;
+ }
+};
+game.move = function (x, y, obj) {
+ if (draggedFighter) {
+ var deltaX = x - draggedFighter.x;
+ var deltaY = y - draggedFighter.y;
+ // Move fighter towards touch point
+ draggedFighter.velocityX += deltaX * 0.3;
+ // Jump if dragging upward and on ground
+ if (deltaY < -50 && draggedFighter.onGround) {
+ draggedFighter.velocityY = -draggedFighter.jumpPower;
+ draggedFighter.onGround = false;
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ draggedFighter = null;
+};
+game.update = function () {
+ // Spawn power-ups occasionally
+ powerupSpawnTimer++;
+ if (powerupSpawnTimer > 300) {
+ // Every 5 seconds
+ if (Math.random() < 0.3) {
+ spawnPowerUp();
+ }
+ powerupSpawnTimer = 0;
+ }
+ // Update all fighters
+ for (var i = 0; i < fighters.length; i++) {
+ fighters[i].update();
+ }
+ // Update all powerups
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ if (powerups[i] && !powerups[i].destroyed) {
+ powerups[i].update();
+ }
+ }
+};
\ No newline at end of file
Slime azul, pixelart. In-Game asset. 2d. High contrast. No shadows
Slime rojo, pixelart. In-Game asset. 2d. High contrast. No shadows
Slime amarillo, pixelart. In-Game asset. 2d. High contrast. No shadows
Slime verde, pixelart. In-Game asset. 2d. High contrast. No shadows
Montañas en atardecer pixelart. In-Game asset. 2d. High contrast. No shadows
Elimina la montaña
Burbuja azul, una , pixelart. In-Game asset. 2d. High contrast. No shadows
Esfera amarilla con la letra P , pixelart. In-Game asset. 2d. High contrast. No shadows
Flecha azul de Slime , pixelart. In-Game asset. 2d. High contrast. No shadows
Cámbiale el color a rojo , pixelart
Cámbiale el color a amarillo, pixelart
Cámbiale el color a verde, pixelart
Apaga las luces de la ventanas
Luciérnaga, pixelart. In-Game asset. 2d. High contrast. No shadows
Cabeza de girasol, pixelart. In-Game asset. 2d. High contrast. No shadows
Número 1 azul , pixelart. In-Game asset. 2d. High contrast. No shadows
Número 0 azul, pixelart. In-Game asset. 2d. High contrast. No shadows
Número 3 azul, pixelart. In-Game asset. 2d. High contrast. No shadows
Retro, pixelart