Używam C # / XNA i kilkakrotnie powiedziano mi, aby nie mieszać kodu aktualizacji z rysowanym kodem - i jestem pewien, że nie! Ale czy ktoś mógłby opisać, czym dokładnie jest „kod logiczny”?
Jak widać tutaj: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx
[...] upewnij się, że umieściłeś całą logikę gry w metodzie aktualizacji (nie w Draw!), a wszystko będzie działało z niezłą stałą prędkością.
Pytam o to, ponieważ szybkość mojej gry zmienia się w stosunku do FPS. Wolne FPS to wolno poruszające się obiekty i odwrotnie. I tak, dołączam oczekiwany position += speed * (float)gt.ElapsedGameTime.TotalSeconds;
kod.
To jest prawdopodobnie duże pytanie dla początkujących, ale po prostu chcę mieć absolutną jasność co do definicji tego.
źródło
position = speed * ...TotalSeconds
. Zauważ, że to=
nie jest+=
. Gdyby było+=
tak, jak piszesz, twoja pozycja spadłaby z ekranu niemal natychmiast.gt.ElapsedGameTime.TotalSeconds
upłynęła liczba sekund, które upłynęły od uruchomienia programu (gry). Jeśli pomnożysz przez to prędkość, to po 5 sekundach gry prędkość będzie 5 razy większa (z wyjątkiem specjalnego przypadku, w którym prędkość jest ustawiona na 0). Nie jestem pewien, co jeszcze mogłoby to spowodować, że to nieprawda, ale jestem zaintrygowany.iii
że ręcznie zwiększam każdą aktualizację, ponieważ nie chcę tego w kilka sekund, chcę kroki lub ramki. Widzę jednak, że twój sposób jest prawidłowym sposobem kodowania miękkiego.Odpowiedzi:
Czy to zmienia stan twojego świata gry? To kod logiczny.
Czy pokazuje stan świata gry? To renderuje kod.
źródło
Twoja separacja jest prawidłowa, jeśli:
źródło
Draw()
mogą rysować różne obrazy w miarę upływu czasu. Na przykład ramki animowanych duszków mogą się zmieniać. Ponadto obiekty mogą nadal poruszać się wizualnie do przodu, jeśli kod renderujący używa wspólnej sztuczki i zwiększavelocity * time since last update / period of update
widoczną pozycję obiektów (podczas gdy ich rzeczywista pozycja pozostaje niezmieniona).iff
czyli jeśli i tylko jeśli?Update
co jeszcze nie jest zsynchronizowane? Brak danych wejściowych odtwarzacza, zdarzenia sieciowe nie są przetwarzane itp.? Gra powinna być wyparta z jednego zegara, ze stałymi „tyknięciami” dla logiki gry lub fizyki pochodzącej z tego zegara, a stan grafiki pochodnej również sterowany przez ten sam zegar.Draw()
w taki sposób, aby zawsze rysował ten sam obraz, gdy wywoływany kilka razy z rzędu. Należy to zrobić, jeśli to możliwe. Ale zdarzają się przypadki, gdy nie wiesz, z jaką częstotliwościąDraw()
będzie się nazywać. Na przykład, jeśli chcesz mieć pełne wsparcie (rzeczywiste 120 FPS) dla nowych monitorów 120Hz i włączysz vsync.What if I want to pause graphics?
Następnie podajesz 0 zamiast faktycznego czasu delta doDraw()
.0
. Możesz mieć zegary hierarchiczne, więc np. Interfejs użytkownika nadal działa i animuje, a interpolacja znaków również zatrzymuje się bardzo, bardzo łatwo.Chodzi tutaj o rozdzielenie rzeczy, które nie są modelem.
Logika gry to model, o którym mowa w
Są to wszystkie różne, powiązane wzorce architektury oprogramowania. Ale w każdym przypadku Model jest tym samym, jest prawdziwą logiką i rzeczywistym stanem.
Podczas tworzenia oprogramowania biznesowego nazywa się go czasem logiką biznesową i koduje niektóre zasady biznesowe. Na przykład, jeśli kodujesz coś dla banku, aby obliczyć rachunki z karty kredytowej, to funkcja powodująca, że ktoś nie musi płacić odsetek, jeśli spłaci dług w ciągu mniej niż 30 dni, jest częścią logiki biznesowej, żyje w Model. Nie działa na przykład na jednej z wyświetlanych warstw. Kod do drukowania rachunku nie służy na przykład do edycji tekstu na podstawie ich działań. W tym przykładzie być może podkreślono, dlaczego warto zorganizować swój kod w ten sposób.
Podobnie jest z logiką gry.
Wyobraź sobie, że w pewnym momencie twoja gra została przeniesiona na inną konsolę. Może pomóc wyobrazić sobie coś naprawdę innego niż twój obecny cel. Np. Jeśli celujesz w coś za pomocą gamepada / kontrolera, wyobraź sobie, że gra jest przeniesiona na tablet z ekranem dotykowym. Logika gry jest częścią kodu, która nie zmienia się po przeniesieniu.
Jeśli twoja gra była czymś w rodzaju strategii wojskowej, wyobraź sobie, że jest przekształcana w najbardziej złożoną grę planszową na świecie. Logika gry to sekcje kodu, które bezpośrednio odpowiadają wierszom w zbiorze reguł. (Nie wszystkie wiersze w zbiorze reguł, nie te dotyczące ruchomych elementów, ale niektóre.).
Logika gry nigdy się nie zmienia, bez względu na formę.
źródło