User prompt
Crea un juego llamado "¡Evita las bombas!". El jugador controla un personaje que se mueve a izquierda y derecha. Desde arriba caen bombas de forma aleatoria. Si el personaje toca una bomba, se termina el juego. Cada segundo que el jugador sobrevive, gana 1 punto. El fondo debe parecer el cielo. El personaje puede ser un gato o un robot. Las bombas deben tener un sonido cuando explotan. Al perder, debe mostrarse un mensaje de “¡Game Over!” y permitir reiniciar.
Initial prompt
hola
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Clase para la bomba
var Bomb = Container.expand(function () {
var self = Container.call(this);
self.sprite = self.attachAsset('bomb', {
anchorX: 0.5,
anchorY: 0.5
});
// Velocidad vertical aleatoria (más o menos rápida)
self.speedY = 12 + Math.random() * 8;
// Para detectar colisión solo una vez
self.lastIntersecting = false;
// Actualización por frame
self.update = function () {
self.y += self.speedY;
if (self.sprite) {
if (typeof self.sprite.rotation !== "number") self.sprite.rotation = 0;
self.sprite.rotation += 0.13;
}
};
return self;
});
// Efecto de explosión visual
var Explosion = Container.expand(function () {
var self = Container.call(this);
self.circle = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5,
alpha: 0.7
});
// Animación de expansión y desvanecimiento
self.play = function (x, y, _onFinish) {
self.x = x;
self.y = y;
self.circle.alpha = 0.7;
self.circle.scaleX = 0.5;
self.circle.scaleY = 0.5;
// Efecto de destello blanco detrás de la explosión
var flash = LK.getAsset('skybg', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0,
scaleX: 3,
scaleY: 3
});
flash.tint = 0xffffff;
flash.alpha = 0.7;
self.addChildAt(flash, 0);
tween(flash, {
alpha: 0
}, {
duration: 350,
onFinish: function onFinish() {
flash.destroy();
}
});
tween(self.circle, {
scaleX: 2.5,
scaleY: 2.5,
alpha: 0
}, {
duration: 600,
easing: tween.easeOut,
onFinish: function onFinish() {
if (_onFinish) _onFinish();
self.destroy();
}
});
};
return self;
});
// Clase para el personaje (gato o robot)
var Player = Container.expand(function () {
var self = Container.call(this);
// Por defecto, es gato
self.type = 'cat';
self.sprite = null;
// Inicializa el sprite según el tipo
self.setType = function (type) {
self.type = type;
if (self.sprite) {
self.removeChild(self.sprite);
}
self.sprite = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 1
});
};
// Devuelve el ancho real del sprite
self.getWidth = function () {
return self.sprite ? self.sprite.width : 0;
};
// Devuelve la altura real del sprite
self.getHeight = function () {
return self.sprite ? self.sprite.height : 0;
};
// Inicializa como gato por defecto
self.setType('cat');
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb // Cielo azul claro
});
/****
* Game Code
****/
// Nuevos personajes extra
// Nuevos personajes
// textura de suelo
// Sonido explosión
// Efecto explosión (círculo rojo)
// Fondo cielo (simple rectángulo azul claro)
// Bombas
// Personajes
// Fondo cielo (no interactivo, solo visual)
var skybg = LK.getAsset('skybg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(skybg);
// Suelo con textura independiente en la parte inferior
var groundTex = LK.getAsset('groundtex', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 2732 - 180
});
game.addChild(groundTex);
// (El suelo verde ha sido eliminado)
// Variables globales
var player = null;
var bombs = [];
var score = 0;
var scoreTxt = null;
var gameStarted = false;
var lastBombSpawnTick = 0;
var bombSpawnInterval = 45; // frames (~0.75s)
var dragTargetX = null;
var dragActive = false;
var lastScoreTick = 0;
var selectedType = null;
var choosePanel = null;
var explosionEffect = null;
// --- Pantalla de selección de personaje ---
function showChoosePanel() {
// Panel semitransparente
choosePanel = new Container();
// Fondo semitransparente
var panelBg = LK.getAsset('skybg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
panelBg.alpha = 0.85;
choosePanel.addChild(panelBg);
// Texto
var txt = new Text2('Elige tu personaje', {
size: 120,
fill: 0x222222,
font: "PressStart2P, 'VT323', 'Pixel', 'Courier New', monospace",
fontWeight: 'bold'
});
txt.anchor.set(0.5, 0);
txt.x = 2048 / 2;
txt.y = 400;
choosePanel.addChild(txt);
// Lista de personajes y sus assets
var characterOptions = [{
key: 'cat',
label: 'Gato',
asset: 'cat'
}, {
key: 'robot',
label: 'Robot',
asset: 'robot'
}, {
key: 'frog',
label: 'Rana',
asset: 'frog'
}, {
key: 'fox',
label: 'Zorro',
asset: 'fox'
}, {
key: 'alien',
label: 'Alien',
asset: 'alien'
}, {
key: 'wizard',
label: 'Mago',
asset: 'wizard'
}, {
key: 'penguin',
label: 'Pingüino',
asset: 'penguin'
}, {
key: 'cube',
label: 'Cubo',
asset: 'cube'
}, {
key: 'ghost',
label: 'Fantasma',
asset: 'ghost'
}, {
key: 'pirate',
label: 'Pirata',
asset: 'pirate'
}, {
key: 'ninja',
label: 'Ninja',
asset: 'ninja'
}, {
key: 'unicorn',
label: 'Unicornio',
asset: 'unicorn'
},
// Nuevos personajes extra
{
key: 'vampire',
label: 'Vampiro',
asset: 'vampire'
}, {
key: 'duck',
label: 'Pato',
asset: 'duck'
}, {
key: 'dog',
label: 'Perro',
asset: 'dog'
}, {
key: 'alien2',
label: 'Alien2',
asset: 'alien2'
}];
// Posiciones para los personajes (en cuadrícula tipo armario)
var gridCols = 4;
var gridRows = 2;
var cellW = 340;
var cellH = 400;
var gridStartX = (2048 - gridCols * cellW) / 2 + cellW / 2;
var gridStartY = 950;
for (var i = 0; i < characterOptions.length; i++) {
var opt = characterOptions[i];
var col = i % gridCols;
var row = Math.floor(i / gridCols);
var x = gridStartX + col * cellW;
var y = gridStartY + row * cellH;
// Crea el botón del personaje
var btn = LK.getAsset(opt.asset, {
anchorX: 0.5,
anchorY: 0.5,
x: x,
y: y
});
btn.interactive = true;
btn.buttonMode = true;
btn._charKey = opt.key;
choosePanel.addChild(btn);
// Sin animación: los personajes permanecen estáticos
btn.x = x;
btn.alpha = 1;
// Etiqueta pixel art
var label = new Text2(opt.label, {
size: 80,
fill: 0x333333,
font: "PressStart2P, 'VT323', 'Pixel', 'Courier New', monospace",
fontWeight: 'bold'
});
label.anchor.set(0.5, 0);
label.x = x;
label.y = y + 160;
choosePanel.addChild(label);
// Listener de selección
btn.down = function (key) {
return function (x, y, obj) {
startGame(key);
};
}(opt.key);
}
// No se requiere animación en la pantalla de selección
choosePanel.update = function () {};
game.addChild(choosePanel);
}
// --- Iniciar juego ---
function startGame(type) {
// Eliminar panel de selección
if (choosePanel) {
choosePanel.destroy();
choosePanel = null;
}
// Inicializar jugador
player = new Player();
player.setType(type);
player.x = 2048 / 2;
// Posiciona el personaje otro poquito más arriba del suelo (más arriba que antes, solo un poquito)
var groundY = 2732 - 180; // Y del suelo
var playerHeight = player.getHeight();
// Subimos el personaje 65px respecto al suelo (antes era 55)
player.y = groundY + 0.5 * playerHeight - 65; // El anchorY es 1, así que la base del sprite está en y
game.addChild(player);
// Inicializar score
score = 0;
if (scoreTxt) {
scoreTxt.destroy();
}
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF,
font: "PressStart2P, 'VT323', 'Pixel', 'Courier New', monospace",
fontWeight: 'bold'
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Reset bombas
for (var i = 0; i < bombs.length; i++) {
bombs[i].destroy();
}
bombs = [];
// Reset ticks
lastBombSpawnTick = LK.ticks;
lastScoreTick = LK.ticks;
// Estado
gameStarted = true;
selectedType = type;
dragTargetX = null;
dragActive = false;
}
// --- Game Over ---
function triggerGameOver() {
gameStarted = false;
// Efecto explosión visual
if (explosionEffect) {
explosionEffect.destroy();
}
explosionEffect = new Explosion();
game.addChild(explosionEffect);
explosionEffect.play(player.x, player.y - player.getHeight() / 2, function () {
// Nada extra
});
// Sonido explosión
LK.getSound('explosion').play();
// Flash pantalla más fuerte y vibración
LK.effects.flashScreen(0xff0000, 1000);
if (typeof LK.effects.vibrate === "function") {
LK.effects.vibrate(400);
}
// Sacudir la pantalla con tween
if (typeof tween === "function") {
var _doShake = function doShake() {
if (shakeIndex >= shakeTimes) {
game.x = originalX;
game.y = originalY;
return;
}
var angle = Math.random() * Math.PI * 2;
var dx = Math.cos(angle) * shakeAmount;
var dy = Math.sin(angle) * shakeAmount;
tween(game, {
x: originalX + dx,
y: originalY + dy
}, {
duration: shakeStep / 2,
onFinish: function onFinish() {
tween(game, {
x: originalX,
y: originalY
}, {
duration: shakeStep / 2,
onFinish: function onFinish() {
shakeIndex++;
_doShake();
}
});
}
});
};
var originalX = game.x || 0;
var originalY = game.y || 0;
var shakeAmount = 32;
var shakeTimes = 8;
var shakeDuration = 400;
var shakeStep = shakeDuration / shakeTimes;
var shakeIndex = 0;
_doShake();
}
// Mostrar Game Over (el engine lo maneja)
LK.setTimeout(function () {
LK.showGameOver();
}, 700);
}
// --- Spawnear bomba ---
function spawnBomb() {
var bomb = new Bomb();
// Posición X aleatoria, pero dentro de los bordes
var margin = 120;
var minX = margin;
var maxX = 2048 - margin;
bomb.x = minX + Math.random() * (maxX - minX);
bomb.y = -80; // Arriba de la pantalla
bombs.push(bomb);
game.addChild(bomb);
}
// --- Actualización principal ---
game.update = function () {
// Animar personajes en la pantalla de selección si está activa
if (choosePanel && choosePanel.update) choosePanel.update();
if (!gameStarted) return;
// Spawnear bombas cada cierto tiempo
if (LK.ticks - lastBombSpawnTick > bombSpawnInterval) {
spawnBomb();
lastBombSpawnTick = LK.ticks;
}
// Sumar score cada segundo
if (LK.ticks - lastScoreTick >= 60) {
score += 1;
scoreTxt.setText(score);
lastScoreTick = LK.ticks;
}
// Actualizar bombas
for (var i = bombs.length - 1; i >= 0; i--) {
var bomb = bombs[i];
bomb.update();
// Si sale de pantalla, eliminar
if (bomb.y > 2732 + 100) {
bomb.destroy();
bombs.splice(i, 1);
continue;
}
// Colisión con jugador
var intersect = player && bomb.intersects(player);
if (!bomb.lastIntersecting && intersect) {
// Eliminar todas las bombas inmediatamente
for (var j = bombs.length - 1; j >= 0; j--) {
bombs[j].destroy();
}
bombs = [];
// Explosión y game over
triggerGameOver();
return;
}
bomb.lastIntersecting = intersect;
}
// Movimiento del jugador (drag)
if (dragActive && dragTargetX !== null) {
// Suavizar movimiento horizontal
var dx = dragTargetX - player.x;
var speed = 0.32 * dx;
if (Math.abs(dx) > 8) {
player.x += speed;
} else {
player.x = dragTargetX;
}
// Limitar a bordes
var halfW = player.getWidth() / 2;
if (player.x < halfW + 30) player.x = halfW + 30;
if (player.x > 2048 - halfW - 30) player.x = 2048 - halfW - 30;
}
};
// --- Control táctil: mover jugador horizontalmente ---
// Permite mover el personaje a izquierda y derecha con controles táctiles (drag horizontal)
function handleMove(x, y, obj) {
if (!gameStarted) return;
if (!player) return;
// Permite mover el personaje a izquierda y derecha con controles táctiles (drag horizontal)
dragActive = true;
dragTargetX = x;
}
game.move = function (x, y, obj) {
handleMove(x, y, obj);
};
game.down = function (x, y, obj) {
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragActive = false;
dragTargetX = null;
};
// --- Iniciar con pantalla de selección ---
showChoosePanel(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Clase para la bomba
var Bomb = Container.expand(function () {
var self = Container.call(this);
self.sprite = self.attachAsset('bomb', {
anchorX: 0.5,
anchorY: 0.5
});
// Velocidad vertical aleatoria (más o menos rápida)
self.speedY = 12 + Math.random() * 8;
// Para detectar colisión solo una vez
self.lastIntersecting = false;
// Actualización por frame
self.update = function () {
self.y += self.speedY;
if (self.sprite) {
if (typeof self.sprite.rotation !== "number") self.sprite.rotation = 0;
self.sprite.rotation += 0.13;
}
};
return self;
});
// Efecto de explosión visual
var Explosion = Container.expand(function () {
var self = Container.call(this);
self.circle = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5,
alpha: 0.7
});
// Animación de expansión y desvanecimiento
self.play = function (x, y, _onFinish) {
self.x = x;
self.y = y;
self.circle.alpha = 0.7;
self.circle.scaleX = 0.5;
self.circle.scaleY = 0.5;
// Efecto de destello blanco detrás de la explosión
var flash = LK.getAsset('skybg', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0,
scaleX: 3,
scaleY: 3
});
flash.tint = 0xffffff;
flash.alpha = 0.7;
self.addChildAt(flash, 0);
tween(flash, {
alpha: 0
}, {
duration: 350,
onFinish: function onFinish() {
flash.destroy();
}
});
tween(self.circle, {
scaleX: 2.5,
scaleY: 2.5,
alpha: 0
}, {
duration: 600,
easing: tween.easeOut,
onFinish: function onFinish() {
if (_onFinish) _onFinish();
self.destroy();
}
});
};
return self;
});
// Clase para el personaje (gato o robot)
var Player = Container.expand(function () {
var self = Container.call(this);
// Por defecto, es gato
self.type = 'cat';
self.sprite = null;
// Inicializa el sprite según el tipo
self.setType = function (type) {
self.type = type;
if (self.sprite) {
self.removeChild(self.sprite);
}
self.sprite = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 1
});
};
// Devuelve el ancho real del sprite
self.getWidth = function () {
return self.sprite ? self.sprite.width : 0;
};
// Devuelve la altura real del sprite
self.getHeight = function () {
return self.sprite ? self.sprite.height : 0;
};
// Inicializa como gato por defecto
self.setType('cat');
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb // Cielo azul claro
});
/****
* Game Code
****/
// Nuevos personajes extra
// Nuevos personajes
// textura de suelo
// Sonido explosión
// Efecto explosión (círculo rojo)
// Fondo cielo (simple rectángulo azul claro)
// Bombas
// Personajes
// Fondo cielo (no interactivo, solo visual)
var skybg = LK.getAsset('skybg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(skybg);
// Suelo con textura independiente en la parte inferior
var groundTex = LK.getAsset('groundtex', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 2732 - 180
});
game.addChild(groundTex);
// (El suelo verde ha sido eliminado)
// Variables globales
var player = null;
var bombs = [];
var score = 0;
var scoreTxt = null;
var gameStarted = false;
var lastBombSpawnTick = 0;
var bombSpawnInterval = 45; // frames (~0.75s)
var dragTargetX = null;
var dragActive = false;
var lastScoreTick = 0;
var selectedType = null;
var choosePanel = null;
var explosionEffect = null;
// --- Pantalla de selección de personaje ---
function showChoosePanel() {
// Panel semitransparente
choosePanel = new Container();
// Fondo semitransparente
var panelBg = LK.getAsset('skybg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
panelBg.alpha = 0.85;
choosePanel.addChild(panelBg);
// Texto
var txt = new Text2('Elige tu personaje', {
size: 120,
fill: 0x222222,
font: "PressStart2P, 'VT323', 'Pixel', 'Courier New', monospace",
fontWeight: 'bold'
});
txt.anchor.set(0.5, 0);
txt.x = 2048 / 2;
txt.y = 400;
choosePanel.addChild(txt);
// Lista de personajes y sus assets
var characterOptions = [{
key: 'cat',
label: 'Gato',
asset: 'cat'
}, {
key: 'robot',
label: 'Robot',
asset: 'robot'
}, {
key: 'frog',
label: 'Rana',
asset: 'frog'
}, {
key: 'fox',
label: 'Zorro',
asset: 'fox'
}, {
key: 'alien',
label: 'Alien',
asset: 'alien'
}, {
key: 'wizard',
label: 'Mago',
asset: 'wizard'
}, {
key: 'penguin',
label: 'Pingüino',
asset: 'penguin'
}, {
key: 'cube',
label: 'Cubo',
asset: 'cube'
}, {
key: 'ghost',
label: 'Fantasma',
asset: 'ghost'
}, {
key: 'pirate',
label: 'Pirata',
asset: 'pirate'
}, {
key: 'ninja',
label: 'Ninja',
asset: 'ninja'
}, {
key: 'unicorn',
label: 'Unicornio',
asset: 'unicorn'
},
// Nuevos personajes extra
{
key: 'vampire',
label: 'Vampiro',
asset: 'vampire'
}, {
key: 'duck',
label: 'Pato',
asset: 'duck'
}, {
key: 'dog',
label: 'Perro',
asset: 'dog'
}, {
key: 'alien2',
label: 'Alien2',
asset: 'alien2'
}];
// Posiciones para los personajes (en cuadrícula tipo armario)
var gridCols = 4;
var gridRows = 2;
var cellW = 340;
var cellH = 400;
var gridStartX = (2048 - gridCols * cellW) / 2 + cellW / 2;
var gridStartY = 950;
for (var i = 0; i < characterOptions.length; i++) {
var opt = characterOptions[i];
var col = i % gridCols;
var row = Math.floor(i / gridCols);
var x = gridStartX + col * cellW;
var y = gridStartY + row * cellH;
// Crea el botón del personaje
var btn = LK.getAsset(opt.asset, {
anchorX: 0.5,
anchorY: 0.5,
x: x,
y: y
});
btn.interactive = true;
btn.buttonMode = true;
btn._charKey = opt.key;
choosePanel.addChild(btn);
// Sin animación: los personajes permanecen estáticos
btn.x = x;
btn.alpha = 1;
// Etiqueta pixel art
var label = new Text2(opt.label, {
size: 80,
fill: 0x333333,
font: "PressStart2P, 'VT323', 'Pixel', 'Courier New', monospace",
fontWeight: 'bold'
});
label.anchor.set(0.5, 0);
label.x = x;
label.y = y + 160;
choosePanel.addChild(label);
// Listener de selección
btn.down = function (key) {
return function (x, y, obj) {
startGame(key);
};
}(opt.key);
}
// No se requiere animación en la pantalla de selección
choosePanel.update = function () {};
game.addChild(choosePanel);
}
// --- Iniciar juego ---
function startGame(type) {
// Eliminar panel de selección
if (choosePanel) {
choosePanel.destroy();
choosePanel = null;
}
// Inicializar jugador
player = new Player();
player.setType(type);
player.x = 2048 / 2;
// Posiciona el personaje otro poquito más arriba del suelo (más arriba que antes, solo un poquito)
var groundY = 2732 - 180; // Y del suelo
var playerHeight = player.getHeight();
// Subimos el personaje 65px respecto al suelo (antes era 55)
player.y = groundY + 0.5 * playerHeight - 65; // El anchorY es 1, así que la base del sprite está en y
game.addChild(player);
// Inicializar score
score = 0;
if (scoreTxt) {
scoreTxt.destroy();
}
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF,
font: "PressStart2P, 'VT323', 'Pixel', 'Courier New', monospace",
fontWeight: 'bold'
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Reset bombas
for (var i = 0; i < bombs.length; i++) {
bombs[i].destroy();
}
bombs = [];
// Reset ticks
lastBombSpawnTick = LK.ticks;
lastScoreTick = LK.ticks;
// Estado
gameStarted = true;
selectedType = type;
dragTargetX = null;
dragActive = false;
}
// --- Game Over ---
function triggerGameOver() {
gameStarted = false;
// Efecto explosión visual
if (explosionEffect) {
explosionEffect.destroy();
}
explosionEffect = new Explosion();
game.addChild(explosionEffect);
explosionEffect.play(player.x, player.y - player.getHeight() / 2, function () {
// Nada extra
});
// Sonido explosión
LK.getSound('explosion').play();
// Flash pantalla más fuerte y vibración
LK.effects.flashScreen(0xff0000, 1000);
if (typeof LK.effects.vibrate === "function") {
LK.effects.vibrate(400);
}
// Sacudir la pantalla con tween
if (typeof tween === "function") {
var _doShake = function doShake() {
if (shakeIndex >= shakeTimes) {
game.x = originalX;
game.y = originalY;
return;
}
var angle = Math.random() * Math.PI * 2;
var dx = Math.cos(angle) * shakeAmount;
var dy = Math.sin(angle) * shakeAmount;
tween(game, {
x: originalX + dx,
y: originalY + dy
}, {
duration: shakeStep / 2,
onFinish: function onFinish() {
tween(game, {
x: originalX,
y: originalY
}, {
duration: shakeStep / 2,
onFinish: function onFinish() {
shakeIndex++;
_doShake();
}
});
}
});
};
var originalX = game.x || 0;
var originalY = game.y || 0;
var shakeAmount = 32;
var shakeTimes = 8;
var shakeDuration = 400;
var shakeStep = shakeDuration / shakeTimes;
var shakeIndex = 0;
_doShake();
}
// Mostrar Game Over (el engine lo maneja)
LK.setTimeout(function () {
LK.showGameOver();
}, 700);
}
// --- Spawnear bomba ---
function spawnBomb() {
var bomb = new Bomb();
// Posición X aleatoria, pero dentro de los bordes
var margin = 120;
var minX = margin;
var maxX = 2048 - margin;
bomb.x = minX + Math.random() * (maxX - minX);
bomb.y = -80; // Arriba de la pantalla
bombs.push(bomb);
game.addChild(bomb);
}
// --- Actualización principal ---
game.update = function () {
// Animar personajes en la pantalla de selección si está activa
if (choosePanel && choosePanel.update) choosePanel.update();
if (!gameStarted) return;
// Spawnear bombas cada cierto tiempo
if (LK.ticks - lastBombSpawnTick > bombSpawnInterval) {
spawnBomb();
lastBombSpawnTick = LK.ticks;
}
// Sumar score cada segundo
if (LK.ticks - lastScoreTick >= 60) {
score += 1;
scoreTxt.setText(score);
lastScoreTick = LK.ticks;
}
// Actualizar bombas
for (var i = bombs.length - 1; i >= 0; i--) {
var bomb = bombs[i];
bomb.update();
// Si sale de pantalla, eliminar
if (bomb.y > 2732 + 100) {
bomb.destroy();
bombs.splice(i, 1);
continue;
}
// Colisión con jugador
var intersect = player && bomb.intersects(player);
if (!bomb.lastIntersecting && intersect) {
// Eliminar todas las bombas inmediatamente
for (var j = bombs.length - 1; j >= 0; j--) {
bombs[j].destroy();
}
bombs = [];
// Explosión y game over
triggerGameOver();
return;
}
bomb.lastIntersecting = intersect;
}
// Movimiento del jugador (drag)
if (dragActive && dragTargetX !== null) {
// Suavizar movimiento horizontal
var dx = dragTargetX - player.x;
var speed = 0.32 * dx;
if (Math.abs(dx) > 8) {
player.x += speed;
} else {
player.x = dragTargetX;
}
// Limitar a bordes
var halfW = player.getWidth() / 2;
if (player.x < halfW + 30) player.x = halfW + 30;
if (player.x > 2048 - halfW - 30) player.x = 2048 - halfW - 30;
}
};
// --- Control táctil: mover jugador horizontalmente ---
// Permite mover el personaje a izquierda y derecha con controles táctiles (drag horizontal)
function handleMove(x, y, obj) {
if (!gameStarted) return;
if (!player) return;
// Permite mover el personaje a izquierda y derecha con controles táctiles (drag horizontal)
dragActive = true;
dragTargetX = x;
}
game.move = function (x, y, obj) {
handleMove(x, y, obj);
};
game.down = function (x, y, obj) {
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragActive = false;
dragTargetX = null;
};
// --- Iniciar con pantalla de selección ---
showChoosePanel();
Crea un personaje que sea un gato simpático, estilo pixel art. Debe estar de pie y verse como si pudiera esquivar cosas. Que tenga una expresión divertida o decidida. El fondo debe ser transparente.
Crea un personaje que sea un robot pequeño y amigable. Diseño estilo futurista pero tierno, como un asistente robótico. Que parezca ágil y listo para esquivar bombas. Estilo píxel art. Fondo transparente.. In-Game asset. 2d. High contrast. No shadows
Quiero que la explosión tenga un estilo caricaturesco con una gran nube de humo gris, llamas anaranjadas y un destello amarillo brillante en el centro, que dure menos de un segundo; debe verse redonda, con bordes irregulares como una explosión de cómic, incluyendo pequeños fragmentos o chispas que salgan disparados, todo en pixel art, sin realismo, solo visualmente impactante y llamativa.. In-Game asset. 2d. High contrast. No shadows
La bomba debe tener un diseño caricaturesco, en forma de esfera negra o gris oscuro con un brillo suave, una mecha encendida con fuego animado en la punta, y si es posible, una carita enojada o con expresión divertida; su estilo debe pixel art limpio, con líneas simples y colores llamativos para que resalte bien contra el fondo del cielo, y debe tener un ligero giro o movimiento mientras cae para darle vida.. In-Game asset. 2d. High contrast. No shadows
El cielo debe ser un fondo claro y agradable, de color azul celeste con un suave degradado hacia un azul más claro en la parte inferior, acompañado de algunas nubes blancas esponjosas flotando lentamente para dar una sensación de movimiento y vida; todo en pixel art, sin muchos detalles, con un ambiente brillante, alegre y apto para un juego casual visualmente amigable.. In-Game asset. 2d. High contrast. No shadows
El suelo debe ser una plataforma horizontal clara y visible en la parte inferior de la pantalla, con diseño tipo césped verde brillante sobre tierra marrón, estilo pixel art, con bordes irregulares o redondeados para que no se vea plano ni rígido; puede tener pequeños detalles como piedritas o raíces, pero sin recargarlo, y debe contrastar bien con el cielo para que el personaje destaque al caminar sobre él.. In-Game asset. 2d. High contrast. No shadows
La rana debe ser un personaje simpático de color verde brillante, con ojos grandes y expresivos que miran al frente, mejillas redondeadas y una sonrisa divertida; su cuerpo debe ser compacto y ligeramente ovalado, con patas traseras marcadas pero no exageradas, diseñada en estilo pixel art, y puede tener una pequeña animación de parpadeo o un leve rebote para darle vida; el fondo debe ser transparente y el estilo visual debe coincidir con un juego colorido y casual.. In-Game asset. 2d. High contrast. No shadows
El zorro debe ser un personaje ágil y simpático, de color naranja con detalles blancos en la cara, pecho y punta de la cola, orejas grandes y puntiagudas, ojos vivaces y una expresión decidida pero amigable; su cuerpo debe ser estilizado pero caricaturesco, con una gran cola curva que le dé personalidad, y puede tener una pequeña animación como mover la cola o parpadear; el estilo debe ser pixel art suave, con fondo transparente y colores vivos que lo hagan destacar en un entorno claro y alegre.. In-Game asset. 2d. High contrast. No shadows
El alien debe ser un personaje pequeño y tierno, con piel verde o azul brillante, cabeza grande en forma ovalada, ojos negros y brillantes de estilo caricatura, y dos antenitas cortas que se muevan ligeramente; su cuerpo debe ser redondeado y compacto, con brazos y piernas cortas, dando una apariencia amigable y divertida; el diseño debe ser en estilo 2D o pixel art suave, con una animación sutil como parpadeo o balanceo, y fondo transparente para integrarse bien en un juego colorido y casual.. In-Game asset. 2d. High contrast. No shadows
El mago debe ser un personaje pequeño y encantador, con una túnica azul oscuro o morada, un sombrero puntiagudo con estrellas o una hebilla dorada, barba blanca corta y ojos brillantes que transmitan sabiduría y simpatía; su cuerpo debe ser compacto y redondeado, estilo caricatura o pixel art, con detalles sencillos pero reconocibles como un bastón en la mano o un libro colgando; puede tener una animación sutil como parpadeo, movimiento de barba o chispa mágica en la punta del sombrero, y el fondo debe ser transparente para integrarse bien en un entorno colorido y fantástico. In-Game asset. 2d. High contrast. No shadows
El pingüino debe ser un personaje tierno y redondeado, con cuerpo negro y blanco bien definido, picos y patas naranjas, y ojos grandes y expresivos que transmitan simpatía; puede llevar una bufanda roja o gorrito invernal como detalle extra, y debe tener una animación suave de balanceo lateral o parpadeo para darle vida; el estilo debe ser pixel art limpio, con trazos simples y colores vivos, y el fondo transparente para que se integre perfectamente en un juego casual y alegre. In-Game asset. 2d. High contrast. No shadows
El fantasma debe tener un diseño amigable y en estilo pixel art, con cuerpo flotante de forma ovalada o en forma de gota invertida, color blanco o celeste pálido con bordes suaves y contorno oscuro para resaltar; su cara debe incluir ojos grandes y redondos con expresión simpática o curiosa, y una boca pequeña en forma de sonrisa o círculo; puede tener una animación sutil de flotación vertical, como si levitara suavemente en el aire, y opcionalmente incluir detalles como un leve brillo, transparencia o una colita ondeante en la parte inferior; el fondo debe ser transparente, y su estilo visual debe encajar en un mundo colorido y casual.. In-Game asset. 2d. High contrast. No shadows
El pirata debe ser un personaje simpático y reconocible en estilo pixel art, con sombrero tricornio negro o marrón con una calavera blanca en el centro, un parche en uno de los ojos, barba o bigote corto, y una expresión decidida o divertida; su ropa debe incluir una chaqueta roja o azul, cinturón ancho, pantalones cortos y botas, todo con detalles simples pero claros; puede tener un accesorio como una espada al cinto o un loro en el hombro, y su animación debe mostrarlo caminando o balanceándose ligeramente como si estuviera en un barco; el fondo debe ser transparente y el diseño debe ser compacto, ideal para un juego colorido y caricaturesco.. In-Game asset. 2d. High contrast. No shadows
El ninja debe ser un personaje compacto y ágil en estilo pixel art, con un traje negro o azul oscuro que cubra todo su cuerpo excepto los ojos, los cuales deben ser expresivos y ligeramente entrecerrados para mostrar concentración o determinación; puede tener una banda o pañuelo rojo atado en la frente que se extienda hacia atrás con movimiento, y detalles mínimos como cinturón, guantes o pequeñas armas visibles como una estrella ninja al costado; el diseño debe ser simple pero dinámico, con animación sutil de respiración o movimiento de tela, y fondo transparente, ideal para integrarse en un juego de acción o reflejos con estética caricaturesca o retro.. In-Game asset. 2d. High contrast. No shadows
El unicornio debe ser un personaje adorable y colorido en estilo pixel art, con cuerpo erguido sobre dos patas traseras como si caminara o corriera, crin y cola multicolor en tonos pastel (rosa, celeste, violeta), cuerno dorado o brillante en la frente, y una expresión alegre o soñadora en su rostro; su cuerpo debe ser blanco o lavanda claro, con detalles simples como cascos marcados y orejitas visibles, y su animación puede incluir un suave rebote o movimiento de la crin al desplazarse; el estilo debe ser caricaturesco y alegre, con fondo transparente y un diseño encantador que encaje bien en un juego mágico, infantil o casual.. In-Game asset. 2d. High contrast. No shadows
El vampiro debe ser un personaje pequeño y estilizado en estilo pixel art, con piel pálida o gris clara, ojos rojos o morados brillantes, colmillos visibles en una leve sonrisa y una capa negra o púrpura que se mueva ligeramente al caminar; debe llevar un traje elegante con chaleco rojo, camisa blanca y pantalones oscuros, y tener el clásico peinado de viuda con cabello negro bien marcado; su expresión puede ser confiada o misteriosa, y la animación puede incluir un leve flote o agitación de la capa; todo debe ser caricaturesco y simpático, sin parecer aterrador, con fondo transparente para integrarse en un juego casual o fantástico.. In-Game asset. 2d. High contrast. No shadows
El pato debe ser un personaje simpático y reconocible en estilo pixel art, con cuerpo amarillo redondeado, pico naranja ancho y ojos grandes y amigables; debe estar de pie sobre dos patas naranjas, con pequeñas alas a los costados, y puede tener una expresión alegre o curiosa; su diseño debe ser simple pero encantador, con animación sutil como un leve balanceo, parpadeo o aleteo, y fondo transparente; opcionalmente puede llevar un gorrito, flotador o bufanda para agregar personalidad, siendo perfecto para un juego casual, infantil o humorístico.. In-Game asset. 2d. High contrast. No shadows
El perro debe ser un personaje adorable y expresivo en estilo pixel art, con cuerpo compacto y simpático, orejas grandes (pueden ser caídas o puntiagudas según la raza), ojos redondos y brillantes que transmitan alegría, y una cola visible que se mueva suavemente; su pelaje puede ser marrón, beige, blanco o una combinación simple de colores, con un diseño caricaturesco fácil de reconocer; debe estar de pie sobre dos patas traseras como un personaje antropomorfo, con una leve sonrisa y movimiento de balanceo o parpadeo como animación sutil; el fondo debe ser transparente y su estilo visual debe encajar en un juego casual, amigable y colorido.. In-Game asset. 2d. High contrast. No shadows
El alien debe ser un personaje de aspecto inteligente y misterioso en estilo pixel art, con una gran cabeza semitransparente que permita ver un cerebro rosado o verdoso expuesto, con textura simple y líneas marcadas que lo hagan reconocible; los ojos deben ser grandes, brillantes y expresivos, de color azul, morado o rojo, transmitiendo inteligencia o curiosidad; su cuerpo debe ser delgado o compacto, con brazos largos o dedos visibles, de color verde, gris o púrpura, con detalles mínimos como placas, símbolos alienígenas o un cinturón tecnológico; puede flotar o tener animación de levitación, con fondo transparente y un estilo que combine lo caricaturesco con lo ligeramente inquietante, perfecto para un juego de ciencia ficción o niveles espaciales.. In-Game asset. 2d. High contrast. No shadows
un cuadrado amarillo con ojos cudrados celestes y boca celeste rectangular. In-Game asset. 2d. High contrast. No shadows