Funcionamiento de GameMaker: 3D de objetos
A pesar de que Game Maker está pensado principalmente para el diseño y desarrollo de juegos 2D (2 dimensiones) o isométricos hay que tener en cuenta que también nos ofrece la posibilidad de trabajar con elementos 3D a través de algunas funciones básicas. En este artículo vamos a ver algunos de los conceptos iniciales a tener en cuenta al trabajar con objetos 3D en GameMaker y cómo empezar a trabajar con ellos.
Consideraciones previas
Primero de todo volver a remarcar que las opciones 3D de GameMaker son básicas ya que es un motor enfocado al 2D. Hay que decir también que para el uso de objetos 3D GameMaker se basa principalmente en el uso de programación en GML ya que el uso de bloques como podemos usar habitualmente no está adaptado a estas funcionalidades.
Como hemos dicho la funcionalidad 3D de GameMaker es limitada y hay muchas cosas que el motor no trae integradas de forma nativa y que deberíamos programar nosotros o buscar soluciones de terceros para poder realizarlas y de las que en otros motores podemos disfrutar sin problemas. Vamos a empezar primero repasando algunas de estas funcionalidades a las que no podremos acceder en GameMaker.
Algunas de las funcionalidades que no podremos encontrar de forma nativa al querer usar objetos 3D en GameMaker pueden ser: el uso de shaders, movimiento y posicionamientos 3D, colisiones de polígonos precisas, renderizado inteligente, sistemas avanzados de animación.
Configuración objetos 3D en GameMaker
Para empezar a usar objetos 3D en GameMaker primero debemos crear un objeto que configure la escena para este propósito, veamos las funciones básicas que necesitaremos en el evento Create para establecer la configuración inicial:
//Activar el modo 3D
d3d_start();
//Activar la iluminación 3D
d3d_set_lighting(true);
//Definiremos una luz global direccional, para tener una iluminación básica
//Primero indicaremos la dirección (ind, dx, dy, dz, col)
//siendo:
//ind = identificador de la luz
//dx = componente x del vector de dirección de la luz
//dy = componente y del vector de dirección de la luz
//dz = componente z del vector de dirección de la luz
//col = color de la luz
d3d_light_define_direction(1,1,0.5,0,c_white);
//Activamos la iluminación
d3d_light_enable(1,true);
Por último deberemos añadir una llamada más en el evento Draw para crear la vista que vamos a usar para visualizar nuestros objetos 3d:
//d3d_set_projection(xfrom, yfrom, zfrom, xto, yto, zto, xup, yup, zup)
//siendo:
//xfrom = La coordenada x de la posición desde la que mirar
//yfrom = La coordenada y de la posición desde la que mirar
//zfrom = La coordenada z de la posición desde la que mirar
//xto = La coordenada x de la posición hacia la que mirar
//yto = La coordenada y de la posición hacia la que mirar
//zto = La coordenada z de la posición hacia la que mirar
//xup = El componente x del vector “arriba”
//yup = El componente y del vector “arriba”
//zup = El componente z del vector “arriba”
d3d_set_projection(x,y,0,x+20,y,0,0,0,1);
Finalmente nos debemos asegurar que el objeto de configuración de la cámara sea el primero en ser representado, para ello usaremos depth del objeto y le pondremos un valor lo suficientemente grande (alrededor de 20000000 ).
Dibujando Primitivas
Una vez configurada la cámara de nuestra escena podemos empezar a dibujar diferentes objetos, para ello empezaremos con una simple primitiva con forma de cubo. Para ellos crearemos un nuevo objeto y en el evento Draw usaremos el siguiente código:
//definimos el color del cubo antes pintar
draw_set_color(c_white);
//d3d_draw_block(x1, y1, z1, x2, y2, z2, tex, hrepeat, vrepeat)
//x1 = Coordenada x inicial del cubo
//y1 = Coordenada y inicial del cubo
//z1 = Coordenada z inicial del cubo
//x2 = Coordenada x final del cubo
//y2 = Coordenada y final del cubo
//z2 = Coordenada z final del cubo
//tex = El identificador de la textura a usar (-1 para no usar textura)
//hrepeat = Número de repeticiones horizontales de la textura
//vrepeat = Número de repeticiones verticales de la textura
d3d_draw_block(x-16,y-16,-16,x+16,y+16,16,-1,1,1);
Si generamos una escena Room nueva y agregamos los dos objetos creados, al ejecutar la escena veremos un cuadrado dibujado en la pantalla (podemos cambiar el color de fondo de la escena para una mejor visualización), si cambiamos los valores de proyección del objeto de configuración (d3d_set_projection) podremos ver el cubo desde diferentes perspectivas. Hay otras figuras primitivas que podemos usar:
d3d_draw_cylinder(x1, y1, z1, x2, y2, z2, tex, hrepeat, vrepeat, closed, steps)
d3d_draw_cone(x1, y1, z1, x2, y2, z2, tex, hrepeat, vrepeat, closed, steps)
d3d_draw_ellipsoid(x1, y1, z1, x2, y2, z2, tex, hrepeat, vrepeat, closed, steps)
d3d_draw_wall(x1, y1, z1, x2, y2, z2, tex, hrepeat, vrepeat)
d3d_draw_floor(x1, y1, z1, x2, y2, z2, tex, hrepeat, vrepeat)
Esto es solo una primera aproximación al trabajo con objetos 3D dentro de gamemaker, pero como puedes imaginar, a pesar de no ser un motor orientado a la creación de juegos 3D, podemos realizar mucho más.
¿Quieres aprender más sobre el uso de objetos 3D en GameMaker? Déjanos tu comentario
Curso relacionado: Curso Superior de Diseño y Desarrollo de Videojuegos