Tworzę grę Tower Defense we Flashu bez wstępnie zdefiniowanej ścieżki.
Chociaż moja siatka ma wymiary 40 x 40 (mała?), A * ma trudności z ponownym obliczaniem za każdym razem. Więc zrobiłem własną modyfikację, aby ułatwić ponowne obliczenie, a liczba dotkniętych komórek spadła do około 900 (podczas modyfikacji w pobliżu korzenia). Nadal zawiesza się na bardzo krótki, ale wykrywalny czas po umieszczeniu nowej wieży.
Czy to problem z implementacją, czy 40x40 to po prostu za dużo?
Edytować:
Struktura mojego kodu:
- Wszystkie dane są zapisywane w 2d tablicy komórek.
- Każda komórka zawiera swojego elementu nadrzędnego w kierunku ścieżki (1-8 zgodnie z ruchem wskazówek zegara) i zakodowaną bitowo tablicę swoich elementów podrzędnych na ścieżce (każdy bit reprezentuje dziecko).
- Wyszukiwanie jest wykonywane przez A * z oszacowaniem odległości euklidesowej.
Odpowiedzi:
Nie mogę komentować, ale pierwszy profil w Flex, wszystko inne jest przypuszczeniem.
źródło
Zakładam, że niszczyciel czołgów to „Tower Defense”
Myślę, że A * idzie trochę za burtę.
Na początku gry zalej obszar gry od punktów wyjścia, aby utworzyć mapę ruchu:
a ruch jest zawsze w kierunku kwadratu o niższej wartości.
Kiedy gracz umieszcza wieżę, zaktualizuj każdy z ośmiu sąsiednich pól: dla każdego kwadratu ustaw jego wartość ruchu o jeden więcej niż najniższą sąsiednią wartość. Jeśli wartość się zmienia, powtórz proces wyśrodkowany na zaktualizowanym kwadracie. Następnie, aby sprawdzić, czy droga do wyjścia nie jest zablokowana, upewnij się, że wszystkie kwadraty sąsiadują z kwadratem o niższej wartości.
Kiedy gracz usunie wieżę, ustaw wartość ruchu o jeden więcej niż najniższy sąsiadujący kwadrat i powtórz powyższą procedurę.
Prostszym podejściem byłoby ponowne wypełnienie zalewu.
źródło
Dziwne, myślałem, że odpowiedziałem na to, ale odpowiedź wydaje się zniknąć. Ustaw algorytm wyszukiwania w taki sposób, aby można go było aktualizować w kilku krokach, dzięki czemu po ustawieniu wieży i odtworzeniu animacji będziesz mógł wykonać trochę każdej klatki, a będziesz miał około pół sekundy na sekundę na aktualizację A * bez zauważalnej przerwy. To opóźnienie - jeśli nie możesz go przyspieszyć, znajdź sposób, aby to ukryć. Odtwarzanie animacji podczas umieszczania wieży byłoby naturalne dla gry i stanowi dobre miejsce do jej schowania.
źródło
Na początek możesz zmienić tablicę na wektor - powinno to dać ci poprawę prędkości. Opublikuj kod, a być może będziemy mogli zaproponować więcej optymalizacji.
źródło
Sądzę, że twoje spowolnienie jest spowodowane tym, że obliczasz ścieżkę dla wszystkich postaci jednocześnie. Obliczanie ścieżki dla jednej postaci jest szybkie, ale jeśli na scenie znajdują się dwa tuziny znaków, może to zapaść.
Zamiast tego należy rozłożyć obciążenie na kilka ramek. Rozłóż aktualizacje AI, aby różne postacie aktualizowały swoją ścieżkę w różnych ramkach. Byłoby to naprawdę zauważalne, gdyby postać nie zareagowała przed sekundą, ale tylko jedna klatka nie spowoduje złych reakcji.
źródło