Spraw, by szybkie rzeczy wyglądały powoli (Box2D)

9

Pracuję nad grą, w której kontrolujesz trebusz, aby rzucać piłki przeciwnikowi.

To jak gra o nazwie „Medieval Siege”. Kiedy trebusz macha ręką, gracz musi wykorzystać najlepszy moment, aby nacisnąć przycisk i puścić piłkę. Następnie piłka będzie latać pod kątem stycznym. wprowadź opis zdjęcia tutaj Mój problem polega obecnie na tym, że ramię trebusza kołysze się zbyt szybko, aby gracz mógł wykorzystać odpowiedni moment. Tymczasem musi być tak szybko, w przeciwnym razie nie może rzucić wystarczająco daleko. I jest mały sznurek łączący piłkę z ramieniem trebuszowym, jeśli ramię huśta się zbyt wolno, piłka po prostu zwisa na sznurku, gdy ramię się porusza.

Rozwiązuję problem, zmieniając rozmiar kroku, za każdym razem, gdy ramię się kołysze, zmieniam rozmiar kroku z 1/60 na 1/200. A kiedy gracz wypuści piłkę, wraca do 1/60.

Działa to całkiem dobrze, z wyjątkiem mojej gry dla wielu graczy z obsługą sieci. Tak więc zmiana kroku może powodować problemy.

Innym rozwiązaniem, które mogę wymyślić, jest umożliwienie powolnego huśtania się, ale kiedy gracz wypuszcza piłkę, ręcznie zwiększam prędkość piłki, jednocześnie utrzymując jej kierunek. Naprawdę nie podoba mi się to rozwiązanie, ponieważ wygląda na fałszywe i nadal mam problem z tym, że piłka wisi na sznurku, chyba że zrobię sznurek bardzo bardzo krótki.

Proszę rzucić nieco światła na to, dzięki!


EDYTOWAĆ

Dzięki za wkład wszystkich, rozwiązuję problem, powodując powolne ruchy ramienia, a kiedy gracz wypuszcza piłkę, chwytam prędkość piłki i dwa razy. Wygląda dokładnie tak samo jak zmiana rozmiaru kroku. Jest jeszcze jedna rzecz, którą muszę zrobić. Ponieważ ramię kołysze się naprawdę wolno, piłka po prostu zwisa na końcu ramienia zamiast się kołysać. Rozwiązałem to poprzez zastosowanie siły równej sile grawitacji działającej na piłkę podczas i tylko podczas wahania. Potem już się nie zwisa, ale huśta się razem z ramieniem.

Odpowiedź @MrCranky jest szczegółowa i wygląda na wykonalną, więc bym ją zaakceptował. :)

Arch1tect
źródło
Może mógłbyś powoli przesuwać trebusz, ale pomnożyć siły działające na piłkę? Nie pracowałem wcześniej z Box2D, więc przepraszam, jeśli to głupi pomysł. Poza tym, jedyne, co sądzę, to błąkać się z masą piłki, aby sprawdzić, czy cięższe lub lżejsze mogłyby dać zadowalające wyniki przy mniejszych prędkościach. Warto też przyjrzeć się fizyce prawdziwych trebuszy. Wyglądają nieco powolnie, więc może dane o nich (rozmiar, amunicja, siły itp.) Mogą dać ci pomysły na symulację.
Chrześcijan
2
Sprawienie, by fizyka komputerowa zachowywała się jak „prawdziwa rzecz”, jest naprawdę trudne. Prawie wszystkie silniki fizyki symulują sztywne ciała, co oznacza, że ​​skutki takie jak zginanie ramienia treboucheta nie są uwzględniane, ani fizyka liny ani zachowanie materiału w żaden sposób dokładne, więc dokładna symulacja bez „oszukiwania” jest prawie niemożliwa. Proces zbliżania się do czegoś, co wygląda na prawdziwe, przebiega mniej więcej w następujący sposób: poprawianie, poprawianie, poprawianie, oszukiwanie, poprawianie, poprawianie, oszukiwanie, oszukiwanie, poprawianie, rozpoczynanie od nowa, poprawianie, poprawianie, poprawianie, poprawianie, oszukiwanie, poprawianie, oszukiwanie , oszukiwać, poprawiać.
LearnCocos2D,
4
Działo kotka stosuje najbardziej realistyczne podejście do tego problemu: ludzie naprawdę tak źli w manipulowaniu rzeczywistością fizyczną i potrzebują pomocy maszyny, jeśli chcesz dać „poczucie” trebusza, który porusza się wystarczająco wolno, aby człowiek mógł kontrolować ręcznie, ale uruchamia się szybciej niż jest to fizycznie możliwe, możesz chcieć stworzyć czysto artystyczną animację „strzelania”, a następnie spawnować piłkę na podstawie tego, gdzie użytkownik przerywa animację.
MickLH,

Odpowiedzi:

3

Instynktownie powiedziałbym, że brakuje nam znacznej części kontekstu potrzebnego do udzielenia odpowiedzi, a więc „dlaczego aspekt gry wieloosobowej uniemożliwia zmianę czasu?”

Jeśli próbujesz udostępnić symulację fizyki przez połączenie sieciowe, to zazwyczaj jest to bardzo trudne. Symulacje rozchodzą się bardzo łatwo, a szczególnie w przypadku połączeń sieciowych, które mogą utracić pakiety, bardzo trudno jest trzymać je razem.

