Oto twoje warunki:
Inne obiekty mogą nadal zależeć od usuniętej istoty po jej usunięciu.
Chcesz, aby tylko jednostka określiła własne usunięcie.
Nie możesz mieć obu. Dlaczego? Ponieważ kod na wyższym poziomie niż sama encja (patrz przykłady poniżej) decyduje, kiedy encja musi zostać użyta. W związku z tym tylko kod na tym samym poziomie może określić, czy dany podmiot jest odpowiedni do usunięcia, czy nie.
Jednak to, co może się zdarzyć, że jednostka może zażądać swój własny usunięcie, przez wypalanie się zdarzenia, którego kod wyższy poziom nasłuchuje. Ten wyższy poziom następnie przechowuje to żądanie usunięcia na liście.
Przykład 1: bez zdarzeń
Sprawdzasz kolizje między bytami w twoim świecie. Jest to obsługiwane wyżej, zwykle w głównej pętli gry, która porównuje każdą jednostkę ze sobą. W tym przykładzie konkretnie, gdy jednostka zderza się z inną, tylko jej wewnętrzna logika może określić, ile szkód odniosła i czy „wygasła”. Podążajmy więc logiką w przypadku kolizji, w których masz cztery byty w swoim świecie: A, B, C i D.
Sprawdzamy A pod kątem kolizji z B. Jest kolizja. A otrzymuje obrażenia w 50%.
Sprawdzamy A pod kątem kolizji z C. Występuje kolizja. A otrzymuje obrażenia w 50%. Ponieważ obrażenia osiągają 0, A określa, że „umarł”. Usuwa się z listy.
Sprawdzamy A pod kątem kolizji z D. Nie byłoby kolizji, ale nigdy nie dojdziesz tak daleko: otrzymujesz wyjątek czasu wykonywania, ponieważ lista twoich encji została zmodyfikowana w trakcie operacji trawersowania.
Przykład 2: ze zdarzeniami
Taka sama konfiguracja jak poprzednio.
Sprawdzamy A pod kątem kolizji z B. Jest kolizja. A otrzymuje obrażenia w 50%.
Sprawdzamy A pod kątem kolizji z C. Występuje kolizja. A otrzymuje obrażenia w 50%. Ponieważ obrażenia osiągają 0, A określa, że „umarł”. Wystrzeliwuje zdarzenie do kodu zarządzania jednostką, mówiąc: „Usuń mnie jak najszybciej”. Kod zarządzania jednostką sprawdza odniesienie do podmiotu wysłane jako część zdarzenia i zapisuje to odniesienie na liście podmiotów do usunięcia.
Sprawdzamy A pod kątem kolizji z D. Nie ma kolizji, a sprawdzenie działa dobrze.
Teraz, na samym końcu bieżącej iteracji pętli gry , przejrzyj listę podmiotów do usunięcia i usuń każdy z nich z listy głównych podmiotów.
Możesz zobaczyć, jak to całkowicie uniknąć problemu. Nie musisz używać zdarzeń, możesz używać sygnałów lub czegoś innego, ale zasada jest taka sama - nie usuwaj bytów, dopóki nie będziesz mógł tego bezpiecznie zrobić. Drugą stroną tego podejścia, aby utrzymać porządek i porządek, jest to samo z dodawaniem bytów - pamiętaj, aby zachować do nich odniesienia i dodawać je tylko na początku kolejnej pętli gry.
Na koniec nie zapomnij opróżnić zarówno list do usunięcia, jak i list do dodania, za każdym razem, gdy używasz ich do dodawania / usuwania na głównej liście jednostek.
PS. Nie bój się przeszukiwać swojej głównej listy w celu indywidualnego usunięcia. Jest to nieodłączna część zarządzania jednostkami, a nawet ogromne listy przeszukują bardzo szybko - w końcu po to są zaprojektowane.