Głównym zasobem w mojej grze jest masa , przechowywana jako liczba zmiennoprzecinkowa, która zmienia się w czasie. Węzły zasobów zwiększają masę, a fabryki ją wyczerpują. Na przykład, jeśli mam węzeł zasobów z wydajnością 5 mas na sekundę, zdobędę 5 * deltaT
masę z każdym krokiem gry. Masa jest wyświetlana w zaokrągleniu do najbliższej liczby całkowitej, a wskaźniki wzmocnienia / straty są wyświetlane w dziesiętnych częściach.
Jak mam radzić sobie z masą uderzającą w zero? Stwarza to warunki wyścigu, jeśli wiele fabryk próbuje budować naraz: fabryki w kolejce lub które zużywają mniej zasobów, mają pierwszeństwo, gdy pojawi się więcej zasobów, a więc budują się szybciej niż inne.
Jak sobie z tym poradzić? Czy powinienem całkowicie pominąć ten krok?
źródło
Odpowiedzi:
Zgadzam się z Petrem: nie ma na to ustalonego sposobu. To, jak chcesz to zrobić, zależy od tego, jak chcesz zaprojektować grę.
W tej sytuacji jednak myślę, że od razu oczywiste jest, jakiego rodzaju mechaniki próbujesz się nauczyć: po prostu chcesz, aby rzeczy wytwarzały się tak szybko, jak to możliwe, w ramach dostępnej masy.
Produkcja w ramach zdolności produkcyjnych
Mam zamiar wyciągnąć liść z książki Najwyższego Dowódcy, ponieważ tworzysz system bardzo podobny do ich: Jeśli produkujesz powyżej zdolności produkcyjnych, najlepszym sposobem na poradzenie sobie z tym jest spowolnienie produkcji na całym forum. Obniżenie mocy produkcyjnych jest w rzeczywistości dość proste.
Mechanik prędkości produkcji
Na każdym etapie aktualizacji fabryki nie wytwarzają tylko ustalonej ilości: działają z prędkością produkcji , która określa, ile postępów robią na każdym kroku i ile zużywają masy. Kiedy produkujesz przy 75% wydajności, twoje fabryki robią 75% więcej postępów na każdym kroku i zużywają 75% masy w porównaniu do 100% wydajności.
Aby obliczyć szybkość produkcji, zanim w ogóle coś zbudujesz, powinieneś zapytać fabryki, aby określić całkowite zasoby, które zostaną wykorzystane na tym etapie przy pełnej wydajności. Następnie wykonujesz proste obliczenia:
Powiedzmy, że potrzebujesz 125 masy na tym etapie, aby uzyskać pełną wydajność, ale tylko 100 masy na tym etapie. To równanie zapewnia prędkość produkcji 0,8 (dziesiętna reprezentacja 80%). Kiedy mówisz swoim fabrykom, aby faktycznie wykonały budowę , podajesz im tę wartość, aby powiedzieć im, z jaką prędkością budują: a teraz twoja produkcja jest spowolniona na całej planszy.
Alternatywy
Możesz także rozpocząć tymczasowe zamykanie fabryk, dopóki moce produkcyjne nie zwolnią się, i bardzo interesujące może być to, że dzieje się tak w fabrykach znajdujących się dalej od generatorów, gdy są one bardzo niskie.
Wiele zasobów?
Od ciebie zależy, jak sobie z tym poradzisz; istnieje wiele opcji. Najprostszym jest prawdopodobnie obliczenie zdolności produkcyjnej dla każdego zasobu, a następnie wybranie najniższego , tak aby Twój najsłabszy zasób stał się wąskim gardłem dla całej reszty.
źródło
Chociaż podoba mi się odpowiedź Jonathana Hobbsa, myślę, że system kolejek jest jeszcze prostszy:
Prawdopodobnie będzie to działać średnio w taki sam sposób, jak implementacja Jonathana. Jednak rozwiązanie Jonathana może powodować problemy, jeśli szybkość pracy jest ustawiona na bardzo niskim poziomie, a moja implementacja mogłaby mieć fabrykę z bardzo wysokim zapotrzebowaniem na zasoby dla tej ramki, gdyby blokowała inne fabryki dla kilku ramek.
źródło
Opracowuję podobny system zaopatrzenia we własnej grze, więc zastanawiałem się również, jak rozwiązać problem blokady dostaw i faworyzować. Aby zilustrować problem, stworzę prosty przykład:
Jeśli masz listę: [producent1, konsument1, konsument2, konsument3] i aktualizujesz w kolejności, zaczynając od dostawy = 0, otrzymasz:
konsument1 czerpie radość, podczas gdy konsumenci 2 i 3 głodują, dopóki konsument 1 nie będzie zadowolony. W zależności od gry może to nie być pożądane. Wiem, że w mojej grze tak nie jest. Kiedy do tego dojdę, utworzę kolejkę, w której konsumenci, którzy zostali nakarmieni jednym tikiem, przeniosą się na tył kolejki dla następnego tiku, co, jak sądzę, zmierza Roy T. Powyższy przykład wyglądałby tak:
W ten sposób wszyscy otrzymają sprawiedliwą część zasobów.
Planuję również zaimplementować dodatkową kolejkę, która będzie używana jako kolejka priorytetowa, aby użytkownik mógł wybrać określone struktury, które będą miały priorytet zasobów. Kolejka priorytetowa będzie zawsze obsługiwana przed kolejką standardową. Upewnij się, że wszyscy producenci są najpierw zaktualizowani, a następnie zużyj wszystkie zasoby na drugim miejscu, w przeciwnym razie kolejka się zepsuje, gdy będziesz produkować zasoby częściowo przez tyknięcie, a niektórzy konsumenci byli już głodni.
Podsumowując: zaktualizuj producentów, a następnie kolejkę priorytetową, przenosząc klientów karmionych na koniec kolejki priorytetowej, a następnie zaktualizuj standardową kolejkę, przenosząc klientów karmionych na koniec kolejki standardowej.
źródło
Cóż, rozwinę pomysł Johna, ponieważ rozmawialiśmy o tym trochę na czacie .
edytuj: To rozwiązanie jest właściwie preferowane tylko wtedy, gdy ilość materiałów eksploatacyjnych jest istotna dla tego, jak często fabryka powinna otrzymywać partię zasobów. Jeśli wszystko jest takie samo, możesz po prostu użyć kolejki.
Moje rozwiązanie: wszystkie fabryki wymienione w kolejce priorytetowej. Priorytet wzrasta, ponieważ fabryka cierpi z powodu głodu. Głód, priorytet, ustawiony na zero, gdy fabryka zużyje zasoby. Najwyższym priorytetem zawsze będzie zdobycie kolejnej partii zasobów.
Po określeniu, która fabryka otrzymuje jakie zasoby, w jakimś pseudo-kodzie:
W ten sposób fabryki będą wytwarzać po 1 produkt po kolei, jeśli chcesz dostosować, biorąc pod uwagę wartość ConsumeAmount, aby tańsze produkty były wytwarzane częściej, możesz na przykład zwiększyć priorytet o 1 / ConsumeAmount.
źródło
Dziwne pytanie.
Co trzeba zrobić, zależy od logiki gry Ci stworzyć. Możesz zrobić kolejkę, możesz pominąć. Zależy, jak twoim zdaniem powinna się zachowywać Twoja gra. Popraw mnie, jeśli pomylę się w twoim pytaniu.
źródło
Możesz zachować liczbę całkowitych zapotrzebowań na zasoby na tik dla wszystkich konstrukcji. Jeśli jeden magazyn zasobów osiągnie mniej niż wymaganą ilość, wówczas cała budowa zostanie całkowicie zatrzymana, dopóki magazyn nie zgromadzi wystarczającej ilości, aby utrzymać co najmniej 1 tik produkcji. Następnie można wznowić produkcję.
Zamiast zapisywać szybkość produkcji jako liczbę zmiennoprzecinkową, jest ona binarna - albo twoja fabryka produkuje z pełną prędkością, albo nie.
To powiedziawszy, to podejście jest zasadniczo takie samo jak odpowiedź Jonathana, dla specjalnych przypadków tempa produkcji 0,0 i 1,0 - dowolna liczba zmiennoprzecinkowa f o wartości 0,0 <= f <= 1,0 jest prawdopodobnie bardziej elegancka, ponieważ nie występują gwałtowne ruchy magazynowania , ale logika powinna być nieco prostsza.
źródło