Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: JackGA17 en Enero 21, 2019, 09:40:30 PM

Título: Problema con colisiones
Publicado por: JackGA17 en Enero 21, 2019, 09:40:30 PM
Hola, verán hace un tiempo pedí ayuda para hacer que mi personaje se moviera con un código especifico, ahora viene algo parecido
//sprites
sprite[0] = argument0; //Derecha
sprite[1] = argument1; //Arriba-Derecha
sprite[2] = argument2; //Arriba
sprite[3] = argument3; //Arriba-Izquierda
sprite[4] = argument4; //Izquierda
sprite[5] = argument5; //Abajo-Izquierda
sprite[6] = argument6; //Abajo
sprite[7] = argument7; //Abajo-Derecha

//Acciones
var up = keyboard_check(vk_up);
var down = keyboard_check(vk_down);
var left = keyboard_check(vk_left);
var right = keyboard_check(vk_right);

//Lados
var Hor = right - left;
var Ver = down  - up;

//Angulo
var angle = point_direction(0, 0, Hor, Ver);

//¿Está activo?
if global.player = 'enabled'{
    //Cambio de animacion y movimeinto
    if abs(Hor) or abs(Ver) {
        image_speed = 0.25;
        sprite_index = sprite[ (angle/ 45) % 8 ];
        x += dcos(angle)*4;
        y -= dsin(angle)*4;
    }else{
        image_speed = 0;
        image_index = 0;
    }
}

Todo ese código está dentro de un script para usar más de un personaje (uno a la vez) sin usar más objetos, mi problema ahora es que he estado intentando combinaciones para las colisiones y nada me funciona, cuando uno funcionó resultó que el personaje se pilla desde arriba de donde colisiona.
Los pongo más en situación, he hecho pruebas para hacer diálogos, pero ahora mi problema es que el personaje debe detenerse al estar cerca de un NPC o de algún objeto con el que va a interactuar. Pero sigue atravesándolo y en la ultima prueba que hice (que después borré el código) se trababa al colisionar desde arriba.

¿Alguien puede ayudarme? Gracias de antemano.
Título: Re:Problema con colisiones
Publicado por: 3dgeminis en Enero 22, 2019, 04:19:10 AM
Verifica primero si hay un obstaculo en cada eje antes de mover:
[gml]
if abs(Hor) or abs(Ver)
   {   
    repeat(4)
       {
        if !place_meeting(x+Hor, y, pared) {x += dcos(angle)};
        if !place_meeting(x, y+Ver, pared) {y -= dsin(angle)};
       }
   }
[/gml]
Título: Re:Problema con colisiones
Publicado por: JackGA17 en Enero 23, 2019, 02:37:37 PM
Cita de: 3dgeminis en Enero 22, 2019, 04:19:10 AM
Verifica primero si hay un obstaculo en cada eje antes de mover:
[gml]
if abs(Hor) or abs(Ver)
   {   
    repeat(4)
       {
        if !place_meeting(x+Hor, y, pared) {x += dcos(angle)};
        if !place_meeting(x, y+Ver, pared) {y -= dsin(angle)};
       }
   }
[/gml]
Lo probé cambiando lo de "pared" por otro objeto y funcionó, pero necesito que sea con cualquier objeto solido, como una caja o en este caso la mascara de colisión de los NPC's, y surgió otro problema al cambiar el objeto por la mascara se vuelve a quedar trabado el personaje
Título: Re:Problema con colisiones
Publicado por: bygdle en Enero 23, 2019, 07:05:49 PM
Puedes reemplazar !place_meeting() por place_free() para incluir a todos los sólidos.
Título: Re:Problema con colisiones
Publicado por: JackGA17 en Enero 23, 2019, 07:09:14 PM
Cita de: NiuWeb en Enero 23, 2019, 07:05:49 PM
Puedes reemplazar !place_meeting() por place_free() para incluir a todos los sólidos.
Lo intenté y ahora falla al andar, no está ni cerca de algún solido y no se mueve, cuando muevo a la derecha se queda como si hubiera un solido y no se mueve a menos mueva de arriba abajo mientras va hacia la derecha
Título: Re:Problema con colisiones
Publicado por: Cuervo57 en Febrero 07, 2019, 10:30:05 AM
si el objeto con el que debe colisionar es sólido el place_free deberia funcionar sin problema, al checar place_free  y retornar  false el personaje se detendrá,  si retorna true seguira andando en la dirección que llevaba.
Título: Re:Problema con colisiones
Publicado por: 3dgeminis en Febrero 07, 2019, 06:42:59 PM
Deberias juntar todos los objetos que se comporten igual bajo un mismo objeto (parent), y usar ese objeto para las colisiones.