Junio 18, 2019, 04:38:51 PM Ultima modificación: Julio 02, 2019, 09:32:13 PM por Johann
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/
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!