Hola! Bueno, el jugador es un cursor que tiene que atravezar el nivel manteniéndose siempre sobre las superficies blancas. Estoy en etapa de pre-producción, escribiendo el GDD, y estoy por definir como funcionarán las superficies en si. Cada objeto que actue como superficie será hijo de objSurface, y en el cursor, un script recorre cada pixel del sprite con un collision_point() para revisar si todos los pixeles del cursor están colisionando con objSurface, si uno solo de los pixeles está fuera de la superficie, se pierde y se ejecuta el script scr_lose(). Algunas superficies están en movimiento, otras tienen peso, otras se mueven con switches, otras son de distintos colores, otras son gripables (agarrables y movibles con el mismo cursor), otras se mueven con el scroll de la rueda del mouse, otras jiran, y muchas variables para distintos niveles.
(https://s18.postimg.org/oug3h6mex/Concept_art_surfaces_1.jpg)
(https://s18.postimg.org/h2zdimi9l/Concept_art_surfaces_2.jpg)
(https://s18.postimg.org/jll2jb3zt/Curzrs.Inc_art1.jpg)
(https://s18.postimg.org/9pjzjny7t/Curzrs.Inc_art2.jpg)
(https://s18.postimg.org/oa12eht6h/Curzrs.Inc_Cursor_art3.jpg)
(https://s18.postimg.org/tzhayszcp/Curzrs.Inc_Cursor_art4.jpg)
(https://s18.postimg.org/e2ij236yh/menu_concept_art_1.jpg)
(https://s18.postimg.org/vtu5gjmd5/menu_concept_art_3.jpg)
Así que, una vez contextualizado, mi pregunta es ¿Cómo manejarían ustedes la construcción de estos niveles? No diseño los niveles aún, es decir en el GDD, pero creo que definir como se van a construir me puede ahorrar bastantes problemas en el futuro. Entonces, ¿Ustedes mantendrían las superficies como piezas pequeñas como sprites en objetos, círculos, cuadrados, agunos polígonos... para luego hacer una construcción en el editor de rooms (estos talvés limite la diversidad de los niveles); o quizá dibujarían todo el nivel aparte, para luego importarlo como un sprite separado para cada nivel (esto sería una confución, porque tendría que gestionar por aparte las zonas del nivel, las que se nueven, las que no...)? ¿Qué dicen?
Este es mi primer verdadero videojuego formal, y quiero que quede lo mejor posible, por eso les pido ayuda. No he manejado antes muchos rooms y objetos en un solo proyecto, y no sé cual es la mejor forma de llevar a cabo, por ejemplo, este tipo de niveles, que no constan de bloques simples que todos los niveles comparten de acuerdo a un tema.
Como sea, muchas gracias de antemano!
Creo que la mejor forma de armar los niveles sería crear un editor propio que permita ensamblar las piezas básicas.
Para detectar el cursor dentro de las piezas no recomiendo usar collision_point, ya que se deben activar las colisiones precisas y la revisión se hace pixel por pixel, mientras más grandes sean los sprites más lento será el sistema. Se me ocurren dos métodos para optimizar la detección: El primero sería definir los objetos con el sistema de física (Box2D) y usar physics_test_overlap para detectar la superposición con un objeto pequeño que represente al cursor. El segundo método sería definir las áreas de colisión de forma geométrica y detectar el cursor con funciones como estas:
point_in_circle (http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/point_in_circle.html)
point_in_rectangle (http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/point_in_rectangle.html)
point_in_triangle (http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/point_in_triangle.html)
point_in_polygon (http://www.gmlscripts.com/script/point_in_polygon)
punto_en_rect_rotado (http://www.comunidadgm.org/desarrollo-de-scripts/punto-en-rectangulo-rotado/)
Algo que requiere un poco de trabajo es lograr que los bordes de las figuras se vean nítidos al rotarlas. Una forma fácil es usar un nivel alto de antialias con display_reset, pero no es recomendable usarla en teléfonos proque requiere mucho procesamiento. Otra forma es usar texturas o sprites con un contorno igual al color del fondo, así el borde se verá nítido simplemente con activar la interpolación entre pixels, pero tendrás que ser muy cuidadoso en la forma de ensamblar las piezas.
¿A qué te refieres con "Crear un editor propio"?
Este es mi script de detección de colisiones:
for(var v=0;v<sprite_width;v++){
for(var h=0;h<sprite_height;h++){
if(collision_point(x+v,y+h,objCursor,1,0)){
if(!collision_point(x+v,y+h,objSurphase,1,1)){
scr_lose()
}
}
}
}
La razón por la que reviso pixel por pixel, es que si simplemente uso algo como !place_meeting(x,y,objSurface), scr_lose() se activaría solo cuando ningún pixel está tocando objSurface. En cualquier caso ¿Podría explicarme lo de las físicas 2D? ¿Hablas de activar el motor de físicas?
Me refiero a programar algo como el Editor de Rooms de GMS, pero con caracterísitcas que faciliten la creación de los niveles y que guarde la información en tu propio formato.
Este es un ejemplo de editor programado en GMS, que permite crear "fixtures" para el sistema de física con formas complejas: https://marketplace.yoyogames.com/assets/4275/fixture-editor (https://marketplace.yoyogames.com/assets/4275/fixture-editor)
En el marketplace hay varios ejemplos de editores.