El recurso principal en mi juego es masivo , almacenado como un número de coma flotante que cambia con el tiempo. Los nodos de recursos aumentan la masa y las fábricas la drenan. Por ejemplo, si tengo un nodo de recursos que produce 5 masas por segundo, ganaré 5 * deltaT
masa en cada paso del juego. La masa se muestra redondeada al entero más cercano, y los indicadores de ganancia / pérdida se muestran en décimas.
¿Cómo debo manejar la masa que llega a cero? Esto crea una condición de carrera si varias fábricas están tratando de construir a la vez: las fábricas primero en la cola o las que consumen menos recursos tienen prioridad una vez que ingresan más recursos y, por lo tanto, construyen más rápido que los demás.
¿Cómo puedo lidiar con esto? ¿Debo omitir el paso por completo?
fuente
Respuestas:
Estoy de acuerdo con Petr: no hay una forma establecida de hacerlo. Cómo quieres hacerlo es cuestión de cómo quieres diseñar tu juego.
En esta circunstancia, sin embargo, creo que es inmediatamente obvio el tipo de mecánica que estás tratando de conseguir: solo quieres que las cosas se produzcan lo más rápido posible, dentro de la cantidad de masa que tienes disponible.
Produciendo dentro de la capacidad
Voy a sacar una hoja del libro del Comandante Supremo, ya que estás haciendo un sistema muy parecido al suyo: si estás produciendo por encima de la capacidad, la mejor manera de lidiar con eso es hacer que la producción disminuya en todos los ámbitos. Bajar la capacidad de producción es en realidad bastante simple.
Un mecánico de velocidad de producción.
En cada paso de actualización, sus fábricas no solo producen una cantidad establecida: operan según una velocidad de producción , que determina cuánto progreso logran en cada paso y cuánta masa consumen. Cuando estás produciendo al 75% de su capacidad, tus fábricas avanzan un 75% más en cada paso y usan hasta un 75% de la masa en comparación con el 100% de su capacidad.
Para calcular la velocidad de producción, antes de construir cualquier cosa, debe consultar a sus fábricas para determinar los recursos totales que se utilizarían en este paso a plena capacidad. Luego realiza un cálculo simple:
Digamos que necesita 125 en masa este paso para producir a plena capacidad, pero solo tiene 100 en masa este paso. Esta ecuación le proporciona una velocidad de producción de 0.8 (la representación decimal del 80%). Cuando le dices a tus fábricas que realmente realicen su construcción , les das este valor para decirles a qué velocidad están construyendo: y ahora tu producción se ralentiza en todos los ámbitos.
Alternativas
También podría comenzar a cerrar las fábricas temporalmente hasta que se libere la capacidad de producción, y podría ser muy interesante ver que esto sucede a las fábricas más alejadas de los generadores cuando tienen una capacidad extremadamente baja.
Múltiples recursos?
Depende de usted cómo maneja esto; Hay muchas opciones. El más simple es probablemente calcular una capacidad de producción para cada recurso y luego elegir el más bajo , de modo que su recurso más débil se convierta en un cuello de botella para el resto.
fuente
Aunque me gusta la respuesta de Jonathan Hobbs, creo que un sistema de colas es aún más simple:
Esto probablemente funcionará en promedio de la misma manera que la implementación de Jonathan. Sin embargo, la solución de Jonathan puede dar problemas si la velocidad de trabajo se establece muy baja y mi implementación podría tener una fábrica con una solicitud de recursos muy alta para este marco si bloquea otras fábricas para varios marcos.
fuente
Estoy desarrollando un sistema de suministro similar en mi propio juego, por lo que también he estado pensando en cómo resolver el problema del bloqueo de suministro y el favoritismo. Para ilustrar el problema, crearé un ejemplo simple:
Si tiene una lista: [productor1, consumidor1, consumidor2, consumidor3] y actualiza en orden, comenzando en la oferta = 0, obtendrá esto:
El consumidor 1 obtiene toda la diversión, mientras que los consumidores 2 y 3 pasan hambre hasta que el consumidor 1 está satisfecho. Dependiendo de su juego, esto puede no ser deseable. Lo sé en mi juego, no lo es. Cuando llegue a eso, voy a crear una cola en la que los consumidores que han sido alimentados con una marca se moverán al final de la cola para la siguiente, lo que creo que es lo que Roy T. está haciendo. El ejemplo anterior se vería así:
De esta manera, todos obtendrán su parte justa de los recursos.
También planeo implementar una cola adicional que se utilizará como una cola de prioridad para que el usuario pueda seleccionar ciertas estructuras para tener prioridad de recursos. La cola prioritaria siempre se servirá antes que la cola estándar. Asegúrese de que todos los productores se actualicen primero, luego consuma todos los recursos en segundo lugar, de lo contrario, la cola se romperá cuando produzca recursos en medio de una marca y algunos consumidores ya hayan muerto de hambre.
Para resumir: actualice los productores, luego la cola de prioridad, moviendo los consumidores alimentados al final de la cola de prioridad, luego actualice la cola estándar, moviendo los consumidores alimentados al final de la cola estándar.
fuente
Bueno, ampliaré la idea de John, ya que discutimos esto un poco en el chat .
editar: esta solución solo es preferible si el consumibleAmount es relevante para la frecuencia con la que la fábrica debería obtener un lote de recursos. Si todo es lo mismo, entonces puedes usar una cola.
Mi solución: todas las fábricas que figuran en una cola prioritaria. La prioridad aumenta a medida que una fábrica sufre de hambre. Hambre, prioridad, establecida en cero cuando la fábrica ha consumido recursos. La máxima prioridad siempre será obtener el próximo lote de recursos.
Al determinar qué fábrica obtiene qué recursos, en algún tipo de pseudocódigo:
De esta manera, sus fábricas fabricarán 1 producto cada una por turno, si desea ajustar teniendo en cuenta el consumoAmount para que los productos más baratos se fabriquen con mayor frecuencia, podría aumentar la prioridad en 1 / consumeAmount, por ejemplo.
fuente
Extraña pregunta.
Lo que debe hacer depende de la lógica del juego que cree. Puedes hacer una cola, puedes saltarte. Depende de cómo creas que debería comportarse tu juego. Corrígeme, si me equivoco en tu pregunta.
fuente
Puede mantener una cantidad de la demanda total de recursos por marca para todas las construcciones. Si el almacenamiento de un recurso alcanza menos de esta cantidad requerida, entonces toda la construcción se detendría por completo hasta que el almacenamiento se haya reunido lo suficiente como para soportar al menos 1 tick de producción. Entonces la producción puede reanudarse.
Entonces, en lugar de almacenar la tasa de producción como flotante, es binaria, ya sea que su fábrica produce a toda velocidad o no.
Dicho esto, este enfoque es esencialmente el mismo que el de la respuesta de Jonathan, para los casos especiales de tasa de producción 0.0 y 1.0: una flotación arbitraria f con 0.0 <= f <= 1.0 es probablemente más elegante ya que no se obtienen movimientos bruscos de la cantidad de almacenamiento , pero la lógica debería ser un poco más simple.
fuente