Hola buenas, estoy empezando un RPG (cosechando ideas, apuntandolas, dibujando personajes, etc) y una de las cosas mas importantes en un RPG (ARPG) es el cambio de vestimenta ya que le da un toque de personalizacion a tu personaje y te deja meterte en su piel.

Ahora bien, ¿como creeis que es la mejor manera de dibujar la vestimenta? (2D), habia pensado cosas como :
- Cada parte modificable un objeto (piernas,cabeza,etc), pero serian muchos objetos y lio.
- Un objeto y dibujar cada parte en el draw (un monton de sprite para las piernas,cabeza,etc).
- Un objeto con un solo sprite, que va cambiando segun el conjunto (cada combinacion posible su sprite), pero mucho lio.

¿Cual creen que es la mejor manera de hacerlo o simularlo?

Pues tal como dices las 3 opciones son válidas pero llevarían mucho tiempo según la cantidad de vestimenta. Claro que también depende mucho de la estructura de tu juego, como por ejemplo cuantas vestimentas tendrá, etc.

Se me ocurre algo. Para no estar haciendo todas las combinaciones posibles. Una vez lo implemente no precisamente para un rpg, pero podría funcionar.

Espero que me entiendas:

Podrías hacer primero una única mascara de coalición de tu personaje.

Segundo, tu personaje seguramente al principio tendrá ya una vestimenta gral definida. tercero, habría que contar que partes se van a modificar, por ejemplo, si se podrá personalizar la cabeza, torso, calzado, y pantalón tenemos 4 tipo de personalizaciones, entonces puedes crear cada parte y le otorgas como parent a tu personaje, luego, que se cree por una capa por encima de tu personaje.

Ahora, solo tendrías que crear en mi caso 4 objetos. Cada parte de objeto puede cambiar se sprite según el elemento que se eligió, por ejemplo si un gorro de invierno o de vaquero.

Para eso ya utilizas variables y luego implementas un sistema para grabarlos en un INI, así de esa forma cada vez que habrás el juego se quede grabada la vestimenta de tu personaje.

Bueno, no se si me habré explicado bien pero esa es la idea más corta y funcional que se me ocurrió.

Si te entiendo perfectamente, esa es la primera opcion que pense (y la que puse, mal explicada pero esa xd). Lo malo seria hacer todos los movimientos que serian un lio, todas las colisiones, etc. De momento me voy quedando con la ultima, en la que el personaje se divide por ejemplo en 4 partes y cada parte es un sprite (dibujado en draw).

Cita de: Xizotono en Diciembre 08, 2014, 01:29:53 PM
Si te entiendo perfectamente, esa es la primera opcion que pense (y la que puse, mal explicada pero esa xd). Lo malo seria hacer todos los movimientos que serian un lio, todas las colisiones, etc. De momento me voy quedando con la ultima, en la que el personaje se divide por ejemplo en 4 partes y cada parte es un sprite (dibujado en draw).

Es otra idea, por eso lo puse solo como opción, no tengo idea la cantidad de items que usaras. Volviendo a mi planteo, es un lío si, pero se me olvido decirte que para hacerlo tendrás que crear las animaciones con cada uno de los items por separado. Una vez que tengas eso, vas a tener que borrar del sprite todo excepto a la parte personalizable, por ejemplo el gorro. Así en cada uno de los fotogramas. De esa forma te quedará el solo la animación del gorro para que cuando tu personaje lo utilice por encima de una capa acompañe de forma fluida a la animación.

Por eso siempre he pensado que este tipo de juegos es mejor hacerlos en 3D, porque dibujar en 2D, cualquiera que sea la ruta que tomes (de las tres que diste) es un infierno. No recuerdo haber visto ni jugado un juego 2D que utilice el método 2° o 3°, el 1 sí, con animación tipo "por huesos".

Para mi el mejor método es el tercero, pero se requeriría tener paciencia de santo para dibujar 10  o 20 veces al mismo personaje (animado) con distintas armaduras y vestimentas. Jamás he visto esto en un juego comercial (2D).

¿¿Y los surfaces??

