Chcesz wykorzystać mapę do monitorowania liczby likwidacji zaliczonych przez gracza. Mapy pozwalają tworzyć praktyczne powiązania kluczy z wartościami, a w tym samouczku gracz będzie pełnił funkcję klucza, natomiast powiązany poziom broni (reprezentowany w formie liczby całkowitej) będzie stanowił wartość. To umożliwi pobranie bieżącego poziomu gracza przez samo odwołanie do gracza. Poniżej przedstawiono przykładową mapę powiązań między graczem a stopniem broni.
| Klucz | gracz 1 | gracz 2 | gracz 3 |
| Wartość | 1 | 2 | 2 |
| Broń w grze | Bojowy pistolet L1 | Pistolet krzemieniowy L1 | Pistolet krzemieniowy L1 |
Aby skonfigurować i uzupełnić mapę graczy, wykonaj następujące instrukcje:
-
Dodaj mapę
[player]into nazwiePlayerMapdo klasyteam_elimination_game. Spowoduje to zapisanie odwołania do każdego gracza i poziomu jego broni.team_elimination_game := class(creative_device): var PlayerMap : [player]int = map{} -
Dodaj nową metodę
PopulateTeamsAndPlayers()do klasyteam_elimination_game. Metoda ta uzupełni mapęPlayerMapi będzie wywoływana z metodyOnBegin().PopulateTeamsAndPlayers() : void= Print("Rozpoczęcie uzupełniania graczy") -
Dodaj nową metodę
OnPlayerEliminateddo klasyteam_elimination_game. Metoda ta będzie wywoływana po każdej likwidacji gracza i będzie ustalać, kim jest gracz dokonujący likwidacji, przez uzyskanie dostępu do strukturyelimination_resultprzekazywanej jako argument.OnPlayerEliminated(Result : elimination_result) : void= Print("Gracz został zlikwidowany!") -
Po rozpoczęciu gry musisz wykonać iterację po liście graczy i ustawić dla nich wszystkich pierwszy poziom broni. W metodzie
PopulateTeamsAndPlayerspobierz wszystkich graczy za pomocą funkcjiGetPlaySpace().GetPlayers()i zapisz ich w tablicyAllPlayers. Dla każdego gracza pobierz jego właściwośćFortCharacteri zapisz w zmiennejFortCharacter. Na mapiePlayerMapustaw wynik gracza na zero, aby utworzyć reprezentację dla pierwszej broni w tablicyWeaponGranters, a następnie subskrybuj zdarzenieFortCharacter.EliminatedEvent()do metodyOnPlayerEliminated.AllPlayers := GetPlayspace().GetPlayers() for (Agent : AllPlayers, TeamPlayer := player[Agent], FortCharacter := TeamPlayer.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Przypisano gracza do PlayerMap ze stopniem {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) -
Za pomocą odwołania do wyniku gracza w ustawionej mapie
PlayerMapmożesz przyznać graczom ich pierwszą broń. Zmodyfikuj metodęOnPlayerSpawn, aby przyznać graczom ich pierwszą broń. Gdy gracz zostanie zespawnowany, pobierz jego poziom broni z mapyPlayerMapi zapisz w zmiennejWeaponTier, a następnie wywołaj metodęGrantWeaponprzekazującą zmiennąWeaponTieroraz odwołanie do gracza.OnPlayerSpawn(InPlayer : agent) : void = Print("Gracz właśnie się zespawnował!") if(WeaponTier := PlayerMap[InPlayer]): GrantWeapon(option{InPlayer}, WeaponTier) Print("Zespawnowanemu graczowi przyznano broń poziomu {WeaponTier}") -
Zapisz skrypt w Visual Studio Code, skompiluj go, a następnie na pasku narzędzi UEFN kliknij opcję Uruchom sesję, aby przetestować poziom w grze. W trakcie testu poziomu w grze gracz powinien pojawiać się z pierwszą bronią z tablicy
WeaponGranters. Sprawdź to zachowanie w dzienniku.
Mapowanie drużyn graczy
Po skonfigurowaniu mapy graczy dobrze jest przemyśleć sposób sprawdzania wyniku gracza. Utworzony skrypt będzie automatycznie awansował gracza z drużyny o najmniejszej liczbie likwidacji, dlatego sprawdzanie poziomu broni graczy wrogiej drużyny nie jest przydatne. Na tym etapie już możesz zauważyć powstały problem. Mapa PlayerMap nie rozróżnia drużyn.
Aby obejść ten problem, można użyć kolejnej mapy. W tym celu włączysz skonfigurowaną wcześniej mapę PlayerMap do układu map zagnieżdżonych. Pary klucz-wartość w mapie mogą być dowolnymi parami typów, dlatego dobrym rozwiązaniem jest sparowanie klucza drużyny z inną mapą stanowiącą jego wartość. Pierwsza mapa będzie kojarzyć drużyny (klucz) z inną mapą graczy należących do tej drużyny (wartość). Mapa wewnętrzna będzie kojarzyć graczy (klucz) z ich wynikiem (wartość).
Wówczas możesz sprawdzić, do której drużyny należy gracz, za pomocą funkcji GetTeam(). Dysponując takimi informacjami, możesz pobrać listę członków danej drużyny w celu porównania ze sobą liczby likwidacji.
Składnia mapy zagnieżdżonej [team][player]int może być niejasna. Aby łatwiej ją było zrozumieć, możesz wykorzystać aliasing typów w celu utworzenia prostszej nazwy do odwoływania się do mapy. W tym samouczku składnię [player]int zastąpisz aliasem player_map. Dzięki temu nazwy player_map będzie można użyć w każdym przypadku wymagającym wprowadzenia [player]int, a zagnieżdżoną mapę można zapisać kodem [team]player_map, lub w odniesieniu do mapy kojarzącej drużyny z mapami graczy.
Aby włączyć mapę w układ map zagnieżdżonych, wykonaj następujące instrukcje:
-
Nad definicją klasy
team_elimination_gamedodaj alias typu[player]into nazwieplayer_map.player_map := [player]int # To jest alias typu! team_elimination_game := class(creative_device): -
Zastąp zmienną
PlayerMapskonfigurowaną wcześniej w klasieteam_elimination_gamenową zmiennąTeamMaptypu[team]player_map.# Mapa obejmująca mapy drużyn, w której kluczem jest drużyna, a wartością jest mapa # gracz->liczba całkowita, i składają się one w pary klucz-wartość var TeamMap : [team]player_map = map{} -
Typem wartości mapy
TeamMapjestplayer_map, dlatego dla każdej drużyny musisz zainicjować mapę graczy, uzupełnić ją, ustawić wynik0dla każdego gracza, a następnie przypisać mapę graczy do mapyTeamMap. Zmodyfikuj metodęPopulateTeamsAndPlayers()o zaktualizowany kod.- Dla każdej drużyny pobierz należących do niej graczy i zapisz ich w zmiennej
TeamPlayers. Zainicjuj nową zmiennąPlayerMaptypuplayer_map, aby utworzyć mapę kojarzącą graczy z ich wynikiem.
PopulateTeamsAndPlayers() : void= Print("Rozpoczęcie uzupełniania graczy") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {}- Dla każdego gracza w tablicy
TeamPlayerspobierz jego właściwośćFortCharacteri zapisz w zmiennejFortCharacter. Na mapiePlayerMapustaw wynik gracza na0, aby utworzyć reprezentację dla pierwszej broni w tablicyWeaponGranters, a następnie subskrybuj zdarzenieFortCharacter.EliminatedEvent()do metodyOnPlayerEliminated.
PopulateTeamsAndPlayers() : void = Print("Rozpoczęcie uzupełniania graczy") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Przypisano gracza do PlayerMap ze stopniem {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated)- Na końcu ustaw
PlayerMapjako wartość bieżącego kluczaTeamw mapieTeamMap. Kod metodyPopulateTeamsAndPlayerspowinien wyglądać następująco:
PopulateTeamsAndPlayers() : void = Print("Rozpoczęcie uzupełniania graczy") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Przypisano gracza do PlayerMap ze stopniem {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) if(set TeamMap[Team] = PlayerMap): Print("Ustawiono tę drużynę w TeamMap") - Dla każdej drużyny pobierz należących do niej graczy i zapisz ich w zmiennej
-
Po ustawieniu mapy
TeamMapzaktualizuj metodęOnPlayerSpawntak, aby uzyskać dostęp do drużyny gracza za pomocą funkcjiGetTeam[]i zapisać ją w zmiennej lokalnejPlayerTeam. Ustaw wartośćWeaponTier, pobierając bieżący wynik gracza z mapyTeamMapza pomocą zmiennejPlayerTeami odwołania do gracza. Kod zaktualizowanej metodyOnPlayerSpawn()powinien wyglądać następująco:OnPlayerSpawn(InPlayer : agent) : void = Print("Gracz właśnie się zespawnował!") if: PlayerTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer] WeaponTier:int := TeamMap[PlayerTeam][InPlayer] then: GrantWeapon(option{InPlayer}, WeaponTier) Print("Zespawnowanemu graczowi przyznano broń poziomu {WeaponTier}")
Zapisz skrypt w Visual Studio Code, skompiluj go, a następnie na pasku narzędzi UEFN kliknij opcję Uruchom sesję, aby przetestować poziom w grze. W trakcie testu poziomu w grze gracz powinien ponownie spawnować się z pierwszą bronią z tablicy WeaponGranters. Sprawdź to zachowanie w dzienniku.
Następny krok
W kolejnym kroku tego samouczka dowiesz się, jak przyznawać graczom bronie, gdy zaliczają likwidację.