Quiero hacer un juego modificable. ¿Cómo afecta esto a mi elección del lenguaje de programación? [cerrado]


26

Empecé a hacer algunos juegos pequeños en Java, y estoy considerando aprender C # para un proyecto más grande. Me gustaría mucho hacer un juego modificable, pero alguien me dijo que tengo que seguir con Java si quiero que el juego sea modificable, aunque no entiendo por qué.

Entonces, ¿qué características del lenguaje de programación hacen que un lenguaje sea más adecuado para juegos modificables?


3
Si quieres hacer un juego modificable, PhysicsFS puede ser una biblioteca muy útil para conocer. (No tiene nada que ver con la física, no dejes que el nombre te engañe. :))
Paul Manta

10
"pero alguien me dijo que tengo que seguir con Java si quiero que el juego sea modificable" Esto, por cierto, es BS.
Ray Dey

Respuestas:


18

Depende de cómo quieras diseñar tu sistema de modulación. Exploraré dos de ellos.

SDK

Lo más probable es que requiera que sus modders usen el mismo idioma que usted y carguen mods a través de la reflexión (o similar, según el idioma que elija). Obviamente, esto lo limitará a los lenguajes que pueden realizar enlaces tardíos, y hay muchos que pueden hacerlo (incluso C puede hacer enlaces tardíos con algunos LoadLibrarytrucos ingeniosos ). Incluso podría hacer algunos meta-modding, donde un mod podría alojar otros mods (por ejemplo, mods con script).

El primer problema con este enfoque es ocultar el estado interno. Tomando C # por ejemplo, un modder podría simplemente usar la reflexión para acceder a miembros privados, C también puede hacer esto (aunque se requiere más esfuerzo).

El segundo problema es el hosting. A la gente realmente no le gusta el código extranjero que se ejecuta en su sistema sin un entorno limitado. Como el peor de los casos, podría escribir un mod que configure una caja de semillas; Si se instaló en un ISP, podría dañar gravemente su reputación.

Scripting

Modders usaría un lenguaje como Lua para crear mods. Necesitaría un idioma que pudiera invocar código nativo (para interactuar con Lua); o tendría que escribir su propio lenguaje de secuencias de comandos en el idioma de su elección.

El primer problema aquí es que la mayoría de los lenguajes de secuencias de comandos se interpretan, lo que puede no ser aceptable para sistemas en tiempo real (aunque, vea LuaJIT); como los juegos

Irónicamente, el segundo problema todavía existe aquí; Tomando a Lua como ejemplo, me sentí extremadamente decepcionado porque tiene funciones de 'bombardeo' incluidas en la biblioteca principal / predeterminada, lo que lo hace completamente inútil como un entorno de espacio aislado (sin una gran cantidad de esfuerzo, suerte y mantenimiento), es difícil Describo lo enojado que estoy por esto, pero realmente espero que estén bebiendo algunos cócteles fuertes cuando incluyeron estas características . Obviamente, podría evitar esto fácilmente si desarrolla su propio lenguaje (consulte: UnrealScript).

Finalmente, el costo de interactuar con un motor de secuencias de comandos puede ser prohibitivo, tomando nuevamente a Lua como ejemplo, combinado con C #: C # tiene una sobrecarga considerable al invocar funciones nativas (a través de P / Invoke) y Lua es una API bastante 'conversadora'. Esto podría generar problemas si la forma en que diseña el 'SDK de script' requiere mucha conversación entre su idioma principal y su lenguaje de script (tenga en cuenta que C realmente no tiene este problema). Una vez más, podría esquivar esto escribiendo su propio lenguaje de secuencias de comandos (y en el caso de C # compilándolo en MSIL) y ejecutándolo de la manera más rápida en su entorno [virtual].

Debido a que el script se ejecuta esencialmente en un sistema completamente diferente a su código primario, puede controlar el acceso al estado interno por completo (a menos que hagan algunas cosas sofisticadas con las funciones de shell mencionadas anteriormente).

Conclusión

Hice veer un tema de bits, sin embargo, lo que básicamente se puede Garner de ese muro de texto es que usted debe ser capaz de hacer un juego modificable en cualquier idioma (me atrevería a decir que usted puede ) - pero en algunos idiomas puede llevar a más trabajo. ¿Soy un poco anal acerca de la seguridad? Sí, también debería serlo cuando se trata de código de usuario.


En el primer escenario que describiste, ¿estás hablando de que el usuario realmente programa su propia biblioteca dinámica y la conecta al juego? He visto esto usado antes en bibliotecas (por ejemplo, biblioteca de audio para agregar nuevos códecs, etc.) pero, posiblemente porque nunca he investigado demasiado el modding, nunca me he encontrado con un caso como este para un juego. Tengo curiosidad sobre esto (ya que parece muy difícil para el usuario saber cómo hacer esto y generalmente veo que los mods son accesibles), ¿conoce algún ejemplo? La mayoría de las veces veo herramientas especializadas, como editores mundiales con un poco de scripting.
David Gouveia

1
@DavidGouveia Creo que al menos una versión del motor Paradox utilizado para Europa Universalis (y juegos equivalentes para diferentes períodos de tiempo) admitió una forma de parche binario (aunque podría haber sido haciendo que el modder parche la fuente y recompile uno de las DLL de los juegos en lugar de tener el soporte de SDK adecuado) además del mod más comúnmente usado al cambiar la implementación de un archivo de datos.
Dan Neely

2
@DavidGouveia ver: motor de origen; o incluso complementos de Winamp. Creo que Quake incluso funciona así. He obtenido que usas C #; por lo que es posible que desee consultar MEF (marco de extensibilidad administrada): exponga una interfaz, cárguela mediante reflexión y Bob es su tío.
Jonathan Dickinson el