dibujas los objetos en un surface y solo tienes que dibujarlos una vez.

para las animaciones, puedes usar varios surfaces.

Cita de: TheSandBoxMKG en Diciembre 09, 2014, 04:52:50 PM
¿¿Y los surfaces??

dibujas los objetos en un surface y solo tienes que dibujarlos una vez.

para las animaciones, puedes usar varios surfaces.

¿Y que es eso de los surfaces? ¿Puedes explicarls un poco mas? :S

para información sobre surfaces, visite:
http://www.comunidadgm.org/preguntas-y-respuestas/que-es-un-surface/msg93208/#msg93208
http://www.comunidadgm.org/preguntas-y-respuestas/(resuelto)hacer-un-sprite-en-base-a-dos-tres/msg99687/#msg99687

Es cierto que se pueden usar surfaces, pero no creo que eso resuelva la problemática central: La superficie se dibuja sólo una vez, sí, en la pantalla, pero para dibujar en la superficie, tienes que cambiar el target, y, si tienes 5 o 6 piezas de armadura (sprites) distintos, se tendría que usar 5 o 6 veces la función draw para dibujar esos sprites o piezas en la superficie, así que al final, mediante surfaces, usaste la función draw las mismas veces para dibujar todo un set de armadura que dibujando directo en la pantalla (en realidad, una más, por la necesidad de dibujar la surface misma al final)

Lo complicado es hacer un número significativo de sprites, contando con que son animados, por lo que todas las piezas deben encajar con el movimiento del jugador. Ya sea que con draw, especificando las coordenadas x, y respecto al jugador, o como dijo emanuelsko, en el mismo sprite animado del jugador ir dibujando las piezas de la armadura y al final borrar el jugador. Teniendo los sprites listos, dibujarlos uno por uno directo en la pantalla o en una surface es sencillo

Pensando en todas las posibilidades dadas pienso en lo siguiendo y creyendo que sera la mejor manera. Pienso que la forma mas sencilla sera hacer la animacion de un personaje con un set (en dibujo fisico), digitalizarlo (pasarlo a pc) y luego en una copia borrar lo innecesario (sombrero -> se borra lo demas). Luego en draw dibujar cada sprite segun el set.

Mañana en cuanto tenga tiempo veo lo de las surfaces. Un saludo ^^

Cita de: penumbra en Diciembre 09, 2014, 11:23:49 PM
para información sobre surfaces, visite:
http://www.comunidadgm.org/preguntas-y-respuestas/que-es-un-surface/msg93208/#msg93208
http://www.comunidadgm.org/preguntas-y-respuestas/(resuelto)hacer-un-sprite-en-base-a-dos-tres/msg99687/#msg99687

Es cierto que se pueden usar surfaces, pero no creo que eso resuelva la problemática central: La superficie se dibuja sólo una vez, sí, en la pantalla, pero para dibujar en la superficie, tienes que cambiar el target, y, si tienes 5 o 6 piezas de armadura (sprites) distintos, se tendría que usar 5 o 6 veces la función draw para dibujar esos sprites o piezas en la superficie, así que al final, mediante surfaces, usaste la función draw las mismas veces para dibujar todo un set de armadura que dibujando directo en la pantalla (en realidad, una más, por la necesidad de dibujar la surface misma al final)

Lo complicado es hacer un número significativo de sprites, contando con que son animados, por lo que todas las piezas deben encajar con el movimiento del jugador. Ya sea que con draw, especificando las coordenadas x, y respecto al jugador, o como dijo emanuelsko, en el mismo sprite animado del jugador ir dibujando las piezas de la armadura y al final borrar el jugador. Teniendo los sprites listos, dibujarlos uno por uno directo en la pantalla o en una surface es sencillo

Si no entendiste, hablo de dibujar esos sprites solo cuando cambias de vestimenta y re-usar los surfaces dibujándolos en la pantalla

