Busco tutoriales o alguien que me explique como poder modificar la profundidad de un objeto (un árbol por ejemplo) y la posición del personaje para dar la sensación de pasar por delante o atrás.

Hola Jalealf

En la teoría, deberías usar un objeto control para dibujar todos los objetos con la profundidad que quieras.
Todos deben tener una variable en común, puede ser perfectamente una variable llamada "profundidad" que le de una prioridad de dibujo. NO uses "depth".
Luego tu objeto control se encarga de dibujar cada sprite según el órden de dibujo.

En este link en inglés se explica una técnica con grids bastante sencilla que podrías replicar
https://youtu.be/zrzTlidryxE

Saludos


Podrías modificar la profundidad de cada objeto individual, cuando lo colocas en el room

Ya he intentado lo del tutorial pero se coloca la pantalla en negro, se que tengo que modificar el objeto dependiendo de la posición "y" del personaje o npc pero me complico con el código.
¿Si tienen una versión simplificada para que pueda entenderlo me lo podrían pasar pls?
me gusta entender el código en vez de copiarlo nomas xD

Hola Jalealf

No sé si aún tienes el mismo problema.
Te explico la técnica que ha usado la chica del video, con una variación.

Primero asegúrate de cumplir estas cuatro condiciones

1- Crea un objeto maestro que controle el dibujo, puedes llamarlo "obj_draw", o como quieras porque no usaremos su nombre. Sólo debes asegurarte de que vaya dentro de la room donde quieras hacer el sorting.

2- En el video se utiliza un script para llenar la grid, pero yo te recomiendo crear un objeto genérico de sorting que sea el padre de todos los objetos que quieras dibujar con profundidad. Yo he llamado a este objeto "obj_sort". Si quieres dibujar el player, o un arbol, o un NPC con profundidad, sólo debes asignarle como padre el "obj_sort". Este objeto sort no debe ir en la room y tampoco debe tener códigos encima, su función es sólo permitir que sus hijos sean dibujados en orden.

3- Todos los sprites a los que les quieras hacer sorting, el del player, los árboles, etc, deben tener el punto de origen en la misma posición respecto al suelo. Te recomiendo colocar el origen en Y en el punto más bajo de los sprites (tal como lo hace la chica del video).

4- Los objetos que quieras dibujar con profundidad NO DEBEN dibujarse de forma normal. En Game Maker, cuando dejas el evento de Draw en blanco, se dibuja por defecto el sprite del objeto, así que para evitar eso, debes llenar el evento de dibujo de cada objeto que quieras meter al sorting con un comentario. Ej: "//hola".

Una vez hecho esto, procedemos al script en sí.
Create Event.
grid = ds_grid_create(1,1) //Creamos una grid cualquiera

Game End Event
if ds_exists(grid,ds_type_grid) ds_grid_destroy(grid) //Eliminamos la grid cuando termine el juego

Draw Event
var num = instance_number(obj_sort) //Recibe el número de objetos que debo dibujar

if num > 0 { //Evita que se ejecuta el código si no debo dibujar nada.
ds_grid_resize(grid,2,instance_number(obj_sort)) //Ajusta el tamaño de la grid a la cantidad de objetos a dibujar
var counter = 0 //Establece un contador para llenar la GRID
with obj_sort { //El código de abajo lo ejecuta una vez por cada obj_sort en la room
ds_grid_set(other.grid,0,counter,id) //Setea el ID en la columna 0
ds_grid_set(other.grid,1,counter,y) //Setea la coordenada Y en la columna 1
counter += 1 //Incrementa el contador para ingresar el siguiente registro
}

ds_grid_sort(grid,1,true) //Ordena la lista de ID según su coordenada Y

for (var i=0; i<ds_grid_height(grid); i+=1) { //Hace un loop por cada registro de la grid
var draw_id = ds_grid_get(grid,0,i) //Recibe el ID del objeto a dibujar
with draw_id draw_self() //Ejecuta el evento de dibujo de ese material.
}
}


Saludos

Muchas gracias, ahora si me salio, pero, ¿para que sirve el obj_draw en la room?
Y al cerrar me tira un error.
___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Other Event: Game End
for object obj_sort:

Variable objPersonaje.grid(100007, -2147483648) not set before reading it.
at gml_Object_obj_sort_Other_3 (line 2) - if ds_exists(grid,ds_type_grid) ds_grid_destroy(grid);
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Object_obj_sort_Other_3 (line 2)

Muchas gracias de antemano.

Hola Jalealf

Que bueno que te haya servido el código.
El tema es que todo el código iba en el obj_draw xD
La idea es que el obj_sort no esté dentro del juego porque es un objeto padre, todo lo que hagas ahí lo harán los hijos también.

El error ocurre porque intenta borrar la ds_grid llamada "grid" y no está definida en el evento de creación.
Creala como noone.
grid = noone


Cita de: BssString en Septiembre 02, 2018, 02:11:56 AM
Hola Jalealf

Que bueno que te haya servido el código.
El tema es que todo el código iba en el obj_draw xD
La idea es que el obj_sort no esté dentro del juego porque es un objeto padre, todo lo que hagas ahí lo harán los hijos también.

El error ocurre porque intenta borrar la ds_grid llamada "grid" y no está definida en el evento de creación.
Creala como noone.
grid = noone

xd

yo coloque todo el código en el obj_sort, y al cambiarlo se soluciono.

muchas gracias.