Jak mogę usunąć nadmiar gruzu utworzonego przez gracza?

92

W mojej najnowszej grze, którą tworzę, możesz dowolnie pokroić obiekt 2D, co pokazano na tym gifie:

wprowadź opis zdjęcia tutaj

Możesz w sposób ciągły pokroić na setki lub tysiące kawałków. Nie powoduje to dużego opóźnienia, ponieważ są one zawsze w stanie spania, ale występuje problem, gdy je poruszasz.

Nie jestem do końca pewien, jak sobie z tym poradzić, więc nie ma tak wielu gruzów po rozcinaniu czegoś. Naprawdę nie chcę ich usuwać po pewnym czasie; Nie podoba mi się to, że jeśli wrócisz do czegoś, co pokroiłeś po pewnym czasie, losowo zniknęło.

Jak mogę usunąć nadmiar gruzu utworzonego przez gracza?

Ducktor
źródło
17
Z twojego pytania nie jest tak naprawdę jasne, czego tak naprawdę chcesz. Mówisz, że chcesz „oczyścić gruz”, ale jednocześnie mówisz, że nie chcesz, aby gruz zniknął po pewnym czasie.
Philipp
10
Tiny & Big zniszczyłby mniejsze elementy. Jestem pewien, że większe kawałki pozostały na poziomie, ale nie do końca to pamiętam. Oto przykład: youtu.be/236ly0ApPqg?t=177
TyCobb
2
Rzeczy, które są poza zasięgiem, można usunąć i wymienić, gdy do nich wrócisz.
Loren Pechtel
3
Tylko moja mała opinia, ale ustaw minimalny rozmiar obiektu, który ma być wykonany przez akcję cięcia. Jeśli trudno jest wyróżnić cięty element, nie możesz go wyciąć. (Poza tym fajna dynamika gry, ta zdecydowanie ma nogi!)
AJFaraday
12
Chciałbym powiedzieć, że nie biorę uznania za tworzenie mechaniki cięcia, ponieważ jest to darmowy zasób, który znalazłem na github . Korzystałem z przykładu, który daje pomysł, jak używać go do wycinania obiektów. (gracz został przeze mnie zakodowany, podobnie
zresztą jak

Odpowiedzi:

71

Po pierwsze, ta mechanika gry wygląda na świetną zabawę, więc gratuluję tego! Oto dwa proste rozwiązania, które można zastosować niezależnie lub razem, aby rozwiązać ten konkretny problem:

Usuń bardzo małe kawałki

Nie ma większego sensu trzymanie się niewielkich kolizji, które tak naprawdę nie utrudniają gracza ani nie mają żadnego realnego wpływu na środowisko. Obliczanie dodatkowej logiki kolizji po prostu nie jest tego warte, więc usuń te elementy lub usuń na nich kolizję.

Ogranicz liczbę cięć gracza

Posiadanie nieograniczonej liczby cięć może potencjalnie uczynić wiele twoich zagadek naprawdę prostymi, jeśli możesz po prostu pokroić każdy przeszkadzający obiekt w kupkę papki. Daj graczowi tylko kilka cięć do zabawy (lub spraw, aby powoli ładował się z czasem), a prawdopodobnie okaże się, że sprawia to, że twoje łamigłówki są trudniejsze, oprócz eliminacji problemów związanych z kolizją na tysiącu fragmentów.

Chase Sandmann
źródło
1
Pomyśl, że zrobię pierwszą, ponieważ nie planuję robić żadnej gry logicznej.
Ducktor
36
Micheal Podnieś to, gdy znikają również małe kawałki. To nie jest dziennik, to trociny. Lub eksplodujące trociny. Dlaczego nie?!
corsiKa
26
@corsiKa Jeśli dodasz efekty płonące do ruchu cięcia, możesz spowodować, że cięcia pozostawiają ślady przypalenia w punktach styku, o określonej szerokości. Jeśli obiekt jest tak mały, że jest w pełni „spalony”, może wybuchnąć płomieniem i wypalić się w ciągu kilku chwil.
T. Sar
155

Rozwiąż swoje wąskie gardło

Kilkaset ruchomych obiektów nie powinno stanowić problemu. Jednak może być kilkaset kolidujących obiektów. To zajmie trochę testów, ale uważam, że wąskim gardłem jest kolizja.

Nawiasem mówiąc, o ilu przedmiotach mówimy? Co to jest platforma? Sto obiektów w grze mobilnej to nie to samo, co sto w przypadku gry internetowej lub sto obiektów w przypadku gry komputerowej.

Przetestuj tę samą grę, ale z wyłączonymi kolizjami między wyciętymi obiektami i sprawdź, czy opóźnia się na podobnych ilościach obiektów. Jeśli tak jest, oznacza to, że sama ilość przedmiotów jest przyczyną problemów; w przeciwnym razie problemem są kolizje.

Poinformuje Cię o tym, co zrobisz, aby poprawić wydajność. Nie wszystkie poniższe pomysły będą miały zastosowanie, a mimo to będziesz musiał je przetestować.


Nie będę mówił o optymalizacji pod kątem dużej liczby obiektów z dala od gracza, ponieważ wydaje się, że kłopoty pojawiają się podczas interakcji z przedmiotami.

występuje problem, gdy je poruszasz.

Jeśli problem wystąpi podczas interakcji z obiektami, nie jest jasne, w jaki sposób usunięcie niewidzialnych obiektów go rozwiąże ... zakładam jednak, że może to pomóc.

Powiem tylko, że jeśli obiekty znajdujące się daleko od gracza stanowią problem, możesz zacząć od mniejszych poziomów lub podzielić grę na części, które możesz załadować i rozładować w zależności od tego, dokąd zmierza gracz.


Poza granicami

Uważam, że jeśli chodzi o sprzątanie gruzu, pierwszą rzeczą, którą trzeba mieć, jest usunięcie przedmiotów, które są poza zakresem. Na przykład kawałek, który spadł do dołu. Jeśli nie ma możliwości, aby gracz mógł się tam dostać, nie ma powodu, aby go trzymać.

Wrócę do tego.


Uczyń go bardziej realistycznym (część 1)

Podczas cięcia drewna za pomocą piły, siekiery lub podobnego narzędzia utracony zostanie materiał (trociny, wióry itp.). Nawet jeśli tniesz laserem, laser spali trochę drewna. Ponadto w przypadku przedmiotów, które nie są drewnem, wokół nacięcia zwykle dochodzi do deformacji, kruszenia itp.

Mówię o tym, że cięcie nie jest idealne i część materiału zostanie utracona. Możesz to wymodelować w swojej grze. To magiczne cięcie czerwonej rzeczy ma grubość. Usuń tę grubość z obiektów (dodaj efekty cząsteczkowe, jeśli czujesz się zbyt winny).

Oznacza to, że nie będziesz w stanie wyciąć niczego, co jest mniejsze niż ta grubość, w rzeczywistości próba zrobienia tego spowoduje usunięcie go z gry. To jest dobre! Oznacza to, że istnieje górna granica ilości gruzu, która będzie, i istnieje mechanicznie rozsądny sposób na oczyszczenie go w grze.


Zmień biegi dla małych obiektów

Będzie to działać lepiej, jeśli problemem są kolizje.

Gdy obiekt jest zbyt mały, szczegóły różnych kątów, które ma, są mniej istotne. Możesz zmienić na mniej dokładną mechanikę kolizji. Na przykład możesz użyć zderzaczy kół.

Możesz traktować nawet mniejsze przedmioty bez kolizji między sobą; rozważaj tylko kolizje między nimi a obiektami agentów (takimi jak awatar gracza lub postacie kontrolowane przez AI).

W końcu bardzo małe przedmioty mogą po prostu zamienić się w pył (efekty cząsteczkowe).


Uczyń go bardziej realistycznym (część 2)

Będzie to działać lepiej, jeśli problemem są kolizje.

Materiał odkształca się i pęka pod naciskiem. Jeśli skończysz z długimi przedmiotami o bardzo małej grubości, podziel je na mniejsze przedmioty, aby mogły skorzystać z powyższego rozwiązania.

Możemy udawać, że miał zbyt małą grubość, aby się kruszył i łamał po uderzeniu.


Scal obiekty

Będzie to działać lepiej, jeśli problemem jest liczba obiektów.

Powszechną sztuczką używaną przez wiele gier do radzenia sobie z dużymi spadkami, które mogą obniżyć wydajność, jest łączenie spadków.

Możesz spróbować czegoś podobnego dla małych obiektów, które są blisko siebie. Niech staną się jednym obiektem. Nie chcę jednak sklejać kawałków. Mam na myśli stworzenie jednego obiektu do obsługi ich fizyki; nadal możesz przedstawiać poszczególne elementy, które tworzyły obiekt, być może stosując techniki podobne do efektów cząsteczkowych.


Uczyń go bardziej realistycznym (część 3)

Czy słyszałeś o wietrze? W prawdziwym świecie jest wiatr.

Użyj wiatru, aby odepchnąć małe przedmioty.

Wiem, że może to zabrzmieć intuicyjnie, ponieważ oznacza, że ​​małe przedmioty nie odpoczywają, a przynajmniej nie od razu. Przeczytaj poniżej, zanim podejmiesz decyzję.

Możesz użyć wiatru, aby odepchnąć mały przedmiot, zanim zacznie się on gromadzić. Który będzie działał lepiej, jeśli korzystasz z optymalizacji dla małych obiektów (takich jak łączenie ich lub usuwanie kolizji między nimi).

Ponadto, jeśli możesz użyć wiatru do wypychania przedmiotów do dołów lub w inny sposób poza granice, możesz użyć jako wymówki, aby usunąć przedmioty. Mówiłem ci, że wrócę do tego. Nawet jeśli tego nie zrobisz, może to być wymówka do usunięcia małych obiektów, które są zbyt daleko od gracza, udawaj, że wiatr się ich pozbył, gdy gracz nie patrzył.

Możesz usunąć niektóre przedmioty, gdy gracz nie patrzy, masz moje błogosławieństwo.

Oprócz tego masz teraz wymówkę, aby dodać wiatr, który możesz dodać wiatr w ramach innych mechanizmów lub przeszkód w grze. Możesz nawet dodać do narracji ducha wiatru, który stara się utrzymać wszystko w czystości, jeśli masz na to ochotę.

Uwaga : niekoniecznie musisz uruchamiać wiatr, gdy są gruz do oczyszczenia (chociaż to by działało), prawdopodobnie możesz mieć wiatr w przypadkowych odstępach czasu.


Bobry!

Nadchodzi jakiś irytujący bóbr i kradnie drewno!

Teraz masz typ wroga!

Ponadto oczywiście usuwają drewno, gdy nie patrzysz. Możesz nawet zaprojektować go tak, abyś wrócił i zobaczył, jak jeden bóbr ucieka z kawałkiem drewna, gdzie kiedyś był stos. To byłby niezapomniany moment, wyjaśni, dlaczego drewno zniknęło i rozwiąże niektóre problemy z wydajnością, z którymi się borykasz naraz.


To wszystko kompromisy

Istnieją ograniczenia związane z platformą lub wybranymi narzędziami, nawet czas i budżet potrzebny na rozwój gry jest ograniczeniem. Nie można zrobić doskonały symulację rzeczywistości jeszcze . Nikt nie może .

Każdy programista działa w granicach ograniczeń platformy docelowej i narzuconych mu narzędzi, a najlepsze gry musiały dokonać kompromisów, aby gra była zabawna i wciągająca ... nawet jeśli oznacza to mniej realizmu, często są zabawne i wciągające, ponieważ nie są realistyczne.

Niech kreatywność pochodzi z tych ograniczeń.

Możesz jednak uczynić swoją grę bardziej realistyczną , wybierając części rzeczywistości dogodne dla twojego rozwoju. Weź pod uwagę, że czasami usuwanie przedmiotów, które znajdują się z dala od gracza, stanowi część kosztu tworzenia fajnej gry.

Theraot
źródło
36
Ten post jest ostateczną odpowiedzią na problem przepełnienia gruzu. Przedstawiłeś wyczerpujące podsumowanie technik, jednocześnie wyraźnie pokazując potrzebę bycia kreatywnym i wybierania rozwiązań, które sprawdzą się w danych okolicznościach, a także pokazując, w jaki sposób mechanika i narracja mogą płynąć razem. Chciałem tylko powiedzieć, że mam problem z wyrażeniem mojego wrażenia.
Dragomok
12
Próba przecięcia obiektu mniejszego niż szerokość wiązki nie musi powodować całkowitego zniknięcia obiektu, ale zamiast tego może dać jeden mniejszy obiekt. Ważne jest to, że liczbę obiektów można zwiększyć tylko wtedy, gdy wycięty obiekt przekracza szerokość wiązki.
supercat
1

Świat jest dyskretny. Nie można renderować obiektu mniejszego niż piksel, więc nie zezwalaj na istnienie takich obiektów. (Jest to podobne do niektórych punktów realizmu przedstawionych przez Theraot .)

Rzeczywiście, możesz dostać to za darmo: gracz określa swoją linię cięcia jako zasadniczo dyskretną linię na ekranie. Efektem cięcia jest podzielenie każdego obiektu na pod-obiekty składające się, odpowiednio, z pikseli znajdujących się na tej linii lub poniżej niej oraz pikseli dokładnie nad nią. Obiekt jednopikselowy nie może znajdować się zarówno powyżej, jak i poniżej linii, więc ten algorytm nie może go wyciąć.

Jeśli pocięcie wszystkich tabel cięcia na pojedyncze piksele nadal pozostawia zbyt wiele obiektów do śledzenia, większy minimalny rozmiar może nadal działać.

Albo po prostu się tym nie martw. Jeśli gracz jest przygotowany do spędzenia długiego czasu na cięciu przedmiotów w pył, to oczywiście nie spieszy się, aby poradzić sobie z opóźnieniem, które spowodowały. ;-)

David Richerby
źródło