#10 Diciembre 10, 2014, 11:20:41 PM Ultima modificación: Diciembre 10, 2014, 11:51:22 PM por penumbra
Cita de: TheSandBoxMKG en Diciembre 10, 2014, 08:02:57 PM
Si no entendiste, hablo de dibujar esos sprites solo cuando cambias de vestimenta y re-usar los surfaces dibujándolos en la pantalla
Tengo mis dudas sobre si eso funcionaría, a lo mejor se me escapa algo, pero si dibujas sprites sólo cuando se cambia de ropa, estarías dibujando superficies "sin movimiento": Según los mensajes anteriores, toda la vestimenta y armaduras serían animadas. Para que la vestimenta y armaduras sigan el movimiento del jugador, se tienen que dibujar constantemente las subimágenes de ESOS sprites en la surface mientras el jugador tenga una pose o acción animada. Dibujar los sprites una una sola vez produciría que sólo se vea UNA subimagen de cada pieza de armadura, es decir, hecharía al traste las animaciones. Así que al tener sprites animados, forzosamente se requiere un dibujo constante (ya sea en la superficie o en la pantalla) y no nada más cuando se cambia de ropa.

Como en GM nativamente no hay superficies animadas, no hay manera de tener subimagenes en una superficie y poder asignarle una velocidad a la cual reproducir la animación. Claro que se pueden dibujar cada subimagen de cada sprite en un arreglo de superficies y dibujar una tras otra para dar la impresión de animación, pero veo difícil que alguien se decida a tomar esta ruta.

Cita de: penumbra en Diciembre 10, 2014, 11:20:41 PM
Cita de: TheSandBoxMKG en Diciembre 10, 2014, 08:02:57 PM
Si no entendiste, hablo de dibujar esos sprites solo cuando cambias de vestimenta y re-usar los surfaces dibujándolos en la pantalla
Tengo mis dudas sobre si eso funcionaría, a lo mejor se me escapa algo, pero si dibujas sprites sólo cuando se cambia de ropa, estarías dibujando superficies "sin movimiento": Según los mensajes anteriores, toda la vestimenta y armaduras serían animadas. Para que la vestimenta y armaduras sigan el movimiento del jugador, se tienen que dibujar constantemente las subimágenes de ESOS sprites en la surface mientras el jugador tenga una pose o acción animada. Dibujar los sprites una una sola vez produciría que sólo se vea UNA subimagen de cada pieza de armadura, es decir, hecharía al traste las animaciones. Así que al tener sprites animados, forzosamente se requiere un dibujo constante (ya sea en la superficie o en la pantalla) y no nada más cuando se cambia de ropa.

Como en GM nativamente no hay superficies animadas, no hay manera de tener subimagenes en una superficie y poder asignarle una velocidad a la cual reproducir la animación. Claro que se pueden dibujar cada subimagen de cada sprite en un arreglo de superficies y dibujar una tras otra para dar la impresión de animación, pero veo difícil que alguien se decida a tomar esta ruta.

usar varias surfaces.

#12 Diciembre 11, 2014, 03:07:03 AM Ultima modificación: Diciembre 11, 2014, 03:22:30 AM por penumbra
Cita de: TheSandBoxMKG en Diciembre 11, 2014, 01:51:33 AM
usar varias surfaces.

Entonces, como dije en un principio, se estaría usando más veces draw, lo cual no genera ningún beneficio real, pudiendo dibujar directamente los sprites en pantalla, sin mencionar todo el código que se implicaría usar para dibujar en las muchas surfaces que se necesitarían. Y como dije, esto no resuelve el problema principal, que es hacer todo el juego de sprites animados de todas las ropas acordes a los movimientos del jugador

Ejemplo:
un juego de armadura de 6 piezas (casco, peto, manopla izquierda y derecha, greba izquierda y derecha, todos animados). Se usarían 6 instrucciones draw para dibujarlas en la surface, más el propio sprite del jugador, y como mencioné, dibujar sólo al momento de cambiar de ropas no produciría animación, por lo que se estaría dibujando a cada paso. Al final se estarían usando 7 u 8 instrucciones para dibujar un solo "frame", sin contar con que se manejarían varias surfaces y las surfaces hay que borrarlas después de usarlas, según aconseja el manual. A esto no le veo ventaja sobre dibujar directamente los sprites, en donde serían 6 draws y te olvidas de manejar surfaces, cambiar target y borrarlas.

