Julio 25, 2017, 01:05:05 PM Ultima modificación: Julio 25, 2017, 01:16:36 PM por nonoroman
Bueno familia, otra vez ando por aqui.

El caso es que llevo varias semanas liado con un problema que no entiendo que ocurre.

A ver, el tema esta en tratar de empujar una carreta. El caso es que me funciona perfecto, pero a veces, cuando la empujo del lado derecho hacia la izquierda, a veces no lo hace y otras si.

He estado haciendo pruebas, muchas pruebas para averiguar que pasa, y he descubierto las siguientes cosas;

- Una, el fallo ocurre cuando el player llega por el lado derecho de la carreta, nunca ocurre por el lado izquierdo. (cuando todo esta igual configurado, tanto para un lado como para el otro)

- Dos, el fallo ocurre cuando el player llega corriendo a la carreta (el sprite de correr ocupa mas pixeles que el sprite andando, pero en realidad para las colisiones estoy usando una mask, independiente del sprite)

- tres, he estado midiendo la distancia de la x entre la carreta y el player, y lo que ocurre, es que cuando llega corriendo y se produce el fallo (porque no siempre se produce, solo a veces) la distancia del eje de la x entre el player y la carreta es de 0.50 pixeles menor que cuando no se produce el fallo, es decir, que se cuela medio pixel y se produce el error.

Esto porque ocurre??? y como puedo evitarlo???

He probado con la precision colision, he probado en separar la mask del sprite, he probado mil cosas, y nada. no hay manera.

Alguien me puede ayudar???

Os paso el codigo donde se realiza el empujar a la carreta;

if not place_free(x,y+1)
{
    if keyboard_check(vk_alt)
    {
        if keyboard_check(vk_right) and place_meeting(x-1.55,y,objectPLAYER) //AQUI VA LA DISTANCIA DESDE EL PLAYER AL CARRITO
        {
            if place_free(x+1,y) and (objectPLAYER.izq = 0)
            {
                x += 1;
               
                with (objectPLAYER)
                {
                    empuja = true;
                    x += 1;
                    sprite_index = spriteEMPUJAR_DER;
                    image_speed = 0.2;
                }
               
                if !audio_is_playing(soundCARRITO)
                {
                    audio_play_sound(soundCARRITO, 1, 1);
                    //ESTE SONIDO SE PARA EN EL STEP DEL PLAYER
                }
               
            }
        }
        else if keyboard_check(vk_left) and place_meeting(x+1.55,y,objectPLAYER)
        {
            if place_free(x-1,y) and (objectPLAYER.der = 0)
            {
                x -= 1;
               
                with (objectPLAYER)
                {
                    //draw_text(view_wview/2,view_hview/2,string("empuja bien izquierda"));
                    empuja = true;
                    x -= 1;
                    sprite_index = spriteEMPUJAR_DER; //PONGO SPRITE HACIA DERECHA CUANDO REALMENTE ES A LA IZQUIERDA, PORQUE EL MISMO OBJECTOPLAYER, EN EL STEP
                                                        //TIENE PROGRAMADO, PARA QUE ESTE VUELVA EL SPRITE CUANDO CAMBIA DE DIRECCION
                    image_speed = 0.2;
                }
               
                if !audio_is_playing(soundCARRITO)
                {
                    audio_play_sound(soundCARRITO, 1, 1);
                    //ESTE SONIDO SE PARA EN EL STEP DEL PLAYER
                }
            }
        }
        else
        {
            objectPLAYER.empuja = false;
        }
    }
   
   
   
    else
    {
        objectPLAYER.empuja = false;
    }
}


Por cierto, esta carreta, es hija de otra carreta, no se si esto influira, al retocar sus parametros respecto a la carreta madre.

Por cierto, cuando el player gira a la izquierda, no se usa otro sprite, sino que mediante programacion, giro el sprite del player, no se si esto influira, pero creo que no, ya que como os dije antes, utilizo una mascara independiente del sprite para probar las colisiones.

