Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mensajes - nonoroman

196
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.

:-[
197
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  ??? ???





198
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.
199
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  ;)
200
Muchas gracias bocha. Ya funciona a la perfeccion.
La verdad es esta funcion no la conocia y es muy util. Eres un grande. Gracias.

;D ;D

Cita de: bochaPastore en Agosto 31, 2017, 02:34:25 PM
instance_place retorna el id de la instancia que esta collisionando con tu bombilla.

por ende, en la parte del with(inst) te estas refiriendo a esa pared con ese id particular.

Dentro del with(inst) deberias hacer que se ejecute lo que vos queres q pase al tocar esa pared.

Ahora si?

proba con esto:


for(i=1;i<=BOMBILLAS_TOTALES;i++)
{   
    if instance_exists(luz_bombillas[i])
    with(luz_bombillas[i])
    {
        if !(place_meeting(x,y,objectPARED_HABITACION)){draw_surface_ext(sur, x - sprite_width / 2, y - sprite_height / 2, 1, 1, 0, image_blend, 1);}
        if (place_meeting(x,y,objectPARED_HABITACION))
        {   
           
           var pared = instance_place(x, y, objectPARED_HABITACION); 
           
            if (pared.image_alpha < 1)
            {
                audio_play_sound(sound0,1,0);
                draw_surface_ext(sur, x - sprite_width / 2, y - sprite_height / 2, 1, 1, 0, image_blend, 1);
            }
        }
    }
}

201
Muchas gracias bocha. La verdad es que desconocia esa funcion.

Voy a probarlo. La verdad es que tiene buen pinta. Deberia de funcionar. Pruebo y te cuento.

;D

Cita de: bochaPastore en Agosto 31, 2017, 02:34:25 PM
instance_place retorna el id de la instancia que esta collisionando con tu bombilla.

por ende, en la parte del with(inst) te estas refiriendo a esa pared con ese id particular.

Dentro del with(inst) deberias hacer que se ejecute lo que vos queres q pase al tocar esa pared.

Ahora si?

proba con esto:


for(i=1;i<=BOMBILLAS_TOTALES;i++)
{   
    if instance_exists(luz_bombillas[i])
    with(luz_bombillas[i])
    {
        if !(place_meeting(x,y,objectPARED_HABITACION)){draw_surface_ext(sur, x - sprite_width / 2, y - sprite_height / 2, 1, 1, 0, image_blend, 1);}
        if (place_meeting(x,y,objectPARED_HABITACION))
        {   
           
           var pared = instance_place(x, y, objectPARED_HABITACION); 
           
            if (pared.image_alpha < 1)
            {
                audio_play_sound(sound0,1,0);
                draw_surface_ext(sur, x - sprite_width / 2, y - sprite_height / 2, 1, 1, 0, image_blend, 1);
            }
        }
    }
}

202
Muchas gracias por responder. Pero no termino de comprenderlo del todo.

Segun tu codigo. Entiendo que.
Si estas en el mismo lugar que el objecto pared.
Entonceces con pared, paso el id de esa pared directamente a la variable inst??

O dentro de with (inst) tengo que ejecutar ahora id_pared = id;

Asi es?? Y se podria hacer lo mismo con place meeting??

Cita de: bochaPastore en Agosto 31, 2017, 01:37:16 PM
Con lo siguiente podes obtener el id del objeto:


var inst = instance_place(x, y, obj_pared);
with(inst)
{
//tu codigo
}


Saludos.
203
Buenas, pues vengo con una pregunta sencilla.

La verdad es que creo que alguna vez lo he hecho pero ahora no recuerdo.

La cuestion es, puedo obtener la id del objecto con el que esta colisionando a partir de un tercero??

os pongo el ejemplo, desde el obj_control, compruebo si una bombilla esta colisionando con una pared, si es asi, quiero comprobar el alpha de la pared y si es menos a 1, realizar una accion.

El caso es que me funciona el codigo, pero, pero como hay varias paredes, la accion ultima se ejecuta en otra pared, que es la que se carga primero. Es decir no tiene en cuenta el id de la pared con la que se esta trabajando.

Entonces, como obtengo la id de la pared desde otro objecto??

Os paso el codigo;

//LUCES DE LAS BOMBILLAS
for(i=1;i<=BOMBILLAS_TOTALES;i++)
{   
    if instance_exists(luz_bombillas[i])
    with(luz_bombillas[i])
    {
        if !(place_meeting(x,y,objectPARED_HABITACION)){draw_surface_ext(sur, x - sprite_width / 2, y - sprite_height / 2, 1, 1, 0, image_blend, 1);}
        if (place_meeting(x,y,objectPARED_HABITACION))
        {   
            pared = objectPARED_HABITACION.id; 
       
            if (pared.image_alpha < 1)
            {
                audio_play_sound(sound0,1,0);
                draw_surface_ext(sur, x - sprite_width / 2, y - sprite_height / 2, 1, 1, 0, image_blend, 1);
            }
        }
    }
}


Bueno a ver si entre todos damos con la solucion, porque solo me falta ese detalle.
Saludos y abrazos!!!!  ;)
204
Gracias por responder bocha.

Pues si que estoy dandole un orden al depth de cada objecto. Pero lo estoy definiendo desde las propiedades de cada objecto. No desde el create como comentas. Crees que desde el create se ordenaria solo al crear un objecto nuevo en la room???