Cita de: penumbra en Diciembre 11, 2014, 03:07:03 AM
las surfaces hay que borrarlas después de usarlas, según aconseja el manual

¿Eso? :-[ yo decia, una sola vez, hacer todos los frames de la animación, en todas las direcciones, un surface por cada frame.
luego dibujar el surface correspondiente en la room. Sin borrar los otros surfaces. (sino te molesta usar mucho codigo (el unico problema de usar los surfaces), son unos 64 de una sola vez (teniendo como ejemplo que son 4 piezas con 4 direcciones con 4 frames))

Ademas en el foro hay un post que aconseja usar surfaces para dibujar (no me acurdo de donde pero eran algo asiu como 11 consejos de optimizacion, o que se yo  :P)

#14 Diciembre 11, 2014, 11:08:30 AM Ultima modificación: Diciembre 11, 2014, 11:27:03 AM por penumbra
Cita de: TheSandBoxMKG en Diciembre 11, 2014, 05:21:31 AM
Ademas en el foro hay un post que aconseja usar surfaces para dibujar (no me acurdo de donde pero eran algo asiu como 11 consejos de optimizacion, o que se yo  :P)
Bueno, acabo de hacer la prueba, y en este caso al menos (dibujar sprites animados mediante surfaces) no noto ninguna optimización ni mejora. He usado los dos métodos: dibujar los sprites de dos objetos de la manera tradicional, directamente en pantalla, vs la otra manera, por surfaces. En la esquina superior derecha se muestran los frames por segundo reales a los que corre el juego, como puede verse, usar surfaces no mejora el desempeño en este caso, además que supone usar más código:

a) Como se usan surfaces y éstas son estáticas, hay que manejar contadores adicionales para controlar la velocidad de animación (en draw, hay que cambiar de surface cada ciertos steps para dar la impresión de que es una animación, cuando en el método tradicional eso se hace automáticamente al darle un valor a image_speed

b)El método tracicional tiene otra ventaja, que es que la animación del sprite se cicla automáticamente, en cambio, con surfaces, hay que revisar si se llegó a la última surface para volver a la primera. Si se usa una sola surface para meter todos los frames, pasa lo mismo, hay que controlar el ciclo también manualmente

A mi me gusta usar surfaces, también he leído que en ciertos casos es recomendable usar surfaces, pero por lo que me ha tocado leer, son otros casos. Si dibujar sprites animados fuera más óptimo mediante surfaces, sería extraño que prácticamente nadie use este método de manera normal en sus juegos (no he visto este método en ninguno de los ejemplos que he descargado de la GMC), ni me he topado alguna referencia de YoYo al respecto (en este artículo sobre optimización sugieren usar surfaces, pero para una situación distinta: escalado a diferentes resoluciones https://www.yoyogames.com/tech_blog/30). Así que en mi muy personal opinión, no encuentro justificación para meter más líneas de código en un proyecto cuando el desempeño del juego no va a beneficiarse comparándolo con la "forma éstandar" que además requiere menos líneas.

En el video, los frames del juego cayeron por el uso de CPU que demanda el propio programa de captura, pero sin ejecutar éste último, en ocasiones los frames del método tradicional eran ligeramente más altos que los de las surfaces (digamos unos 30-60 frames más). Supongo que entre más surfaces se usen, la diferencia de frames se podría incrementar ligeramente.  Y bueno, ya le llené a Xizotono su post de mucho rollo que lo más seguro es que ni tome en cuenta, mil disculpas.  :-[
Link al video
https://www.dropbox.com/s/oit9ndvcflv828a/surfaces.mov?dl=0

NOTA: Las animaciones por surfaces se ven más lentas sólo por la velocidad "manual" de animación que elegí, no porque el juego se vuelva más lento. Dibujé en la surface sólo en CREATE, si se usara step para dibujar en ella, probablemente la cantidad de fps bajaría, aunque no creo que mucho.