@ JonathanDickinson Oh, no tenía idea de que el motor Source funcionaba con este modelo. Siempre imaginé un conjunto de herramientas como el conjunto The Elder's Scrolls Construction. Gracias por la información (tenía una idea de cómo funcionaba, solo pensé que podría ser demasiado complicado para el modder general). Y realmente me reí de la parte de "Bob es tu tío" . :-)
David Gouveia

1
Re Lua: Estos tipos tienen un Lua de espacio aislado adecuado para usar en software de wiki (y lo suficientemente estable como para que la Wikipedia en inglés lo use). Estoy seguro de que podría adaptarlo a sus necesidades, pero algunas partes de la extensión son GPL, así que consulte con su abogado.
Kevin

16

Diría que el lenguaje no es un factor decisivo aquí, es realmente lo flexible y basado en datos que haces tu juego lo que lo define.

Cada juego se ejecuta en un conjunto de datos (por ejemplo, desde niveles, mallas, configuraciones, elementos). La diferencia entre un juego normal y un juego modificable es que el último proporciona herramientas que permiten al usuario modificar los datos existentes (o agregar sus propios datos). Independientemente del idioma que elija, intente hacer que su juego sea lo más basado en datos posible y evite codificar cualquier contenido del juego. Prácticamente cualquier idioma que probablemente elija puede leer datos del disco, que es la mayoría de lo que necesita.

También está a la mitad del camino si solo crea las herramientas para su uso personal (por ejemplo, su propio editor de niveles) y luego las perfecciona y las comparte con sus usuarios. El editor de nivel Super Meat Boy fue más o menos eso, una versión mejorada de la herramienta utilizada durante el desarrollo del juego.

Y dependiendo del tipo de juego, es posible que desee permitir que los usuarios escriban algunos de los comportamientos del juego. En su caso, debe considerar incorporar un lenguaje de script en su juego desde el principio (ya sea el suyo o uno existente como Lua o Python, que son opciones populares). Esto también se incluye en la categoría de diseño basado en datos. Si decide utilizar un lenguaje de script existente, puede valer la pena verificar si el lenguaje de programación que elija tiene enlaces para ese lenguaje de script (generalmente en forma de bibliotecas de terceros).


5

El idioma que elijas realmente no determina cuán modificable es un juego, la forma en que usas el idioma es más importante.

Si la mayor parte de su juego se basa en datos (es decir, los datos del juego se definen en un archivo que se lee de su código), el juego puede ser muy modificable. Esto se puede hacer en casi cualquier idioma. El uso de un lenguaje de secuencias de comandos también facilita la modificación de un juego.

Sin embargo, eso no significa automáticamente que no usar esas cosas hace que sea imposible modificar un juego. Minecraft, por ejemplo, no es un juego muy modificable en absoluto, sin embargo, hay descompiladores bastante buenos disponibles para Java y una comunidad muy grande para Minecraft, por lo que se hicieron muchas herramientas para hacer que Minecraft sea modificable (varios cargadores de modulación, Bukkit). Con esas herramientas es posible modificar Minecraft (sin embargo, probablemente sean técnicamente ilegales en algunos países).

El mejor consejo que puedo darle es utilizar las herramientas que desea que usen los modders; Si define un NPC a partir de un archivo, se puede modificar, si lo usa en un caso especial en el código, probablemente no se pueda modificar.


1

Java es perfectamente adecuado para escribir un juego modificable.

Una vez dicho esto, la mejor manera de hacer que un juego sea modificable es adoptar un lenguaje dinámico que pueda integrarse en la aplicación más amplia y usarse para crear secuencias de comandos. Por lo general, desea un lenguaje dinámico porque el punto es poder interactuar con el código en tiempo de ejecución, sin pasar por un ciclo completo de compilación / compilación / prueba.

Algunas opciones de lenguaje dinámico a considerar:

  • Groovy : un excelente lenguaje dinámico similar a Java que puede integrarse en programas Java más grandes.
  • Clojure : un Lisp potente y dinámico para la JVM. Puede ser difícil para algunos modders entenderlo, pero es un lenguaje excepcionalmente poderoso y puede integrarse muy fácilmente. Todavía no lo he visto usado para modificar juegos, pero no hay razón para no hacerlo.
  • Lua : un lenguaje de programación de juegos muy popular. Creo que hay versiones para la JVM que puedes usar desde Java (aunque no las he probado yo mismo)
  • JavaScript : disponible en la JVM a través de Rhino . Una opción bastante sólida para las secuencias de comandos de juegos, ya que muchas personas conocen JavaScript, además de que el modelo de objeto prototipo se adapta muy bien a los modos de juego.

-2

Hay una manera más fácil de hacer esto en Java, aunque es un poco descuidado. Todo lo que tiene que hacer es tomar los archivos dot java en una carpeta y luego colocar este archivo por lotes con la carpeta, asígnele el nombre Ejecutar:

javac /src/.java Java / src /

Nota: puede agregar tantas clases como desee. Nota: en la última línea, asegúrese de NO colocar extensiones, también conocidas como .java, .exe, .bat, ect.

Básicamente, eso solo recompilará el código cada vez que se ejecute el juego, por lo que si la fuente del juego cambia, lo compilará y luego ejecutará el juego recién compilado ... Lamentablemente, no puede agregar mods de otras personas al juego.


Jacob No creo que hayas entendido la pregunta, lee las respuestas y mira si eso te ayuda a entender lo que se discutió aquí.
vikki
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.