Estoy desarrollando un motor de juego. Se supone que se basa en una entidad / componentes. Para desarrollar mi juego, pensé en usar un lenguaje de script para crear las entidades.
Por ejemplo, si quiero agregar un tipo de monstruo que sea agresivo para el jugador, será una entidad con varios componentes; esos componentes cambiarán con el tipo de monstruo, por lo que si tengo cien tipos diferentes de monstruos, en mi juego, no tendré que crear un nuevo método para cada uno de ellos directamente en mi código de juego.
¿Debo usar un lenguaje de scripting para describir esta entidad, en términos de componentes o hay algo más que funcione mejor? En términos más generales, ¿cómo debo usar las secuencias de comandos en mi juego?
scripting
entity-component
Nathan
fuente
fuente
Respuestas:
Mi juego usa un marco de componentes de entidad y usa scripts para definir entidades (esto no define directamente el comportamiento, hablaré más sobre eso al final). Los scripts definen los componentes reales que se utilizarán para crear cada entidad. Utiliza un lenguaje de script simple que creé. Aquí hay una versión simplificada de uno de mis scripts:
Gran parte de eso se describe a sí mismo, pero aquí hay algunos aspectos destacados:
baseAttributes
etiqueta hace referencia a otro archivo de script que define componentes comunes que no quiero tener que redefinir varias veces. Contiene componentes comoposition
,liferequirements
etc. Si algún componente se define aquí nuevamente, este componente sobrescribirá el común.[NAME] { }
conjunto define un nuevo componente que se agregará a estas entidades.0.01:0.015
), cuando se crea un nuevo duende se crea con un componente que tiene un valor aleatorio en ese rango. Por lo tanto, cada duende tendrá habilidades ligeramente diferentes y velocidades ligeramente diferentes. Esta configuración define que todos los duendes comenzarán con habilidades realmente buenas para colocar cubos y minar, lo cual es solo para mis propios fines de prueba. Pero como estoy seguro de que puedes adivinar, es muy fácil cambiar los valores a lo que quiera.Todo esto implica crear un analizador personalizado, algún tipo de estructura para contener las definiciones de entidad (¡yo llamo el mío, el Léxico!) Y una fábrica para tomar esas definiciones de entidad y generar nuevas entidades. Para mí, este sistema todavía está en sus primeras etapas, pero está resultando muy, muy bien. Es un sistema bastante poderoso para definir entidades rápidamente y le permite crear cualquier entidad que desee utilizando los componentes que ha creado. Si no se siente cómodo creando su propio analizador, creo que XML funcionará bien. Convertí el mío de un analizador recursivo pushback que escribí para un pequeño lenguaje de programación inventado.
Como puede ver, esto define la entidad. Mencioné que no define directamente el comportamiento. Sin embargo, puede definir fácilmente cosas como enemigos odiados y qué tan agresivamente reaccionar ante dichos enemigos. Esto sería tan simple como definir cualquier componente que use para controlar dicho comportamiento. Mis entidades también tienen un componente de inteligencia (no mostrado) que define cosas como:
Independientemente de cómo se defina el suyo, es su sistema el que manejará los datos en ese componente, lo que a su vez afecta el comportamiento de sus entidades.
fuente
if player.hasPoints(10) then i++ end skillTree[i]
sería un pseudocódigo. Sin embargo, no tengo idea de cómo esa pregunta es relevante para la publicación.Si todo lo que realmente necesita es una forma de definir los componentes de un Monstruo, entonces XML funcionaría bien, tanto C # como Java tienen una implementación increíblemente rápida.
Tu xml podría ser
Entonces su clase Mob podría verse así. (Java)
Donde IPersonality es una interfaz.
Luego puede cargar su xml y analizar cada valor a través de una fábrica.
por ejemplo, analizar el valor de personalidad en la fábrica de personalidad que es simplemente:
Entonces podrías crear una mafia así
La clave es que su motor conoce el formato del xml y tiene una fábrica para todo lo que necesita.
Una ventaja de xml es que puede definir su propio esquema para asegurarse de que el formato sea siempre correcto. Consulte aquí .
Espero que esto ayude
fuente
Python está bien, creo. A menudo, LUA también es una buena alternativa si desea agregar capacidades de secuencias de comandos a sus programas.
Puedes usar XML para describir el comportamiento de tus monstruos, esto implicaría algo de codificación en el código del juego real porque guardarás solo el "nombre" o algunos atributos de acuerdo con el comportamiento (velocidad, tipo de arma que usa el monstruo, etc.) del comportamiento a utilizar en su código de juego.
Si utiliza un Scriptengine (por ejemplo, LUA), puede transferir este código desde su programa precompilado a los archivos de script que se cargan durante el tiempo de ejecución. Para hacer esto, debe exponer la API de sus "monstruos" al scriptengine. Eso le permite llamar a los métodos del código del juego de monstruos desde el exterior.
fuente