Najprostszą i najsolidniejszą odpowiedzią na twoje pytanie jest użycie zmiennej zmiennej czasowej. Kiedy zbliżasz się do momentu podjęcia decyzji, zamiast aktualizować symulację fizyki o jedną sekundę na każdą sekundę realnego świata, zaktualizuj ją o pół sekundy lub inną odpowiednią liczbę. Ponieważ jest to efekt integracji, prawdopodobnie będziesz w stanie uciec, po prostu zmniejszając szybkość aktualizacji do niższej w oknie decyzji, ale możesz także szybko interpolować w dół do niższej. Tak czy inaczej, odtwarzasz symulację fizyki w zwolnionym tempie. Powinien zachowywać się idealnie dokładnie, tyle wolno, aby gracz mógł podjąć decyzję. Nie zastanawiałbym się nad żadnym innym sposobem na przekręcenie fizyki, aby działała, najprawdopodobniej wszystko okropnie się sprawdzi i nie poczuje się „dobrze”.

Wracamy więc do implementacji sieci. Bez dalszych informacji sądzę, że masz dwie możliwości. Po pierwsze, jeśli działasz w śluzy z drugą stroną w sieci. Kiedy więc jeden gracz musi zwolnić, aby podjąć decyzję, spowolnij obu graczy jednakowo. Prawdopodobnie będzie to denerwujące i dziwne dla gracza, który nie strzela, ponieważ będzie to mylić ich własne czasy reakcji.

Po drugie, wyobraź sobie, że strzelają do siebie dwie trebusze. Rzucanie trebusza trwa 10 sekund, a okno strzelania rozpoczyna się w T + 5s. P1 rozpoczyna cykl strzelania w T + 0s, a w T + 5s spowalnia lokalną symulację fizyki o 50%. Gra zajmie im 15 sekund przez cały cykl. Tak więc w T + 5s P1 mówi P2, aby zaczął odtwarzać cykl uruchamiania 10s z pełną prędkością. Więc P1 widzi, że cykl trebuchet zajmuje 15 sekund, P2 widzi, że zajmuje to 10 sekund, ale obaj gracze widzą, że cykl kończy się w T + 15 sekund. Kiedy P1 faktycznie wypuszcza, mówią P2, kiedy w cyklu hipotetycznym wypuszczają. Więc jeśli P1 zostanie wydany w T + 10s, to tak naprawdę to 7,5 s w cyklu uruchamiania 10s. P2 może następnie pokazać uwolnienie w T + 12,5 s (7,5 s do lokalnego odtwarzania cyklu), a symulacje obu graczy powinny wystrzelić pocisk w tym samym fizycznym punkcie cyklu.

Tak więc w tym drugim podejściu nie symulujesz już od razu. Prowadzisz dwie niezależne symulacje, ale zamiast tego śledzisz dane wejściowe odtwarzacza. Jeśli obojgu powie się, że gracz wypuścił 7,5 s w cyklu uruchamiania, obaj powinni ustalić, gdzie wyląduje pocisk. W praktyce może się to jednak bardzo szybko różnić i konieczna będzie synchronizacja stanów symulacji.

MrCranky
źródło
0

Dlaczego nie skopiować / dostosować tego, co już istnieje i działa w podobnych przypadkach?

wprowadź opis zdjęcia tutaj

Korchkidu
źródło
0

Jeśli trebusz porusza się zbyt szybko, oczywistym rozwiązaniem byłoby skalowanie czasu w celu spowolnienia. Oznacza to, że na każdą sekundę czasu rzeczywistego wykonuj tylko 0,1 sekundy w symulacji fizycznej. Teraz, z punktu widzenia gracza, piłka będzie się poruszać 10 razy wolniej.

W rzeczywistości istnieje inny sposób na osiągnięcie tego samego efektu: zamiast skalować czas, wystarczy skalować wszystkie stałe fizyczne, które są w jednostkach, w tym czas. Na przykład przyspieszenie grawitacyjne ma jednostki prędkości / czasu = odległość / czas², więc jeśli grawitacja jest jedyną stałą w grze, zmniejszenie jej o współczynnik 100 = 10² daje taki sam efekt jak spowolnienie czasu o współczynnik 10 .

Oczywiście, jeśli twój model fizyki zawiera inne stałe z jednostkami czasu (lub prędkość = odległość / czas lub przyspieszenie = odległość / czas² itd.), Będziesz musiał skalować je również, jeśli chcesz zachować te same trajektorie .

Zauważ, że istnieje granica tego, jak daleko możesz praktycznie z tym pójść: jeśli spowolnisz czas, powiedzmy 100 razy, twój trebusz będzie naprawdę łatwy do kontrolowania, ale twoi gracze również mogą się nudzić czekając na kulki, które powoli odpływają po ich wystrzeleniu. Jeśli to jest problem, być może będziesz musiał skorzystać z bardziej zaawansowanych sztuczek, takich jak te sugerowane w innych odpowiedziach, takich jak stosowanie naprawdę powolnego skalowania czasu podczas strzelania trebusza, ale przejście do szybszej skali czasu po wypuszczeniu piłki.

Ilmari Karonen
źródło
dzięki, ale prawdopodobnie nie widziałeś mojej edycji. Tak, rozwiązałem go ostatnią metodą z twojej odpowiedzi
Arch1tect,