Compañeros tengo problemas con mi personaje:
1. Cuando colisiona con el bloque (suelo) pero en los lados, por ejemplo si hay escalones, se queda en las esquinas del bloque parpadeando animaciones entre salto y caminar.
2. Cuando me pego a un lado del bloque de colisión y mientras mantengo presionado "avanzar" presiono "saltar", el personaje da un pequeño brinco pero automaticamente se empuja hacia el suelo (posición donde estaba)
Éste es el código que estoy utilizando:
EVENT COLLISION
[gml]
move_contact_solid(direction, 12)
vspeed= 0;
[/gml]
EVENT KEY_PRESS
[gml]
move_contact_solid(direction, 12)
vspeed= 0;
[/gml]
No sé si lo explique bien, pero aquí les dejo una muestra de como se ve el problema al probarlo y una imagen de la máscara del personaje y del objeto sólido.
Espero puedan ayudarme.
Hola Luis En! Creo que podés intentar esto:
//Colision horizontal
if (place_meeting(x+hspeed,y,obj_hitbox)){
while (!place_meeting(x+sign(hspeed),y,obj_hitbox)) {x += sign(hspeed);}
hspeed = 0;
}
//Colision vertical
if (place_meeting(x,y+vspeed,obj_hitbox)){
while (!place_meeting(x,y+sign(vspeed),obj_hitbox)) {y += sign(vspeed);}
vspeed = 0;
}
Analizando el código (hortizontal):
if (place_meeting(x+hspeed,y,obj_hitbox))
Esto detecta si en x + la velocidad horizontal hay un obj_hitbox. Entonces:
while (!place_meeting(x+sign(hspeed),y,obj_hitbox)) {x += sign(hspeed);}
Mientras no esté tocando al objeto en x + sign(hspeed) [Lo que hace sign es tomar un número, en este caso hspeed, y devolver su signo. Si hspeed es -3, entonces devuelve -1.], entonces a x le añade 1 en la dirección del hspeed. Luego:
hspeed = 0;
Cambia la velocidad horizontal a 0.
Sucede lo mismo en la vspeed.
Este código tiene un error en las colisiones diagonales, pero siempre fue el que yo usé.
Espero que te sirva!
Cita de: Hezz en Agosto 11, 2018, 05:19:35 PM
Hola Luis En! Creo que podés intentar esto:
//Colision horizontal
if (place_meeting(x+hspeed,y,obj_hitbox)){
while (!place_meeting(x+sign(hspeed),y,obj_hitbox)) {x += sign(hspeed);}
hspeed = 0;
}
//Colision vertical
if (place_meeting(x,y+vspeed,obj_hitbox)){
while (!place_meeting(x,y+sign(vspeed),obj_hitbox)) {y += sign(vspeed);}
vspeed = 0;
}
Analizando el código (hortizontal):
if (place_meeting(x+hspeed,y,obj_hitbox))
Esto detecta si en x + la velocidad horizontal hay un obj_hitbox. Entonces:
while (!place_meeting(x+sign(hspeed),y,obj_hitbox)) {x += sign(hspeed);}
Mientras no esté tocando al objeto en x + sign(hspeed) [Lo que hace sign es tomar un número, en este caso hspeed, y devolver su signo. Si hspeed es -3, entonces devuelve -1.], entonces a x le añade 1 en la dirección del hspeed. Luego:
hspeed = 0;
Cambia la velocidad horizontal a 0.
Sucede lo mismo en la vspeed.
Este código tiene un error en las colisiones diagonales, pero siempre fue el que yo usé.
Espero que te sirva!
Holaaaaaa! lo acabo de probar, y el personaje se me queda pegado al suelo, porque pasa eso? Indagando por ahí, probé en crear un nuevo sprite (Spr_Mask) basado en la silueta del personaje que tengo (Spr_Roboto) y ese nuevo sprite (Spr_Mask) lo establecí como "máscara" del Spr_Roboto, y el problema se soluciono en un 97%, ahora el único pequeño detalle erróneo que tengo es que cuando me acerco a los lados del objeto sólido pero solo desde la izquierda, mientras mantengo presionado la tecla "left" el personaje al colisionar con el bloque "piso" da un pequeño rebote, y mientras lo mantenga presionado "left" se pega pero dando rebotes! Tienes alguna idea de porque sucede eso? No sé si me explique bien XD
Te dejo un ejemplo para que lo veas más claro.
Dejé separado por comentarios al código y el personaje tiene una mask.
Espero que te ayude!!
Cita de: Hezz en Agosto 12, 2018, 07:33:58 AM
Te dejo un ejemplo para que lo veas más claro.
Dejé separado por comentarios al código y el personaje tiene una mask.
Espero que te ayude!!
Genial!!!!! Ahora lo reviso y te aviso como me fue!!! :D