Nigdy wcześniej nie widziałem takiej funkcji, ale powinna ona zapewnić interesującą okazję do gry.
Więc tak, w środowisku dla wielu graczy / w czasie rzeczywistym (wyobraź sobie FPS), jak mogę wdrożyć efekt zwolnionego tempa / czasu pocisku?
Coś w rodzaju złudzeń dla gracza, który jest obecnie powolny. Więc wszyscy widzą go „w czasie rzeczywistym”, ale widzi, że wszystko zwolniło.
Aktualizacja
Uwaga: pamiętaj, że gra FPS musi być zrównoważona, aby była fajna. Tak więc, ta funkcja czasu pocisku musi być solidna, dając niewielką przewagę „graczowi”, nie odrywając się od innych graczy.
Dodatkowo istnieje możliwość, że dwóch graczy może aktywować swój czas naboju w tym samym czasie.
Ponadto:
Zamierzam to wdrożyć w przyszłości, bez względu na to, czego potrzeba. Pomysł polega na zbudowaniu nowego silnika gry. Jeśli to daje nowe możliwości, jestem bardziej niż zainteresowany słuchaniem pomysłów.
Tymczasem tutaj, wraz z moim zespołem, myślimy o tym, kiedy nasza teoria zostanie stworzona, podzielę się nią tutaj.
Czy to w ogóle możliwe? Odpowiedzi na pytanie „czy to w ogóle możliwe”, teraz nadszedł czas, aby znaleźć najlepsze rozwiązanie.
Trzymam „odpowiedź”, dopóki nie pojawi się coś wyjątkowo dobrego, jak prototypowa teoria z czymś zbliżonym do działającego pseudo kodu.
Co mówią fizycy i filozofowie:
Linki są dla Ciebie interesujące, ponieważ tematy są zamknięte.
Warunki, o których pomyślałem pisząc pytanie na stronie fizyki (skopiowane):
- Gracz pod wpływem zwolnionego tempa ma przewagę, aby wykonywać bardziej precyzyjne działania (strzelanie, ruch itp.), Ponieważ widzi wszystko w znacznie wolniejszym tempie.
- Jego działania powinny wpływać na innych graczy w czasie rzeczywistym.
- Gracze, którzy patrzą na naszego dotkniętego gracza, nie widzą żadnej różnicy, z wyjątkiem tego, że mogą doświadczyć działań, które wykonał (np. Gracz zostaje postrzelony / dotknięty unika rakiety).
- Kiedy gracz wyjdzie z tego efektu, po prostu kontynuuje to samo tempo, jak zwykle. (Jeśli nie jest to możliwe, myślę, że będzie musiał cierpieć, dopóki czas nie zostanie zsynchronizowany)
Referencje dotyczące czasu pocisku (zwolnione tempo):
Niestety większość wdrożeń dotyczy tylko jednego gracza
http://www.gamesradar.com/a-videogame-history-of-bullet-time/
źródło
Odpowiedzi:
To zostało zrobione wcześniej. :) Sprawdź specjalistów , mod półtrwania, który ma dwa różne ulepszenia czasu pocisku.
EDYTUJ, aby dołączyć informacje zzzzbov poniżej
Sposób, w jaki czas pocisku działał w „Specjalistach” z perspektywy rozgrywki, polegał na tym, że gracz mógł uzyskać ulepszenia, które dawałyby ograniczone ilości „czasu pocisku”. Gdy zostanie użyty, bańka wokół gracza spowolni fizykę.
Gracze daleko będą poruszać się z normalną prędkością, ale wszystko w bańce (kule, gracze, eksplozje) spowolni. Gracz, który użył ulepszenia, poruszałby się nieco szybciej, pozwalając mu uciec lub użyć wyczynów, aby unikać pocisków.
Ktokolwiek inny złapany w bańkę czasu „pocisku” nadal ma tę zaletę, że może zobaczyć, co się wydarzy, ale względna różnica prędkości między złapanym graczem a pociskami pozostaje taka sama, więc zdolność do reagowania praktycznie nie istnieje.
źródło
Nie mogę wymyślić żadnej gry, która miałaby czas na pocisk w trybie dla jednego gracza, która z powodzeniem przekształciła ją w tryb wieloosobowy w jakikolwiek znaczący sposób. Może być kilka z nich, którzy rozwiązali go, przyspieszając korzystanie z niego przez gracza, ale ten rodzaj pokonuje sens.
Czas na pocisk istnieje, ponieważ chcesz sprawić, że gracz poczuje się jak badass. Dajesz graczowi pozornie niesprawiedliwą przewagę, symulując postrzeganie wyższego poziomu. Efektem końcowym jest to, że gracze mogą celować, robiąc fajne rzeczy, takie jak wyskakiwanie z osłony i tak dalej. Jeśli tylko przyspieszyłeś gracza, gdy ma on włączony czas pocisku, dajesz mu mniej czasu na reakcję, co jest przeciwieństwem tego, czego chcesz.
W synchronicznym środowisku wieloosobowym tak naprawdę nie ma żadnego rozwiązania dla aktywowanego przez użytkownika „czasu zwalnia”, który symulowałby wrażenie wynikające z używania go w środowisku dla jednego gracza. Gdyby sam czas został spowolniony, wtedy postrzeganie wszystkich wzrosło. Zwłaszcza w grze na PC, w której celowanie myszą jest generalnie natychmiastowe, wszyscy zyskaliby na wolniej poruszających się celach.
Teraz, jeśli byłeś na tym martwy, sugeruję, aby zamiast uczynić go funkcją aktywowaną przez gracza, uczynić z niej coś w rodzaju „stanu” spotkania. Pomyśl jak w filmie Johna Woo, w którym to jest dobry facet kontra zły facet, a wszystko wydaje się zwalniać, gdy strzelają do siebie. Kiedy więc rozpocznie się „spotkanie”, włącz zwolnione tempo i możesz uzyskać ciekawe efekty. Faceci skaczą i rykoszetują po nie trafionych pociskach unoszących się w powietrzu i tak dalej. Oczywiście, to naprawdę działałoby tylko w przypadku gry 1 na 1. Nie dostaniesz jednostronnej korzyści z czasu pocisku, jak w grze dla jednego gracza, ale może to być interesujące doświadczenie.
źródło
Ogólne myśli
Jest to problem najlepiej opisany za pomocą ogólnej teorii względności - weźmy na przykład fakt, że możesz zobaczyć efekty czasu pocisku, po prostu patrząc przez teleskop na satelitę (przyczyna niesławnego neutrina podróżującego szybciej niż problem świetlny) - równania które można rozwiązać, istnieją w tych warunkach; co oznacza, że jest to całkowicie możliwe.
Twoja gra będzie musiała obsługiwać osobne ramy odniesienia - o ile wiem, byłby to efekt netto („gracz” to osoba z aktywnym czasem pocisku):
Na szczęście dla ciebie oznacza to, że gracz w czasie pocisku ma przewagę nad wszystkimi innymi; nie mogą do niego celować - jednak nie byłoby to przekonujące, ponieważ przeciętny człowiek nie spodziewałby się zauważalnej różnicy podczas obserwacji dylatacji czasu.
Zdecydowanie polecam opublikować to na temat fizyki (wskazać, że jest to gra, ale potrzebujesz prawdziwej wiedzy teoretycznej) i zapytać o pomysły, w jaki sposób przybliżasz efekt w symulacji równoległej.
Jednym z możliwych rozwiązań, na które chciałbym spojrzeć, jest to, że świat dogania gracza (ponieważ przeniósł się w przyszłość), dzięki czemu wszyscy doświadczają progresywnej ilości (znacznie mniej niż rzeczywisty czas pocisku) czasu pocisku w zależności od daleko w tyle ( czas) są. W ten sposób możesz przybliżać różnice czasowe bez konieczności zajmowania się przechowywaniem stanu z przeszłości itp. Potrzebowałbyś jakiegoś sposobu, aby wyjaśnić ten efekt, „odbicie czasu” lub coś takiego, ponieważ nie jest to fizycznie poprawne.
Innym pomysłem jest nadużywanie najbardziej podstawowych równań fizyki (
s = d/t
), gdy gracz przechodzi w czas pocisku, wszystko staje się mniejsze - jeśli zmniejszysz wszystko o połowę z jego perspektywy, ale utrzymasz jego prędkość na tym samym poziomie, zgodnie z jego oryginalnym układem odniesienia, (skutecznie dwa razy) równanie nadal się równoważy. Sekwencje napędów warp w filmach kosmicznych wykorzystują tę dylatację kosmiczną do przedstawienia efektu - ludzie są więc przyzwyczajeni do oglądania.Rzeczywiste rozwiązanie
Zastanowiłem się nad tym. Jeśli spojrzysz na to, jak działa system sieciowy Steamworks ( czy ktoś ma link? ), Serwer jest ciągle do przodu o określony czas; i każdy klient wie o „kolejnej” ramce, do której musi interpolować.
Powiedzmy na przykład, że serwer wyprzedza wszystkich graczy o 20 ms. Kiedy gracz wkracza w czas pocisku, zmień jego interwał aktualizacji na 40 ms (jego symulacja będzie przebiegać co 40 ms, a serwer będzie kolejkować swoje działania 40 ms w przyszłość) - co zasadniczo przesunie się w przyszłość w odniesieniu do innych graczy: dodatkowo sprawiając, że poruszał się szybciej od ich odniesienia i sprawiał, że poruszali się wolniej od niego. Kiedy opuści czas na pocisk, daj wszystkim innym przewagę 5ms nad nim, aby mogli zagrać w „nadrabianie zaległości” (to twoi
time rebound
przypadkowo sprytni gracze będą pociskać czas w tych okresach nadrabiania zaległości). Może wyglądać trochę lepiej, jeśli przypiszesz parabolę do jego kroku czasowego - spowoduje to spowolnienie, zatrzymanie, a następnie stopniowe przyspieszenie.Oświadczenie: Nie jestem fizykiem, ale mam praktyczną wiedzę na temat teorii względności.
źródło
Chciałem dodać 0,02 USD, ponieważ wdrożyłem prototypowy tryb czasu pocisku, który działał w grach wieloosobowych dla Heroes Over Europe .
W trybie dla jednego gracza naciśnięcie przycisku w odpowiednim momencie spowolniłoby czas i powiększyło zamierzony cel. Nie chciałem spowalniać globalnie czasu w trybie dla wielu graczy, aby powielić tę funkcję (ponieważ gra miała obsługiwać 16 jednoczesnych graczy!), Więc użyłem metody „bąbelkowej”.
W szczególności, gdy uruchomiono tryb czasu pocisku, wokół docelowego samolotu została utworzona kula. Szybkość upływu czasu zmieniała się w zależności od odległości od środka kuli; czas obniżył się liniowo od jego powierzchni do wartości minimalnej gdzieś w pobliżu środka. Szybkość zmieniła się również w zależności od tego, jak długo istniała sfera i jak długo kula pozostała, zanim „wyparowała”.
Zostało to zsynchronizowane między komputerami poprzez wysłanie pakietu, który określa przyszły czas uruchomienia bąbelka; pozwoliło to zachować synchronizację efektu pomimo opóźnień. (Podobnie, gdy efekt miał się wcześnie skończyć, pakiet ogłosi przyszły czas, w którym miał się zakończyć.)
Szybkość upływu czasu była zawsze definiowana funkcjonalnie: biorąc pod uwagę definicję kuli, aktualny czas i pozycję, można było określić, jak szybko płynie czas.
Aby efekt zadziałał, kilka systemów gier musiało zostać dostosowanych do tej „funkcjonalnej” definicji czasu. Samoloty, pociski, pociski i inne efekty wykorzystywały osobę,
dt
która została opracowana przez wywołanie odpowiedniej funkcji. Większość pracy związanej z uruchomieniem prototypu została tutaj wydana.Wynik zadziałał całkiem nieźle: gracz celowany w czas pocisku zauważalnie zwolniłby i miałby (małą) szansę na wymknięcie się z celownika agresora z dala od gradu pocisków w zwolnionym tempie. Pobliscy gracze widzieli, jak samoloty i pociski omijają się nawzajem w zwolnionym tempie, ale poza tym pozostały nienaruszone.
Zwróć uwagę, że gracz wyzwalający został również spowolniony, ale nie był w tym szczególnie niekorzystny: mieli powiększony widok celu i mogli wpływać na zabójstwa jednym strzałem na swoją ofiarę. Inny gracz może próbować cię zabić (lub zabić kradzież!) W tym stanie, ale ich samolot (i kule) zostałyby naruszone po wejściu do bańki, dając ci czas na ucieczkę.
Niestety, chociaż działało, nigdy nie mieliśmy czasu na ukończenie i dopracowanie tej funkcji do gry wieloosobowej, więc została ona usunięta. (Jeden gracz nadal zachował tę funkcję, jako „Ace Kill”.)
źródło
Nie tak naprawdę czas na pociski, ale może być świetną zabawą:
Co z czymś podobnym do sposobu, w jaki Braid spowalnia czas? Tj. Im bliżej osoby doświadczającej czasu pocisku, tym wolniej się dzieje ... a jeśli jesteś poza strefą wpływów, czas płynie normalnie.
... na przykład, jeśli gracz A ma czas na pocisk, to otacza go stopniowana kula „wolnego czasu”, aby mógł odpowiednio celować, ale niekoniecznie poruszać się szybciej - wtedy gracz B strzelający do niego musiałby przesadzić, gdzie trafi kula, ponieważ zwolni, im bardziej się do niego zbliży.
Chociaż im więcej o tym myślę, tym mniej myślę, że to zadziała, ponieważ może po prostu sprawić, że Gracz A będzie łatwym celem (ponieważ jego głowa zwolni?) - ale i tak byłoby interesujące zobaczyć to w 3D.
źródło
Wiem, że to stare pytanie, ale z trudem nie wspomniałem o problemie z większością odpowiedzi dotyczących względności
Zaimplementowane z efektami opisanymi w pytaniu czas pocisku w grze wieloosobowej nie jest możliwy.
Powodem jest to, jak działa względność; niektórzy z was o tym wspominali i oczywiście rozumieją teorię względności, ale problem polega na tym, że wasze modele są niepoprawnie skonfigurowane.
Wiele osób użyło w swoich odpowiedziach „Referencji Gracza A kontra Gracza B”, ale niestety żadna z tych rzeczy tak naprawdę nie istnieje. Tak, masz graczy, może nawet wielu z nich, i tak, mogą kontrolować swój świat i wchodzić w interakcje z nim oraz mieć własną perspektywę gry, ale perspektywa nie jest punktem odniesienia w czasie: jest to po prostu przestrzeń XYZ rzutowana na XY samolot.
Jest tylko jeden punkt odniesienia czasu i jest nim serwer (lub host). Jest tylko jeden pogląd na fizyczny stan świata, a zatem tylko jeden punkt odniesienia. Gracze widzą na ekranie różne widoki graficzne tej samej symulacji fizycznej.
Aby jeden gracz mógł zobaczyć przebieg symulacji przy jednej prędkości, a drugi zobaczyć tę samą symulację przy innej prędkości i nie mieć desynchronizacji, po prostu nie jest to możliwe. Gdzieś coś musi dać.
Wszelkie próby przeprowadzenia wielu symulacji lub uruchomienia serwera przed klientami po prostu nie mają sensu. Efekt opisany w poście po prostu nie może zostać osiągnięty bez wymuszenia pojedynczego punktu odniesienia lub pozostawienia myśli zsynchronizowanych i poinformowania graczy, że ich działania naprawdę nie miały miejsca po tym fakcie.
Myślę, że najlepsze rozwiązanie jest podobne do tego, które już podano, które ma mieć efekt przypominający warkocz, w którym prędkość zmienia się w bańce wokół gracza. To powiedziawszy, gracz nie zwalniał, a bąbelek zawsze był ustawiany i przesuwany z nim na środku. To sprawia, że gracz porusza się z pełną prędkością, podczas gdy najbliżsi czują się spowolnieni. Dostaje przewagę mocy, a ludzie daleko od tego obszaru nie odczuwają efektu. Ci, którzy są w pobliżu, są spowolnieni, ale byłoby oczywiste, że ktoś używa mocy (sugerowałbym wyróżnienie gracza, który z niej korzysta, aby gracze przeciwni mogli w pełni zrozumieć, co się dzieje i dlaczego).
źródło
To byłoby bardzo niezręczne. Nawet nie patrząc na problem dylatacji czasu, wyobraź sobie, że jesteś graczem, który spędził 4 sekundy w czasie pocisku, podczas gdy wszyscy inni w grze spędzili 2 sekundy w czasie rzeczywistym. Ponieważ ten sam czas minął w rzeczywistości dla wszystkich, będziesz musiał w jakiś sposób „odzyskać” te dwie sekundy w grze. W pewnym momencie musisz „przeskoczyć” 2 sekundy czasu gry lub poświęcić trochę czasu na bieganie szybciej niż normalnie, albo coś innego, co prawdopodobnie spowodowałoby stratę czasu na kuli.
Co więcej, chodzi o to, aby wysłać to, co robisz, w 2 sekundy swojego czasu z powrotem w czasie 1 sekundy do wszystkich innych.
źródło
Rzucaj graczowi mini-podobne wydarzenia w czasie, aby unikać pocisków lub automatycznie śledzić wrogie cele, jednocześnie sprawiając, że ruchy gracza wyglądają rozmazane lub „rozłożone” na innych graczy (aby nie zadrapali głowy, dlaczego ich pociski nie są uderzanie). To wydaje się być najprostszym, najbardziej praktycznym tłumaczeniem, jakie możesz zrobić dla wielu graczy.
Każde inne rozwiązanie wymaga zmiany jednego fizycznego elementu gry dla jednego lub większej liczby graczy, który nie stosuje się równolegle do innych, wyobrażam sobie.
źródło
Po prostu spowolnij wszystkich pozostałych, wykonując pocisk przez gracza. Możesz to zrobić, zmniejszając wrażliwość myszy.
źródło
Załóżmy, że mamy gracza A w czasie pocisku i gracza B w czasie rzeczywistym. I robią następujące z punktu widzenia gracza B:
Teraz z punktu widzenia gracza A zajmie to dwa razy dłużej - ponieważ świat porusza się dla niego wolniej:
Wreszcie serwer zawiera następujące zdarzenia:
Mamy więc dwa początkowe problemy. Po pierwsze, A ma teraz 3 sekundy czasu gry za wszystkimi innymi. To może być interesująca mechanika gry, jeśli masz pomysł, który oznacza, że musiał spłacić ten dług. Wyobraź sobie strzelankę opartą na osłonie, w której możesz aktywować czas pocisku, aby przebić się przez otwartą przestrzeń, ale gdy znajdziesz się bezpiecznie pod osłoną, musisz stać w miejscu, dopóki reszta świata nie dogoni cię (trzy sekundy, które przegapiłeś, są odtwarzane )
Drugi problem jest znacznie większy. Serwer musi reorganizować wydarzenia chronologicznie dla każdego gracza i ustalić wynik. Najpierw B strzela do A - dzieje się to trzy sekundy po grze, a A widzi to po 6 sekundach - jak dotąd żaden problem. Po 4 sekundach gracz A strzela do linii B. Na osi czasu B miało to miejsce dwie sekundy temu. Co więc robimy z dwiema sekundami rozgrywki, które już minęły, w tym jego strzałem w A?
Możemy to unieważnić - po prostu powiedzieć „Wiem, że gracz B myśli że zastrzelił tego faceta, ale okazuje się, że już nie żył, więc udawajmy, że nigdy się nie zdarzyło” To byłoby gówniane doświadczenie, bardzo podobne do opóźnienia, ale rozwiązałoby problem .
Moglibyśmy dokonać ewangelii obu osi czasu - wykorzystać punkt widzenia serwerów jako całą prawdę i martwić się osią czasu każdej osoby niezależnie. Po 3 sekundach B strzela w A i zabija go. Po 4 sekundach A strzela w B i zabija go. Obaj gracze umierają z powodu strzałów, których nie widzieli. Nie brzmi to dobrze, ale może jest to dobry sposób, po tym jak wszystkim graczom pokonasz krótki kurs w szalonym świecie względności.
Możemy mieć system pseudo-czasu rzeczywistego - gra turowa, w której najpierw planujesz swoje ruchy, a następnie uruchamiasz jednoczesne obliczanie zdarzeń. Dobre rozwiązanie, które rozwiązuje wszystkie problemy oprócz tego, że nie jest typem gry, którą chcesz napisać.
Krótko mówiąc nie sądzę, że to dobry sposób, aby wdrożyć bullet time traktując go w klasycznym sensie efekt jest na osobę używając go - oni poruszać się szybciej, oni widzą świat jako wolniejsze, wszyscy wykonuje normalnie. Jeśli odwrócimy to i wszyscy inni zostaną wpuszczeni w punkt widzenia licznika czasu i zobaczą siebie jako poruszających się wolniej, a ich sterowanie staje się powolne, to wszystko dzieje się synchronicznie i nie ma żadnych problemów. Ale czy to naprawdę pocisk? Choć może to wyglądać na zewnętrznego obserwatora (i powtórki meczu), żaden z uczestników nie uzyskałby oczekiwanego efektu.
źródło
Nie, nie jest to możliwe. Wyobraź sobie, że jeden gracz obraca się w zwolnionym tempie, co zobaczyliby inni gracze? Chcesz, żeby zobaczyli, że gracz czasu pocisku porusza się normalnie, ale ma odruch błyskawiczny, prawda? Ale niestety wszyscy grający w tę grę będą grać w tym samym czasie rzeczywistym. Dlatego jedynym sposobem na zrobienie tego byłoby spowolnienie całej gry, pozbycie się wszelkich korzyści, jakie ona przynosi, tak jak wszyscy byliby w kuli. Również denerwujące byłoby spowolnienie gry przez cały czas, gdy ktoś naciskał ten przycisk.
Istnieją różne rozwiązania, w wyniku których gracze mieliby podobną przewagę (jeden jest w stanie poruszać się szybciej itp.), Na przykład spowalniając wszystkich ELSE i pozwalając ci normalnie się poruszać (wtedy w powtórce możesz przyspieszyć ich do normalnego i reagować szybko), ale nie sądzę, że tak naprawdę chcesz.
źródło
FEAR miał czas na pociski w trybie dla wielu graczy, ale dotyczyło ono całej drużyny i spowolniło wszystkich w drugiej drużynie.
Kula czasu w trybie wieloosobowym w czasie rzeczywistym bez spowalniania innych spowodowałaby zsynchronizowanie klientów, gracz w zwolnionym tempie reagowałby na wydarzenia, które inni grali dawno temu, podczas gdy reagowali na bieżące wydarzenia.
źródło
Być może powinieneś rozmieścić sprzęt niezbędny do strzelania do gracza na PC, który wyzwalał pocisk w kosmos z prędkością bliską prędkości światła.
Rozwiązałoby to wszystkie problemy, ale może generować wyższe ping / opóźnienie.
źródło
cóż, nie byłoby problemu, gdyby wszystkie poruszały się wolniej niż zwykle, ale nie za wolno, a ten, kto je aktywuje, będzie poruszał się szybciej, jak zanurzenie całej gry pod wodą lub przeniesienie jej do przestrzeni wyprzedzającej, gdy ta aktywująca porusza się tak spokojnie jak zawsze
źródło