Después de hacer dos preguntas sobre los sistemas de entidades ( 1 , 2 ) y leer algunos artículos sobre ellos, creo que los entiendo mucho mejor que antes. Todavía tengo algunas incertidumbres, principalmente sobre la construcción de un emisor de partículas, un sistema de entrada y una cámara. Obviamente todavía tengo algunos problemas para comprender los sistemas de entidades, y podrían aplicarse a una gama de objetos completamente diferente, pero elegí estos tres porque son conceptos muy diferentes, deberían cubrir un terreno bastante amplio y ayudarme a comprender los sistemas de entidades y cómo manejar problemas como estos, a medida que surgen.
Estoy construyendo un motor en JavaScript, y he implementado la mayoría de las características principales, que incluyen: manejo de entrada, sistema de animación flexible, emisor de partículas, clases y funciones matemáticas, manejo de escena, una cámara y un render, y un montón de otras cosas que los motores suelen soportar. Leí la respuesta de Byte56, que me interesó en convertir el motor en un sistema de entidad. Seguiría siendo un motor de juego HTML5, con la filosofía básica de la escena, pero debería admitir la creación dinámica de entidades a partir de componentes.
El problema que tengo ahora es adaptar mi viejo concepto de motor a este nuevo paradigma de programación. Estas son algunas de las definiciones de las preguntas anteriores, actualizadas:
Una entidad es un identificador. No tiene ningún dato, no es un objeto, es una identificación simple que representa un índice en la lista de escenas de todas las entidades (que realmente planeo implementar como una matriz de componentes).
Un Componente es un titular de datos, pero con métodos que pueden operar con esos datos. El mejor ejemplo es un
Vector2D
componente de "Posición". Tiene datos:x
yy
, pero también algunos métodos que hacen que operan en los datos un poco más fácil:add()
,normalize()
y así sucesivamente.Un sistema es algo que puede operar en un conjunto de entidades que cumplen con ciertos requisitos; por lo general, las entidades necesitan tener un conjunto específico de componentes para ser operados. El sistema es la parte "lógica", la parte "algoritmo", toda la funcionalidad suministrada por los componentes es puramente para facilitar la gestión de datos.
Cámara
La cámara tiene una Vector2D
propiedad de posición, una propiedad de rotación y algunos métodos para centrarla alrededor de un punto. Cada cuadro, se alimenta a un renderizador, junto con una escena, y todos los objetos se traducen según su posición. Luego se representa la escena.
¿Cómo podría representar este tipo de objeto en un sistema de entidad? ¿Sería la cámara una entidad, un componente o una combinación (según mi respuesta )?
Emisor de Partículas
El problema que tengo con mi emisor de partículas es, de nuevo, qué debería ser qué. Estoy bastante seguro de que las partículas en sí mismas no deberían ser entidades, ya que quiero admitir más de 10,000 de ellas, y creo que crear tantas entidades sería un duro golpe para mi rendimiento.
¿Cómo podría representar este tipo de objeto en un sistema de entidad?
Gerente de entrada
El último del que quiero hablar es cómo deben manejarse las entradas. En mi versión actual del motor, hay una clase llamada Input
. Es un controlador que se suscribe a los eventos del navegador, como las pulsaciones de teclas y los cambios de posición del mouse, y también mantiene un estado interno. Luego, la clase de jugador tiene un react()
método que acepta un objeto de entrada como argumento. La ventaja de esto es que el objeto de entrada podría serializarse en .JSON y luego compartirse a través de la red, lo que permite simulaciones fluidas para varios jugadores.
¿Cómo se traduce esto en un sistema de entidad?