practices patterns pattern game development best and c++ design-patterns design lua game-engine

c++ - game development patterns and best practices



Aislar el código de pegamento de Lua bindings del resto del motor de mi juego (2)

Quiero agregar soporte completo para las secuencias de comandos Lua a mi motor de juego. Uno de los principales objetivos que me he propuesto es mantener la modularidad completa. Eso significa que no quiero que el resto de mi motor, excepto la parte de encuadernación Lua, use ninguna funcionalidad específica de Lua.

Esto ha demostrado que no es difícil hasta ahora. La parte vinculante de las funciones C ++ a Lua es pura, como enlazar los objetos Vector, Color y Entity, y los módulos como la biblioteca Draw o la biblioteca Physics se aíslan fácilmente del resto del motor.

Ahora, mi problema radica en los eventos . Necesito proporcionar una manera para que los scripters respondan a los eventos del juego. Esto implica llamar funciones Lua desde el motor.

Ejemplos: Llamar a OnCreate , OnUpdate , OnCollide en entidades de C ++ en Lua.

Estos eventos ocurren en mi clase base CEntity, y el módulo Lua no tiene forma de saber cuándo y cómo ocurren.

Soluciones posibles:

  • Agregue una llamada de función a los eventos en la entidad base C ++, que desencadena un evento en la secuencia de comandos Lua

¡Malo malo malo! ¡Eso es Lua binding cosas mezcladas en la clase base de la entidad!

  • Agregue algún tipo de sistema de eventos a mi motor, donde los eventos de la entidad desencadenan un evento que también puede ser capturado por el módulo de enlace Lua y manejado adecuadamente.

Desafortunadamente no sé mucho sobre esto. Estoy seguro de que sería bastante difícil de implementar y también traer algunos problemas menores de lógica y rendimiento.

- ¿Cómo puedo desencadenar eventos (llamar a una función de enlace) en Lua desde mi motor C ++ sin tener ningún código vinculante de Lua fuera del módulo vinculante de Lua de mi programa?


Game Code Complete (3rd Ed.) Tiene una solución para ese problema exacto. Básicamente, configura el motor para tener un sistema genérico de eventos y luego tiene un módulo de scripts que se registra para los eventos a los que quiere responder. El sistema de eventos no sabe nada de Lua, y el envoltorio de Lua solo tiene que saber los nombres de los eventos que quiere manejar, por lo que el acoplamiento es muy mínimo.


Puede optar por tener (dependiendo de su diseño) una clase derivada de LuaEntity, que maneja estas cosas. También puede optar por usar funtores polimórficos en su lugar (boost :: function), que se puede suministrar y cambiar sobre la marcha.