Buenas a todos, pues otra vez ando por aqui con otro problemilla.

El caso es que he seguido un tutorial para hacer las plataformas moviles y que el player al subirse en ellas se mueva junto con las plataformas.

Hasta aqui todo funciona.

El caso, es que con las horizontales, puedo moverme junto a las plataformas como he dicho anteriormente y a la vez, el player puede moverse a traves de la misma plataforma.

El problema esta en las plataformas verticales. Con estas, el player se mueve a la vez que la plataforma, pero cuando quiero mover el player de derecha-izquierda o viceversa, este no se mueve, esta clavado.

No se si tiene que ver con que la plataforma es pariente del objecto pared. o no entiendo porque.

Pero el caso es que con las plataformas horizontales, todo funciona perfecto.

Os paso el codiggo del player cuando pulsa la tecla de la derecha, por ejemplo. A ver si entre todos conseguimos averiguar el error;

CitarKeyboard Event for <Right> Key:

if PAUSE is not equal to true
      if MUERTO is not equal to true
      execute code:

mask_index = spr_mask;

      set variable der to 1
      set variable izq to 0
      set variable arriba to 0
      set variable image_xscale to 1
      if global.CORRER is equal to 0
            if run is less than 1
                  set variable run relative to 2
            if at relative position (0,1) there is object obj_wall
                  execute code:


if (global.LINTERNA == 1)
{
    sprite_index = spr_walking;
    image_speed = 0.5;
}

if (global.LINTERNA == 0)
{
    sprite_index = spriteCAMINAR_SIN_LINTERNA;
    image_speed = 0.5;
}

      if global.CORRER is equal to 1
            set variable der to 1
            set variable izq to 0
            COMMENT: AQUI VA LA VELOCIDAD DE CORRER
            if run is less than 6
                  set variable run relative to 1
            if at relative position (0,1) there is object obj_wall
                  COMMENT: AQUI LA VELOCIDAD DEL SPRITE CORRER
            if sprite_index is not equal to spr_jump
                  execute code:


if (global.LINTERNA == 1)
{
    sprite_index = spr_run;
    image_speed = 0.5;
}

if (global.LINTERNA == 0)
{
    sprite_index = spriteCORRIENDO_SIN_LINTERNA;
    image_speed = 0.5;
}

            execute code:

if !instance_exists(objectPASOS_CORRIENDO)
if (gravity == 0)
{
    instance_create(x,y,objectPASOS_CORRIENDO)
    if !audio_is_playing(soundPASOS_CORRIENDO){audio_play_sound(soundPASOS_CORRIENDO,1,1)}

}

      if global.SALTAR is equal to 1
            execute code:

/*
if (gravity == 0)
{
    run = 6;
}
*/


saludos y gracias de antemano  ;)
PCNONOGames  www.pcnono.es

Te dejo un tutorial escrito por Simon Donkers. Trata de las plataformas horizontales y verticales. Además tiene un editable.
Enlace del tutorial: http://gamemaker.simondonkers.com/tutorial/3

Saludos.

Pues no veo codigo alguno de colision o de las plataformas.

Voy a echarle un ojo. Muchas gracias.

Ya os contare si lo soluciono.  ;)

Cita de: Zapdos43 en Septiembre 16, 2017, 01:23:23 AM
Te dejo un tutorial escrito por Simon Donkers. Trata de las plataformas horizontales y verticales. Además tiene un editable.
Enlace del tutorial: http://gamemaker.simondonkers.com/tutorial/3

Saludos.
PCNONOGames  www.pcnono.es

#4 Septiembre 16, 2017, 10:57:39 AM Ultima modificación: Septiembre 16, 2017, 11:00:27 AM por nonoroman
A ver, he estado investigando y he averiguado lo siguiente;

Yo he seguido este magnifico tutorial

https://www.youtube.com/watch?v=d5P6XxXO7l4&list=FLIyQc_fiQAJW9DV503MIPTw

El cual, lo he probado en un proyecto de prueba limpio, y funciona a la perfeccion.

El problema debe de estar en mi objectPLAYER. Y en el objecto PARED que estoy usando. Ya que el objecto plataforma debe ser hijo del objecto PARED para coger las propiedades de este, de parar al PLAYER en cuanto este lo pisa, etc, etc.

Es decir, que el problema esta entre mi PLAYER y mi objecto PARED (padre del objecto PLATAFORMA)

