¿Alguien sabe cómo programar un juego usando cualquier motor de juego 3D?
Hablemos sobre cómo escribir un motor 3D de alto rendimiento. Su motor debe proporcionar: superficies, iluminación dinámica, niebla volumétrica, espejos, portales, skyboxes, sombreadores de vértices, sistemas de partículas (sistemas de partículas), modelos de malla estática (modelos de malla estática), animaciones de modelo de malla (modelo de cuadrícula de animación). Si ya sabe cómo implementar todas las funciones anteriores, probablemente pueda combinarlas todas en un solo motor.
¡Espera! Antes de comenzar a escribir código, debes pensar en cómo se construirá tu motor. La mayoría de las veces estás ansioso por crear un juego, pero si empiezas a codificar para el motor de inmediato tendrás muchas dificultades y, más adelante en el desarrollo, tendrás que reescribir muchas partes del juego. Codifique varias veces para agregar nuevos efectos y controles, o incluso darse por vencido y fallar. Tomarse un poco de tiempo para pensar en su motor le ahorrará mucho tiempo y problemas. No te apresurarías a emprender un gran proyecto; tal vez te rendirías antes de que el motor esté terminado y te dedicarías a otra cosa. Bueno, tal vez no puedas hacer estas cosas hasta que domines el método de aprender lo que necesitas. Es hermoso terminar un diseño, ¡te sentirás mejor y brillarás gracias a ello!
Analicemos los componentes básicos necesarios para un motor de juego 3D completamente funcional. Primero, aquí hay información para desarrolladores que tienen experiencia en 3D pero necesitan orientación. Estos proyectos no son difíciles y se pueden dominar rápidamente, pero hay que aplicarlos. Para que puedas empezar más rápido, aquí tienes una descripción general de "cuánto trabajo" y "cuántas partes" tiene un motor de juego. Llamaré a estas partes Sistema, Consola, Soporte, Renderizador/Núcleo del motor, Interfaz del juego y Herramientas/Datos.
Herramientas/Datos
Durante el desarrollo siempre necesitarás algunos datos, pero desafortunadamente no es tan simple como escribir un archivo de texto o definir un cubo. Como mínimo, necesitarás un editor de modelos 3D, un editor de niveles y un programa de gráficos. Puede comprarlos para cumplir con sus requisitos de desarrollo o puede encontrar algunos programas gratuitos en línea. Desafortunadamente, es posible que también necesites algunas herramientas que simplemente no puedes comprar (aún no existen) y luego tendrás que escribirlas tú mismo. Con el tiempo, probablemente tendrás que escribir un editor de niveles de tu propio diseño porque no podrás conseguir lo que necesitas. Es posible que también tenga que escribir algún código para encapsular una gran cantidad de archivos, lo cual es engorroso de manejar durante todo el día cuando tiene cientos o miles de archivos para procesar. También necesitarás escribir algunos convertidores o complementos para convertir el formato del modelo del editor de modelos 3D a tu propio formato. También necesitarás herramientas para procesar datos del juego, como estimación de visibilidad o mapeo de luz.
Una regla básica es que es posible que necesites poner tanto o más código en la herramienta de diseño como en el juego mismo. Al principio, siempre encuentras formatos y herramientas ya preparados, pero después de un tiempo descubres que necesitas muchas cosas específicas en el motor y abandonas la antigua forma de escribir.
Quizás la herramienta de terceros que estás utilizando actualmente sea tan popular que tengas que prestar atención a su diseño. Porque una vez que publique su motor como abierto o permita modificaciones, tal vez algún día alguien venga y aplique su desarrollo, lo extienda o lo modifique de alguna manera.
Quizás también deberías dedicar tanto tiempo a diseñar arte, niveles, efectos de sonido, música y modelos físicos como a escribir juegos, herramientas y motores.
Sistema
El sistema es la parte del motor que se comunica con la propia máquina. Al trasladar un buen motor, el sistema es el único lugar donde se deben realizar cambios significativos (agregaciones de código). Dividimos el sistema en varios subsistemas, incluidos gráficos, entrada, sonido, temporizadores y configuración. El sistema principal es responsable de inicializar, actualizar y cerrar todos los subsistemas.
El subsistema de gráficos es muy intuitivo en los juegos, si quieres dibujar algo en la pantalla, eso es lo que hace el subsistema de gráficos. En la mayoría de los casos, el subsistema de gráficos se implementa mediante OpenGL, Direct3D, Glide o renderizado por software. Idealmente, incluso podría admitir todas estas API y luego abstraer una "capa de gráficos" encima de las API implementadas para brindarle al desarrollador o jugador del cliente más opciones para una compatibilidad y rendimiento óptimos.
El subsistema de entrada necesita controlar y recibir uniformemente los activadores de entrada de diferentes dispositivos de entrada (teclado, mouse, gamepad, joystick). (Procesamiento transparente) Por ejemplo, en un juego, el sistema detecta si la posición del jugador avanza en lugar de detectar directamente cada dispositivo de entrada por separado, el subsistema de entrada envía una solicitud de información de entrada y luego el subsistema de entrada envía una solicitud de entrada. información El trabajo real se realiza detrás de escena (detectando cada dispositivo de entrada individualmente) y todo es transparente para el desarrollador del cliente. Los usuarios y jugadores pueden cambiar entre dispositivos de entrada con mucha libertad, y resulta muy fácil obtener un comportamiento uniforme en los diferentes dispositivos de entrada.
El sistema de sonido se encarga de cargar y reproducir sonidos. Este subsistema es muy simple y directo, pero muchos juegos actuales admiten audio 3D, que es un poco más complejo de implementar.
Muchas de las excelentes funciones de los motores de juegos 3D se basan en el sistema de tiempo. Por lo tanto, es necesario dedicar algo de tiempo a familiarizarse con el subsistema del temporizador. Aunque es muy simple y todo en el juego se mueve mediante activadores de tiempo, un buen diseño te evitará tener que escribir el mismo código de control una y otra vez para implementarlo. ...
El subsistema de configuración se encuentra por encima de todos los demás subsistemas y es un excelente lugar para comenzar. Es responsable de leer archivos de registro de configuración, parámetros de línea de comando o configuraciones de ejecución. Todos los subsistemas se comunican con él durante la inicialización y operación. Este sistema hace que cambiar la resolución de la imagen, la profundidad del color, las combinaciones de teclas, las opciones de soporte de sonido e incluso cargar juegos sea increíblemente fácil. Diseñar el motor para que sea más configurable facilitará la depuración y las pruebas, y también facilitará a los jugadores y usuarios elegir cómo quieren que se ejecuten sus juegos.
Consola
¡Jaja! Sé que todo el mundo quiere un sistema de consola como Quake. Pero es una muy buena idea. Las variables y funciones de la línea de comandos te permiten cambiar la configuración del juego o del motor mientras se ejecuta sin reiniciar. Generar información de depuración durante el desarrollo puede ser muy eficiente. Muchas veces, es necesario probar el valor de una serie de variables y, obviamente, enviar estos valores a la consola es mucho más rápido que ejecutar un depurador. Cuando el motor está en ejecución, una vez que se descubre un error, no es necesario salir del programa inmediatamente a través de la consola; puede realizar algunos controles muy simples e imprimir mensajes de error. Si no desea que los usuarios finales vean o utilicen la consola, puede desactivarla fácilmente y no creo que nadie la vea.
Soporte
El sistema de soporte se utilizará en todas partes del motor. Este sistema contiene todos los componentes matemáticos del motor (puntos, polígonos, matrices, etc.), el administrador de almacenamiento (interno), cargadores de archivos y contenedores de datos (también puedes usar STL si no quieres escribirlo tú mismo) . Estas tareas del módulo parecen muy básicas y de bajo nivel, y es posible que desee reutilizarlas en otros proyectos relacionados.
Renderer/Engine Core
Jaja, sí, ¡a todos les encanta el renderizado de gráficos 3D! Debido a la variedad de formas de renderizar un mundo 3D, es casi imposible proporcionar una descripción general de los distintos procesos de gráficos 3D que funcionan de diferentes maneras.
No importa cómo funcione su renderizador, lo más importante es mantener sus componentes basados y concisos.
Lo primero de lo que debes estar seguro es que tendrás diferentes módulos para diferentes tareas. Dividiré el renderizador en las siguientes partes: Visibilidad, Detección y respuesta de colisiones, Cámara, Geometría estática, Geometría dinámica. y renderizadores. Geometría, geometría dinámica, sistemas de partículas, vallas publicitarias, mallas, palcos, iluminación, niebla, sombreado de vértices y salida. sombreado de vértices) y salida.
Cada una de estas partes requiere una interfaz para implementar fácilmente cambios en la configuración, ubicación, orientación y otras propiedades que pueden ser relevantes para la configuración del sistema.
Un inconveniente importante que se produce es la "extensión de funciones", dependiendo de las funciones que desee implementar durante el proceso de diseño. Pero si no incorpora nuevas funciones a su motor, descubrirá que todo se vuelve más difícil y la forma de resolver los problemas empeora.
Otro enfoque razonable es hacer que todos los triángulos (o caras) terminen en el mismo punto en el proceso de renderizado.
(no todos los triángulos siempre, estamos hablando de listas de triángulos, sectores, barras, etc.) Trabaje un poco más y haga que todos los formatos de objetos pasen por el mismo código de luz, niebla y sombra, por lo que es solo cuestión de Al cambiar el ID de materiales y texturas, puedes hacer que cualquier polígono se vea diferente fácilmente.
Es muy fácil renderizar cualquier polígono de manera diferente simplemente cambiando el material y la identificación de la textura.
Esto no afectará muchos puntos renderizados, pero puede generar una gran cantidad de código redundante si no tienes cuidado.
Es posible que eventualmente te des cuenta de que implementar todos los efectos interesantes que necesitas ocupa solo el 15% de tu código, o incluso menos. La razón de esto es que la mayoría de los motores de juegos no se tratan solo de renderizar gráficos.
Interfaz del juego
Una parte importante del motor 3D (juego) es ------ es un motor de juego. Pero no es un juego. Los juegos reales requieren componentes que nunca deberían incluirse en un motor de juego. El medio de control entre el motor y la producción del juego hace que el diseño del código sea más claro y fácil de aplicar. Aunque se trata de un código adicional, hace que el motor del juego sea muy fácil de reutilizar y también facilita el desarrollo al diseñar un lenguaje de programación para la lógica del juego o colocar el código del juego en una biblioteca. Si intentas integrar el diseño de tu sistema lógico de juego en el propio motor, una serie de problemas y modificaciones te impedirán reutilizar el motor.
Entonces, en este punto, probablemente estés pensando en qué proporciona exactamente la capa multimedia que conecta el motor y el juego. La respuesta es control. Casi todas las partes del motor tienen propiedades dinámicas, y la capa de motor/juego proporciona interfaces para modificar estas propiedades dinámicas. Estas propiedades incluyen cámaras, propiedades del modelo, luces, física del sistema de partículas, reproducción de sonidos, reproducción de música, manejo de entradas y cambio de niveles. Básicamente, tener esta interfaz en el motor es esencial si quieres que tu juego implemente estos elementos de manera elegante.
Juegos
No puedo decirte cómo programar un juego aquí. Ahora es tu turno de jugar. Creo que es mucho más fácil diseñar y codificar juegos si ya cuentas con una excelente capa multimedia para tu gran motor.
El diseño de motores de juegos 3D es un proyecto de software enorme. No es imposible diseñarlo y escribirlo por tu cuenta, pero no es sólo cuestión de pasar una o dos noches enteras, probablemente estarás escribiendo varios megabytes de código fuente. Si no tienes suficiente perseverancia y pasión, probablemente no podrás hacer el trabajo.
Por supuesto, no espere escribir un motor completo en su primer intento; elija el motor pequeño que necesita para un proyecto pequeño e impleméntelo. Trabaja duro en tus propios términos y tendrás éxito.