Hola!
Bueno, he buscado y no he encontrado ninguna solución satisfactoria sobre como crear un reflejo 2D de un personaje de plataforma, lo que quiero lograr es que al pasar frente al espejo simplemente se refleje.
He leído que puede hacerse simplemente redibujando el sprite al pasar por enfrente del objeto espejado, pero muchos se concentran más en reflejo del agua o vidrios HD en GM:S. Y yo necesito saber para Game Maker 8.1, si es posible..
Así que si me pueden prestar una ayudita sería grandioso. Gracias! :P
Por supuesto que es posible y relativamente sencillo, pues sólo es cuestión de dibujar un sprite (o surface) en una zona de la pantalla y en GML hay más de una función que hace eso sin complicaciones.
Es difícil prestar ayuda cuando no se dan detalles exactos: No se sabe de que tamaño es el espejo, en qué posición está, a qué altura del suelo, su orientación, si va a reflejar total o parcialmente el sprite del personaje, etc.
Cita de: penumbra en Octubre 07, 2015, 06:04:59 AM
Por supuesto que es posible y relativamente sencillo, pues sólo es cuestión de dibujar un sprite (o surface) en una zona de la pantalla y en GML hay más de una función que hace eso sin complicaciones.
Es difícil prestar ayuda cuando no se dan detalles exactos: No se sabe de que tamaño es el espejo, en qué posición está, a qué altura del suelo, su orientación, si va a reflejar total o parcialmente el sprite del personaje, etc.
De acuerdo, aquí tienes una captura frente al espejo. Sirve?
En ese caso, lo que se debe hacer es dibujar un sprite que muestre al personaje visto desde un ángulo diferente.
Lo primero es dibujar al personaje como se ve en el espejo.
Después crear un objeto que imite los movimientos del personaje, pero con sprites diferentes, las relaciones entre sprites se podrían almacenar en arreglos o en ds_maps. El objeto reflejo debe tener una posición ligeramente desplazada respecto al objeto principal, podría ser un poco a la izquierda o a la derecha.
Por último, el marco del espejo debe recortar el sprite reflejo, para esto se me ocurren dos formas:
La primera es hacer que el espejo sea un hoyo (un sprite o tile con tranparencia) y dibujar el objeto reflejo en el fondo, de modo que sólo una parte sea visible al pasar por el hueco que es el espejo
La segunda es hacer que el espejo dibuje una "surface" en la que se recorte el objeto reflejo, el procedimiento sería así: crear una surface con el tamaño del espejo, obtener la posición relativa entre el personaje y el espejo, dibujar (en la surface) el objeto reflejo con la posición relativa calculada previamente, cambiar el "blend mode" y dibujar una máscara de recorte con la forma del espejo, regresar el "blend mode" a la normalidad y dibujar la surface en la posición del espejo.
Adjunto un ejemplo de recorte con surface. Para obtener mejores resultados, la máscara de recorte debe ser de color blanco para las áreas que se desean conservar y trasparente para las partes que se desean borrar.
Ya lo resolví hasta el punto de lograr el reflejo. Utilizé esto como ejemplo inicial, aunque le cambie muchas cosas:
http://sandbox.yoyogames.com/games/167083-water-reflection-engine (http://sandbox.yoyogames.com/games/167083-water-reflection-engine)
Logré un objeto que dibuja el reflejo con lo siguiente..
//Draw Event
draw_sprite_ext(obj_player.sprite_index,-1,obj_player.x+4,obj_player.y-2,1,1,0,c_white,0.5);
Pero no logro hacer que solo se dibuje por el espejo :S Es decir, si puedo usando el "position_meeting". Pero solo queda muy centrado y se ve por los bordes inferiores..
Cita de: Clamud en Octubre 08, 2015, 02:51:33 AM
En ese caso, lo que se debe hacer es dibujar un sprite que muestre al personaje visto desde un ángulo diferente.
Lo primero es dibujar al personaje como se ve en el espejo.
Después crear un objeto que imite los movimientos del personaje, pero con sprites diferentes, las relaciones entre sprites se podrían almacenar en arreglos o en ds_maps. El objeto reflejo debe tener una posición ligeramente desplazada respecto al objeto principal, podría ser un poco a la izquierda o a la derecha.
Por último, el marco del espejo debe recortar el sprite reflejo, para esto se me ocurren dos formas:
La primera es hacer que el espejo sea un hoyo (un sprite o tile con tranparencia) y dibujar el objeto reflejo en el fondo, de modo que sólo una parte sea visible al pasar por el hueco que es el espejo
La segunda es hacer que el espejo dibuje una "surface" en la que se recorte el objeto reflejo, el procedimiento sería así: crear una surface con el tamaño del espejo, obtener la posición relativa entre el personaje y el espejo, dibujar (en la surface) el objeto reflejo con la posición relativa calculada previamente, cambiar el "blend mode" y dibujar una máscara de recorte con la forma del espejo, regresar el "blend mode" a la normalidad y dibujar la surface en la posición del espejo.
Adjunto un ejemplo de recorte con surface. Para obtener mejores resultados, la máscara de recorte debe ser de color blanco para las áreas que se desean conservar y trasparente para las partes que se desean borrar.
Como se podría dibujar el objeto reflejado en el fondo exactamente? Es que no estoy muy acostumbrado aún a las "surface"
Cita de: Clamud en Octubre 08, 2015, 02:51:33 AM
En ese caso, lo que se debe hacer es dibujar un sprite que muestre al personaje visto desde un ángulo diferente.
Esto sería lo más elegante, aunque se requeriría más trabajo para dibujar al jugador en un ángulo distintoCita de: ian12 en Octubre 08, 2015, 05:56:20 AM
Como se podría dibujar el objeto reflejado en el fondo exactamente? Es que no estoy muy acostumbrado aún a las "surface"
No alcanzo a entender a qué te refieres por el objeto reflejado en el fondo, ya que el objeto debe reflejarse no en cualquier fondo, si no en un espejom creo. :o Dejo un ejemplo usando un método de recorte basado en blend modes, que es el segundo método que menciona Clamud.
El ejemplo se comporta (creo, si no recuerdo mal) como los espejos que hay en Castlevania Aria of Sorrow (en la parte donde hay doncellas y valkirias y te ataca un monstruo en el espejo, creo que se llama mirror demon, pero no me acuerdo bien). El reflejo en el espejo se ve igual que el original (no hay un cambio de ángulo), pero con un offset/desplazamiento ligero para que el sprite original no lo bloquee del todo y se alcance a apreciar.
Acorde a mi costumbre, no dejo ejemplos totalmente pulidos porque considero que el desarrollador final debería ser el más interesado en lograr el efecto (y entenderlo), así que le debe dedicar algo de tiempo para modificar valores y parámetros hasta dar con lo que quiere. Con esto quiero decir que es posible mejorar el resultado probando variaciones en los modos de blending, en la distancia "sensible" de cada espejo, la posición donde se dibuja el reflejo, el offsetl, etc. Creo que lo que más necesita trabajarse es el cálculo de la posición relativa entre el juagador y el espejo, ya que por comodidad sólo he puesto valores fijos, pero si el juego va a tener distintos espejos a distintas alturas, se requiere un mejor control.
Para que el ejemplo funcione el sprite del espejo debe tener dos subimágenes, la primera es el espejo como se muestra en el juego (incluyendo el marco) y la segunda es la "forma" de la luna/cristal, que puede ser sencilla o tan complicada como se quiera. Viendo el sprite del espejo esto se entiende mejor.(http://i.imgur.com/k7V0gEt.png)
El efecto a simple vista funciona bien, pero los más quisquillosos u observadores van a notar que en el reflejo se muestra el brazo derecho del jugador, cuando debería mostrarse el izquierdo, pero bueno, esto se puede mejorar creando el sprite en distinto ángulo que mencionó Clamud.Descargar (gm8.1):
http://www.mediafire.com/download/66rjclj6xnpz5rj/mirror.gm81
CitarNo alcanzo a entender a qué te refieres por el objeto reflejado en el fondo
Es por lo que dijo [user]Clamud[/user]..
Con ese ejemplo de [user]penumbra[/user] pude lograr el reflejo utilizando el marco y el espejo como elementos separados..
Lo que no logro es como lograr un desenfoque al final del sprite, algo de "blur". Ya con eso quedaría ideal.
He probado usar las funciones de "draw_set_blend_mode" , pero tiende a quedarme un marco blanco alrededor del sprite del personaje y con otros valores no se ve.. o el marco se hace negro..
Esto tiene muchas partes, pero ya casi lo consigo u.u