He creado un objecto PLATAFORMA_PADRE con el codigo que he usado en el proyecto de prueba que me ha funcionado perfectamente tanto con la plataforma horizontal como con la vertical.

Y usando exactamente lo mismo, mi PLAYER se queda pegado al objecto PLATAFORMA_PADRE, es decir, que el problema esta en mi objecto PLAYER.

Algo hay en su codigo que hace que, cuando colisiona con el OBJECTO PLATAFORMA_PADRE este se quede pegado, y si, por el contrario, usamos la PLATAFORMA con mi objecto PARED como padre, este funciona, pero no camina hacia los lados como comente al abrir el tema.

Como el codigo de mi PLAYER esta muy elaborado y super complejo, creo que lo mejor seria adaptar un codigo en PLATAFORMA_PADRE a las necesidades de mi PLAYER para que asi, al ser hijo PLATAFORMA este funcione.

Pienso yo. Aqui os dejo, el codigo de colision con el objecto PARED;

Collision Event with object obj_wall:

move in direction direction at most speed till a contact with solid objects
set variable speed to 0
if at relative position (0,1) there is object obj_wall
      execute code:

if (global.LINTERNA == 1)
{
    sprite_index = spr_stand;
    image_speed = 0.9;
}

if (global.LINTERNA == 0)
{
    sprite_index = spriteDE_PIE_SIN_LINTERNA;
    image_speed = 0.3;
}



Y aqui el codigo con el objecto PLATAFORMA_PADRE que es tal y como explica en el video tutorial y que he probado y si que funciona. Pero con mi PLAYER este se queda pegado a el.

Collision Event with object objectPLATAFORMA_PADRE:

execute code:

move_contact_solid(direction,sprite_height);
vspeed = 0;
gravity = 0;




A ver si entre todos damos con el problema  ??? ???





PCNONOGames  www.pcnono.es

Este parte está bien:

Cita de: nonoroman en Septiembre 16, 2017, 10:57:39 AM
Collision Event with object objectPLATAFORMA_PADRE:

execute code:

move_contact_solid(direction,sprite_height);
vspeed = 0;
gravity = 0;




Todo parece indicar que el problema está el código de la plataforma. Compara tu código con el código del tutorial y comprueba que las plataformas son hijos del objeto padre y que tienen marcado la casilla "Solid".

Ya he averiguado lo que pasa.

El caso es que en el scripts de las plataformas verticales hay un detalle que no esta en la plataforma horizontal.

Y es el que tiene que ir ajustando los sprites para que al subir la plataforma y al bajar, el PLAYER no vaya dando pequeños saltitos.

Esto se ajusta con el siguiente codigo;

if(place_meeting(x,y-abs(vel),objectPLAYER)) // si el jugador esta arriba de la plataforma
    {
        objectPLAYER.y = y-sprite_height/2-objectPLAYER.sprite_height/2; // ESTO ES PARA AJUSTAR AL PLAYER CON EL MOVIMIENTO
        //DE LA PLATAFORMA PARA QUE NO HAGA SALTOS RAROS
        // PARA QUE ESTO FUNCIONE, EL EJE DEL SPRITE DE LA PLATAFORMA MOVIL DEBE DE ESTAR EN EL CENTRO   
    }


Midiendo el alto de los sprites tanto de la plataforma como la del PLAYER, pero que pasa en mi caso??? que mi PLAYER no usa su propio sprite como mask, sino que usa un spr_mask diferente, tanto para cuando esta de pie, como cuando se agacha, como cuando sube por una escalera. Y en ninguno de los casos, coincide al 100% con el sprite real que dibuja el PLAYER siempre hay algunos pixeles de diferencia.

Entonces, como puedo ajustar la funcion anterior, pero en vez de medir el sprite_height, como puedo medir el sprite de la mask????

Y esto seguro que lo resolveria.

:-[
PCNONOGames  www.pcnono.es

Tienes 2 funciones para copiar el ancho y alto de cualquier sprite:
[gml]sprite_get_width(nombre_del_sprite);
sprite_get_height(nombre_del_sprite);[/gml]

Bueno lo he solucionado, ajustando los pixeles que la mascara diferenciaba del sprite del PLAYER.

Ahora parece que todo funciona.

Muchas gracias a todos los que habeis ayudado!!!!  ;D
PCNONOGames  www.pcnono.es