Bueno, espero que podamos dar con el error, porque llevo varias semanas y ya me estoy volviendo loco!!!  ???

Saludos y gracias de ante mano.

PCNONOGames  www.pcnono.es

Tengo una forma de hacerlo, primero quita cualquier codigo que tengas en el objeto carreta. Todo el codigo estara en el objeto del jugador o player:
CREATE
[gml]
vx=0
[/gml]

STEP
[gml]
vx=(keyboard_check(vk_right)-keyboard_check(vk_left)) //nos dice si se mueve a la derecha(1) o izquierda(-1) o no se mueve(0)

repeat(4) //4 es la velocidad con la que se mueve el jugador
    {
     if keyboard_check(vk_alt) { if place_meeting(x+vx,y,carreta) { with(carreta) {x+=(other.vx*4)} }} //se mueve la carreta a la misma velocidad que el jugador
     if !place_meeting(x+vx,y,carreta) {x+=vx} //aqui movemos al jugador si no colisiona con la carreta
    }
[/gml]

Si no queda claro algo del codigo pregunta.
Te aconsejo no usar objetos SOLIDOS y no usar mascaras con colisiones precisas, mascaras rectangulares o circulares seria lo ideal.

Muchas gracias geminis, lo he probado pero va dando como saltitos, el codigo que yo tengo es super realista, pero solo falla de vez en cuando a la izquierda, a ver si alguien da con el error.

Gracias de todos modos.  ;)

Cita de: 3dgeminis en Julio 25, 2017, 08:10:59 PM
Tengo una forma de hacerlo, primero quita cualquier codigo que tengas en el objeto carreta. Todo el codigo estara en el objeto del jugador o player:
CREATE
[gml]
vx=0
[/gml]

STEP
[gml]
vx=(keyboard_check(vk_right)-keyboard_check(vk_left)) //nos dice si se mueve a la derecha(1) o izquierda(-1) o no se mueve(0)

repeat(4) //4 es la velocidad con la que se mueve el jugador
    {
     if keyboard_check(vk_alt) { if place_meeting(x+vx,y,carreta) { with(carreta) {x+=(other.vx*4)} }} //se mueve la carreta a la misma velocidad que el jugador
     if !place_meeting(x+vx,y,carreta) {x+=vx} //aqui movemos al jugador si no colisiona con la carreta
    }
[/gml]

Si no queda claro algo del codigo pregunta.
Te aconsejo no usar objetos SOLIDOS y no usar mascaras con colisiones precisas, mascaras rectangulares o circulares seria lo ideal.
PCNONOGames  www.pcnono.es

Ya se cual es el principal error.

Cuando la posicion del eje x del player, no es un numero exacto, es decir, cuando es con decimales, por ejemplo, 122,50 entonces es cuando no puede empujar a la carreta.

alguien me puede decir como solventar esto??? tiene que haber de algun modo,

quizas chequeando la posicion de x y si esta es *,50 le añado le quito esa media decima y lo dejo exacto.

como podria comprobar estas decimas?? Alguien sabe algo???  ???
PCNONOGames  www.pcnono.es

Yo lo que hago es comprobar primero si hay colision, si hay y el objeto queda algunos pixels atras lo muevo hasta que quede pegado y lo detengo, si no hay colision se puede mover.
Tendrias que pasar tambien el codigo del jugador para ver mejor cual es el problema entre ambos.

[gml]
if keyboard_check(vk_right)
    {
     if place_meeting(x+vel,y,pared) { while !place_meeting(x+1,y,pared) {x+=1} }
     else { x+=vel }
    }
[/gml]

Bueno pues ya esta solucionado!!!!

Increible lo que era.... resulta que para caminar, lo puse a 1.50 pixeles cada paso y claro al colisionar con la carreta se quedaba 0.50 pixeles en la nada. Con lo que no funcionaba.

Lo que no se es porque por el lado derecho siempre funcionaba.

Bueno da igual. Problema resuelto. Un maquina YO!!!  ;D jejeje
PCNONOGames  www.pcnono.es