Cita de: bochaPastore en Agosto 30, 2017, 04:59:10 PM
Pregunta, estas manejando la profundidad de todas las instancias que tenes en la room? O solo la de las luces?
Para que la profundidad de las instancias funcione correctamente, deberias tener la variable depth seteada correctamente en el create de cada instancia. Si no, no te las va a ordenar.

Por ejemplo, si tenes un obj_pared, este tiene q tener un depth tmb.
205
David muchas gracias. Esto que dices no suena mal. Pero creo que ocurriria lo mismo que clamud.

En el intervalo entre que se borra el objecto controlador hasta que se crea otra vez. La oscuridad de la habitacion desapareceria aunque solo sea un segundo y habria un destello.

O por lo menos eso creo. Habria que probarlo tambien.

Cita de: DavidTheAnswerer en Agosto 30, 2017, 03:21:32 AM
No podrías hacer que cuando se crea el objeto luz se cree otra instancia del controlador y se elimine la que tenias antes? Asi quedaria a lo ultimo... Lo unico que no se es si te daria error en el intervalo, es que nunca trabaje con surfaces  :-[

:GMS:
206
Gracias clamud por tu teoria.

Pero no se si funcionara. Tendre que probarlo. Pero creo que se escapa algo. Porque en el transurso en el que la variable este en false. La room que esta en plena oscuridad se encenderia al no tener activado el objecto que controla el surfaces.

O por lo menos eso creo que ocurriria. Tendre que probarlo.

Cita de: Clamud en Agosto 30, 2017, 03:15:29 AM
Crea una variable global, por ejemplo global.dibujar_luz = false;
En el evento que dibuja la luz coloca el bloque DnD "Test variable", como aparece en la imagen adjunta, para ejecutar el código solo cuando la variable sea true.
En el objeto que se dibuja al último activa la variable global y ejecuta el evento de los objetos luz
[gml]
global.dibujar_luz = true;
with( obj_luz )event_perform(ev_step, ev_step_normal);
global.dibujar_luz = false;
[/gml]

Otra forma sería simplemente no poner código en los objetos que generan luz y poner todo el código en el objeto controlador
[gml]
with( obj_luz ){
//codigo para generar luz
}
[/gml]
207
Tienes que hacer tu juego para PC. Por ejemplo en windows.

Y subirlo. Despues tienes que pasar el greenlight. Y si lo consigues. Te tienes que crear una cuenta steamwork (sino recuerdo mal el nombre) donde tienes que dar todos tus datos, domicilio, numero de tu cuenta bancaria, etc.

Te lo digo porque yo he superado el greenlight con unos de mis juegos y estoy esperando que me aprueben la cuenta steamwork, que es un follon con el tema de impuestos etc etc.

Pero hace poco me entere, que iban a quitar el proceso del greenlight. Pero no se en que estado se encontrara ahora mismo.

Por cierto, este es mi juego que ha superado el greenlight
GET OVER; http://www.pcnono.es/servicios/

Suerte.  ;D
208
Muchas gracias por responder clamud.

Efectivamente, conozco que el orden se crea a partir del depth, por eso cuando arranco la room todo funciona bien, porque el objecto que controla la surfaces tiene un depth de -1000.

El problema surge cuando a mitad de la partida, con todas las instancias creadas, se crea un nuevo objecto y al parecer, da igual la profundidad que tenga, que este, se posiciona el ultimo y por lo tanto deja de funcionar el objecto que controla el surfaces.

Lo que comentas de usar una variable global y un event perform no lo entiendo muy bien. Esto me ayudaria a posicionar el nuevo objecto creado en la ultima posicion del instance order??  ???

Cita de: Clamud en Agosto 29, 2017, 01:28:52 PM
El orden de los eventos Draw se puede controlar con la variable depth.
Para controlar el orden de otros eventos se puede crear una lista con los ids de las instancias. Usa una variable global para salir de los eventos en la ejecución normal. Uno objeto controlador ejecutará los objetos en orden usando with y la función event_perform.
209
No creo, porque el obj_control tiene que tener todos los objectos ya creados cuando este aplique el surface sobre ellos.

Creo que no hay otra. Tengo que tener siempre este objecto el ultimo.  ???

Cita de: Seirlord_Games en Agosto 29, 2017, 11:58:45 AM
Que yo sepa no hay forma de hacerlo a código, peeeeero, puede que puedas arreglarlo usando los eventos "Begin Step" y "End Step" o "Draw Begin" y "Draw End".
210
Preguntas y respuestas / FUNCION PARA INSTANCE ORDER??
Agosto 29, 2017, 11:50:09 AM
Buenas amigos, pues otra vez ando por aqui.

Como ya os comente en otro tema, consegui hacer funcionar el surfaces, pero uno de los requisitos para que funcionase, era que el objecto que controla el surfaces (obj_control) estuviera en la lista de objectos cargados por la room en el ultimo lugar de prioridad. (adjunto foto)

Vale, todo funciona perfecto asi, HASTA QUE!!!

Se crea un nuevo objecto con LUZ. Entonces, este pasa a ser el ultimo de la lista de y claro, ya no lo es el objecto que controla la surfaces y entonces se produce error.

La pregunta es. Se puede controlar mediante codigo??? La posicion o prioridad del objecto en la lista de instance order de la Room???

Hay una funcion para esto?? porque yo la desconozco.

Bueno si alguien sabe algo que me comente. Thank You!!!!  ;)