Mi personaje, al chocar con un objeto horizontalmente empieza a parpadear y atraviesa la pared poco a poco en cambio este problema no ocurre cuando choca verticalmente, aquí os dejo el código. Gracias de antemano.
Create:
[gml]//Movimiento
intVY = 0; //VelocidadY
intVX = 0; //VelocidadX
intMove = 0; //Movimiento
intMultipler = 1.0; //Multiplicador
intVYMax = 10 * intMultipler; //VelocidadY máxima
intVXMax = 6.5 * intMultipler; //VelocidadX máxima
intGravityNorm = 0.4 * intMultipler; //Gravedad normal
intGroundAcc = 1.0 * intMultipler; //Acceleración en el suelo
intGroundFric = 1.9 * intMultipler; //Fricción en el suelo
intAirAcc = 0.75 * intMultipler; //Acceleración en el aire
intAirFric = 0.75 * intMultipler; //Fricción en el aire
[/gml]
Step:
[gml]var keyLeft, keyRight, keyJump, keyJumpRelease;
keyLeft = -keyboard_check(vk_left); //Tecla flecha izquierda
keyRight = keyboard_check(vk_right); //Tecla flecha derecha
keyJump = keyboard_check_pressed(vk_up); //Tecla felcha arriba pulsada
keyJumpRelease = keyboard_check_released(vk_up); //Tecla felcha arriba soltada
//Comprobación de colisiones
bolGround = place_meeting(x, y + 1, objBlock); //Contacto con el suelo
intMove = keyLeft + keyRight;
//Definir aceleración y fricción en función del medio
if (!bolGround)
{
intTempAcc = intAirAcc; //Número temporal de aceleración en el aire
intTempFric = intAirFric; //Número temporal de fricción en el aire
}
else
{
intTempAcc = intGroundAcc; //Número temporal de aceleración en el suelo
intTempFric = intGroundFric; //Número temporal de fricción en el suelo
}
//Velocidad horizontal
if (intMove != 0) intVX = scrApproach(intVX, intVXMax * intMove, intTempAcc);
else intVX = scrApproach(intVX, intVXMax * intMove, intTempFric);
//Velocidad vertical
if (!bolGround)
{
intVY = scrApproach(intVY, intVYMax, intGravityNorm); //Caída
}
//Salto
if (keyJump && bolGround) intVY = -intVXMax;
//Colisión horizontal
repeat(abs(intVX))
{
if (place_meeting(x + sign(intVX), y, objBlock))
{
intVX = 0;
}
else x += sign(intVX);
}
//Colisión vertical
repeat(abs(intVY))
{
if (place_meeting(x, y + sign(intVY), objBlock))
{
intVY = 0;
}
else y += sign(intVY);
}
//Animaciones
if (intMove != 0) image_xscale = sign(intVX);
[/gml]
scrApproach:
[gml]if (argument0 < argument1)
return min (argument0 + argument2, argument1);
else
return max (argument0 - argument2, argument1);
[/gml]
Tengo mucho tiempo sin usar GM, pero se que lo que buscas puede ser solucionado con algun engine de "SLOPES".
Como en este video:
https://www.youtube.com/watch?v=UCVImfQ-Fyw
Por ahora solo puedo recomendarte buscar en internet o la sección de descargas.
https://www.comunidadgm.org/index.php?page=verdescargas&accion=descargaD&download_id=1991
Recuerdo haber visto este código en un vídeo de themontydrake.
Pero lo seguí al pie de la letra y no paraba de darme errores.
Creo que hay modos mucho más simples, con menos código, con el que obtener un resultado muy aceptable.
Es necesario que tenga friccion y aceleracion?
Yo seguí el tutorial de TheMontyDrake y me funcionó. De hecho, ahora uso ese código en muchos juegos pero lo modifico un poco.
has probado el codigo de shawn spalding? funciona bastante bien y tiene agregada la friccion en el aire y en el piso solo debes modificar algunas variables, trae el wall jump y doble salto pre agregado
https://www.comunidadgm.org/desarrollo-de-scripts/platformer-'engine'-source-code/