A ver si alguna de estas cosas te puede ayusdar a resolver tus problemas.
a hitbox se está configurando después de los colliders
En tu código, primero añades las colisiones:
this.physics.add.collider(this.esqueleto, this.caballero_Idle);
this.physics.add.collider(this.esqueleto, this.mapa);
this.physics.add.collider(this.caballero_Idle, this.mapa);
Luego, más abajo, cambias el tamaño de las hitboxes con:
this.caballero_Idle.setSize(30, 40);
this.caballero_Idle.setOffset(20, 0);
this.esqueleto.setSize(30, 32);
this.esqueleto.setOffset(15, 15);
Esto puede ser un problema, porque Phaser usa los valores actuales de la hitbox cuando se crean los colliders. Si cambias el tamaño de la hitbox después, puede que las colisiones no se comporten como esperas.
Prueba a mover la configuración de la hitbox antes de crear las colisiones:
// Tamaño de las HitBox
this.caballero_Idle.setSize(30, 40);
this.caballero_Idle.setOffset(20, 0);
this.esqueleto.setSize(30, 32);
this.esqueleto.setOffset(15, 15);
// Ahora sí, agregamos colisiones
this.physics.add.collider(this.esqueleto, this.caballero_Idle);
this.physics.add.collider(this.esqueleto, this.mapa);
this.physics.add.collider(this.caballero_Idle, this.mapa);
Verifica setImmovable()
y setSize()
en mapa
**
En tu código, configuras mapa
como inamovible:
this.mapa = this.physics.add.image(0, 800, "mapa").setImmovable();
Pero luego le aplicas setSize()
:
this.mapa.setSize(50, 200);
this.mapa.setOffset(0, 15);
El problema es que las imágenes en Phaser no tienen cuerpos físicos por defecto. Es posible que necesites cambiar this.physics.add.image(...)
por this.physics.add.sprite(...)
para que mapa
tenga físicas correctamente.
Como sugerencia prueba a hacer setImmovable()
después de configurar el tamaño:
this.mapa.setSize(50, 200);
this.mapa.setOffset(0, 15);
this.mapa.setImmovable(true);
allowGravity
en el esqueleto
Parece que estás configurando allowGravity
en false
para el esqueleto
, lo que puede estar evitando colisiones correctas con el suelo (mapa
):
this.esqueleto.body.allowGravity = false;
Igual deberías permitir la gravedad y ajustar velocity.y
si es necesario
Si quieres que el esqueleto
no caiga, prueba usar setImmovable()
en lugar de allowGravity = false
:
this.esqueleto.setImmovable(true);
O bien, si quieres que caiga pero se quede en el suelo, agrégale una velocidad inicial:
this.esqueleto.body.velocity.y = 0;
Si aún sigues teniendo problemas, habilita el modo debug en las físicas para ver si las hitboxes están bien configuradas:
const config = {
type: Phaser.AUTO,
width: window.innerWidth,
height: window.innerHeight,
scene: [Game],
physics: {
default: "arcade",
arcade: {
gravity: { y: 400 },
debug: true // Esto activa el debug
}
}
};
Si las colisiones siguen sin funcionar, revisa la consola cuando activas el debug.a ver si te da alguna info que aclare más el problema.