Konfiguracja drużyn
W tej sekcji nauczysz się konfigurować drużyny łowców i rekwizytów na początku gry i teleportować je do obszarów startowych.
Ta strona zawiera fragmenty Verse, które pokazują, jak wykonać mechanikę rozgrywki wymaganą w tej rozgrywce. Wykonaj poniższe instrukcje i skopiuj pełny skrypt w kroku 6 tego samouczka.
Postępuj zgodnie z poniższą instrukcją, aby poprawnie skonfigurować swoje drużyny:
-
Utwórz nową funkcję SetupTeams(). W tym miejscu skonfigurujesz wiele subskrypcji funkcji, które zdefiniujesz później, takich jak funkcje określające, co się dzieje, kiedy rekwizyt zostanie zlikwidowany lub co zrobić, gdy gracz dołączy do gry.
# Po rozpoczęciu rundy zasubskrybuj urządzenia drużyny, losowo wybierz agentów łowców, włącz licznik czasu łowców, ustaw agentów rekwizytów i teleportuj ich do obszaru gry. SetUpTeams()<suspends>:void = Logger.Print("Konfigurowanie drużyn.")
-
Najpierw zasubskrybuj zdarzenie SuccessEvent licznika punktów drużyny rekwizytów, zdarzenie likwidacji w menadżerze TeamManager drużyny rekwizytów i ustaw punkty przyznawane w menadżerze wyniku.
# Po rozpoczęciu rundy zasubskrybuj urządzenia drużyny, losowo wybierz agentów łowców, włącz licznik czasu łowców, ustaw agentów rekwizytów i teleportuj ich do obszaru gry. SetUpTeams()<suspends>:void = Logger.Print("Konfigurowanie drużyn.") # Subskrybuj licznik punktów drużyny rekwizytów, ustaw przyznawanie punktów i subskrybuj zdarzenie likwidacji drużyny rekwizytów. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Występuje, gdy agent rekwizytów zostanie zlikwidowany.
-
Następnie to samo należy wykonać dla drużyny łowców. Potem należy ustawić czas oczekiwania drużyny łowców na pożądane opóźnienie spawnu łowców.
# Po rozpoczęciu rundy zasubskrybuj urządzenia drużyny, losowo wybierz agentów łowców, włącz licznik czasu łowców, ustaw agentów rekwizytów i teleportuj ich do obszaru gry. SetUpTeams()<suspends>:void = Logger.Print("Konfigurowanie drużyn.") # Subskrybuj licznik punktów drużyny rekwizytów, ustaw przyznawanie punktów i subskrybuj zdarzenie likwidacji drużyny rekwizytów. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Występuje, gdy agent rekwizytów zostanie zlikwidowany. # Subskrybuj licznik czasu oczekiwania drużyny łowców i ustaw czas jego trwania. Subskrybuj również zdarzenie likwidacji drużyny łowców. HunterTeam.WaitTimer.SuccessEvent.Subscribe(HuntersGo) HunterTeam.WaitTimer.SetMaxDuration(HunterTeam.SpawnDelay) HunterTeam.TeamManager.EnemyEliminatedEvent.Subscribe(OnHunterEliminated) # Występuje, gdy agent łowców likwiduje agenta rekwizytów.
-
Nadal w
SetupTeams()
, zainicjuj tablice początkowych agentów łowców i rekwizytów, a następnie włącz interfejs oczekiwania podczas sprawdzania, czy jest wystarczająco dużo graczy, aby rozpocząć grę. Jeśli tak, wyłącz interfejs oczekiwania.# Zainicjuj tablice początkowych agentów łowców i rekwizytów. Pobierz graczy i znajdź liczbę graczy na serwerze var StartingHunterAgents:[]agent = array{} var StartingPropAgents:[]agent = array{} var Players:[]player = GetPlayspace().GetPlayers() # Włącz interfejs odpowiedni do oczekiwania na graczy. HUDControllerWaiting.Enable() # Sprawdź, czy jest wystarczająca liczba graczy, aby rozpocząć rundę. set Players = WaitingForMorePlayers.WaitForMinimumNumberOfPlayers(Players) Logger.Print("Runda się rozpoczęła.") # Wyłącz interfejs oczekiwania, aby użyć następnego interfejsu o najwyższym priorytecie. HUDControllerWaiting.Disable()
-
Teraz, gdy runda się rozpoczęła, musisz zająć się tym, co dzieje się, gdy gracz dołącza lub zostaje usunięty z meczu. Tutaj skonfigurujesz subskrypcje i zdefiniujesz te funkcje później.
# Po rozpoczęciu rundy musimy zająć się dodawaniem lub usuwaniem graczy z meczu. Subskrybuj te zdarzenia. GetPlayspace().PlayerAddedEvent().Subscribe(OnPlayerAdded) GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved)
-
Liczba początkowych łowców zależy od liczby graczy w grze. Nie chcesz, aby jeden łowca musiał radzić sobie z dziesięcioma graczami, więc skonfiguruj funkcję, która ustawia liczbę łowców na podstawie wzoru. Konwertuj liczbę graczy na wartość pojedynczej precyzji (float), aby użyć jej we wzorze.
# Oblicz liczbę początkowych agentów łowców w grze na podstawie liczby graczy i liczby agentów łowców na liczbę graczy. NumberOfPlayers:float = 1.0 * Players.Length # Konwertuje Players.Length na wartość pojedynczej precyzji (float), aby można było jej użyć w następnej funkcji Ceil.
-
Teraz ustaw liczbę początkowych łowców na pułap z poniższego wzoru. Następnie przetasuj tablicę wszystkich graczy, ponieważ chcesz, aby początkowi łowcy zostali losowo wybrani z listy graczy.
# Oblicz liczbę początkowych agentów łowców w grze na podstawie liczby graczy i liczby agentów łowców na liczbę graczy. NumberOfPlayers:float = 1.0 * Players.Length # Konwertuje Players.Length na wartość pojedynczej precyzji (float), aby można było jej użyć w następnej funkcji Ceil. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Potasuj graczy, a następnie podziel tablicę, aby otrzymać początkowych agentów łowców. Pozostali gracze są początkowymi agentami rekwizytów. var RandomizedPlayers:[]agent = Shuffle(Players)
-
Podziel losową tablicę na części o rozmiarze od 0 do liczby początkowych łowców. Będzie to początkowa drużyna łowców, więc ustaw ją na StartingHunterAgents. Pozostali gracze będą początkową drużyną rekwizytów, więc ustaw ich na StartingPropAgents.
# Oblicz liczbę początkowych agentów łowców w grze na podstawie liczby graczy i liczby agentów łowców na liczbę graczy. NumberOfPlayers:float = 1.0 * Players.Length # Konwertuje Players.Length na wartość pojedynczej precyzji (float), aby można było jej użyć w następnej funkcji Ceil. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Potasuj graczy, a następnie podziel tablicę, aby otrzymać początkowych agentów łowców. Pozostali gracze są początkowymi agentami rekwizytów. var RandomizedPlayers:[]agent = Shuffle(Players) if (set StartingHunterAgents = RandomizedPlayers.Slice[0,NumberOfStartingHunters]) {} if (set StartingPropAgents = RandomizedPlayers.Slice[NumberOfStartingHunters,RandomizedPlayers.Length]) {} # Powtórz losowanie początkowych agentów łowców i przydziel ich do drużyny łowców. Następnie uruchom licznik czasu oczekiwania łowców. Logger.Print("Konfiguracja {StartingHunterAgents.Length} agentów łowców.") for (StartingHunterAgent : StartingHunterAgents): HunterTeam.InitializeAgent(StartingHunterAgent) HunterTeam.WaitTimer.Start() # Iteruj początkowych agentów rekwizytów i przypisz ich do drużyny rekwizytów. Teleportuj ich do obszaru gry. Logger.Print("Konfiguracja {StartingPropAgents.Length} agentów rekwizytów.")
-
Po ustawieniu drużyn włącz teleporter w lobby, aby teleportować rekwizyty z pokoju startowego i aktywuj ich bicie serca. Następnie wyłącz teleporter w lobby, ponieważ nie będzie już potrzebny. Na koniec ustaw liczbę pozostałych rekwizytów w PropsRemainingTracker zgodnie z rozmiarem drużyny rekwizytów.
LobbyTeleporter.Enable() for (StartingPropAgent : StartingPropAgents): PropTeam.InitializeAgent(StartingPropAgent) PropTeam.HeartBeat.SetUpUI(StartingPropAgent) LobbyTeleporter.Activate(StartingPropAgent) LobbyTeleporter.Disable() # Ustaw wartość i cel pozostałego postępometru rekwizytów na bieżącą liczbę rekwizytów. # W przyszłości wartość będzie aktualizowana tylko wtedy, gdy rekwizyty zostaną zlikwidowane. PropTeam.PropsRemainingTracker.SetTarget(PropTeam.Count()) PropTeam.UpdatePropsRemainingTracker()
Zarządzanie likwidacją gracza
Łowcy wygrywają, likwidując wszystkie rekwizyty i przekształcając ich w łowców. Wykonaj poniższe kroki, aby przyznać łowcom punkty za zlikwidowanie rekwizytu i przenieść zlikwidowany rekwizyt do drużyny łowców.
-
Utwórz funkcję o nazwie OnHunterEliminated(). Wcześniej zasubskrybowane zostało zdarzenie urządzenie menadżera drużyny łowców EnemyEliminatedEvent, więc zostanie ono aktywowane za każdym razem, gdy łowca zlikwiduje rekwizyt.
# Gdy agent łowców zlikwiduje agenta rekwizytów, przyznawany jest punkt. Punkty dzielone są przez liczbę pozostałych agentów rekwizytów. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Agent łowców zlikwidował agenta rekwizytów.")
-
Najpierw musisz przyznać łowcom wynik proporcjonalny do liczby pozostałych agentów rekwizytów. Utwórz zmienną
EliminationAward
równąMaxEliminationScore
podzieloną przezPropTeamSize
. Ustaw menadżer wyników drużyny łowców na ten wynik, a następnie przyznaj punkty łowcy, który zaliczył likwidację.# Gdy agent łowców zlikwiduje agenta rekwizytów, przyznawany jest punkt. Punkty dzielone są przez liczbę pozostałych agentów rekwizytów. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Agent łowców zlikwidował agenta rekwizytów.") PropTeamSize := PropTeam.Count() if (EliminationAward := Floor(HunterTeam.MaxEliminationScore / PropTeamSize)): Logger.Print("Przyznana liczba punktów: {EliminationAward}.") HunterTeam.ScoreManager.SetScoreAward(EliminationAward HunterTeam.ScoreManager.Activate(HunterAgent)
-
Musisz także zająć się tym, co stanie się z drużyną rekwizytów, gdy rekwizyt zostanie zlikwidowany. Utwórz funkcję o nazwie OnPropEliminated(). Podobnie jak OnHunterEliminated(), funkcja ta została zasubskrybowana wcześniej. Gdy rekwizyt zostanie zlikwidowany, musisz usunąć go z drużyny rekwizytów za pomocą funkcji EliminateAgent() w PropTeam, a następnie zainicjować go jako łowcę za pomocą funkcji InitializeAgent() w HunterTeam.
# Gdy agent rekwizytów zostanie zlikwidowany, usuń rekwizyt z drużyny rekwizytów, sprawdź, czy runda dobiegła końca i ustaw go jako łowcę. OnPropEliminated(PropAgent:agent):void = Logger.Print("Agent rekwizytów zlikwidowany.") spawn{ PropTeam.EliminateAgent(PropAgent) } HunterTeam.InitializeAgent(PropAgent)
Zarządzanie dołączaniem i opuszczaniem gry przez graczy
Gdy gracz dołącza do gry w połowie rundy, powinien pojawić się jako łowca.
-
Utwórz funkcję OnPlayerAdded(), aby to obsłużyć. Ta funkcja po prostu inicjuje gracza, który dołącza jako łowca.
# Gdy gracz dołącza do meczu w połowie rundy, należy uczynić go łowcą. OnPlayerAdded(Player:player):void = Logger.Print("Gracz dołączył do gry.") HunterTeam.InitializeAgent(Player)
-
Opuszczanie meczu przez graczy jest nieco bardziej skomplikowane. Jeśli gracz opuści mecz, musimy usunąć go z drużyny, w której się znajduje, a także sprawdzić, czy jego odejście spowoduje zakończenie gry. Może to być spowodowane tym, że gracz, który odszedł, był ostatnim rekwizytem lub jedynym łowcą. Ta logika jest obsługiwana przez funkcje EliminateAgent() w każdej drużynie, więc pojawi się ich instancja w zależności od tego, z której drużyny pochodził usunięty gracz.
# Gdy gracz opuści mecz, należy sprawdzić, w której drużynie grał, a następnie sprawdzić, czy runda dobiegła końca. OnPlayerRemoved(Player:player):void= Logger.Print("Gracz opuścił grę.") if (PropTeam.FindOnTeam[Player]): Logger.Print("Gracz był rekwizytem.") spawn{ PropTeam.EliminateAgent(Player) } if (HunterTeam.FindOnTeam[Player]): Logger.Print("Gracz był łowcą.") spawn{ HunterTeam.EliminateAgent(Player) }
Koniec rundy
Po skonfigurowaniu wszystkich drużyn należy monitorować liczebność każdej z nich, aby sprawdzić, czy runda dobiegła końca. Gra kończy się, gdy jedna z drużyn jest pusta lub gdy skończy się czas rundy, więc użyjesz wyrażenia race, aby zobaczyć, kto będzie pierwszy.
-
Na końcu funkcji OnBegin(), w wyrażeniu race, użyj funkcji Await() dla zdarzenia TeamEmptyEvent zarówno drużyny łowców i rekwizytów, jak i funkcji AwaitEnd() dla RoundTimer. Po zakończeniu wyścigu wywołaj funkcję EndRound(), którą zdefiniujesz w następnym kroku.
# Gdy zabraknie agentów rekwizytów lub łowców (w zależności od tego, co nastąpi wcześniej) lub gdy licznik czasu rundy dobiegnie końca, lub gdy runda dobiegnie końca race: PropTeam.TeamEmptyEvent.Await() HunterTeam.TeamEmptyEvent.Await() RoundTimer.AwaitEnd() Logger.Print("Kończenie rundy.") EndRound()
-
W funkcji EndRound() należy wyłączyć czujnik bicia serca dla każdego gracza w drużynie rekwizytów i wywołać funkcję EndRound() na urządzeniu RoundSettings. Ponieważ funkcja EndRound() na urządzeniu RoundSettings wymaga przekazania do niej gracza, pobierz pierwszego gracza z tablicy graczy i przekaż go jako inicjatora.
# Czyści efekty wizualne bicia serca i kończy rundę. EndRound():void= PropTeam.HeartBeat.DisableAll() # Pobierz dowolnego gracza do EndRound Players:[]player = GetPlayspace().GetPlayers() if (RoundEndInstigator := Players[0]): Logger.Print("Runda zakończyła się.") RoundSettings.EndRound(RoundEndInstigator)