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]int
o nazwiePlayerMap
do 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ęPlayerMap
i będzie wywoływana z metodyOnBegin()
.PopulateTeamsAndPlayers() : void= Print("Rozpoczęcie uzupełniania graczy")
-
Dodaj nową metodę
OnPlayerEliminated
do 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_result
przekazywanej 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
PopulateTeamsAndPlayers
pobierz wszystkich graczy za pomocą funkcjiGetPlaySpace().GetPlayers()
i zapisz ich w tablicyAllPlayers
. Dla każdego gracza pobierz jego właściwośćFortCharacter
i zapisz w zmiennejFortCharacter
. Na mapiePlayerMap
ustaw 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
PlayerMap
możesz przyznać graczom ich pierwszą broń. Zmodyfikuj metodęOnPlayerSpawn
, aby przyznać graczom ich pierwszą broń. Gdy gracz zostanie zespawnowany, pobierz jego poziom broni z mapyPlayerMap
i zapisz w zmiennejWeaponTier
, a następnie wywołaj metodęGrantWeapon
przekazującą zmiennąWeaponTier
oraz 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_game
dodaj alias typu[player]int
o nazwieplayer_map
.player_map := [player]int # To jest alias typu! team_elimination_game := class(creative_device):
-
Zastąp zmienną
PlayerMap
skonfigurowaną wcześniej w klasieteam_elimination_game
nową zmiennąTeamMap
typu[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
TeamMap
jestplayer_map
, dlatego dla każdej drużyny musisz zainicjować mapę graczy, uzupełnić ją, ustawić wynik0
dla 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ąPlayerMap
typuplayer_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
TeamPlayers
pobierz jego właściwośćFortCharacter
i zapisz w zmiennejFortCharacter
. Na mapiePlayerMap
ustaw 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
PlayerMap
jako wartość bieżącego kluczaTeam
w mapieTeamMap
. Kod metodyPopulateTeamsAndPlayers
powinien 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
TeamMap
zaktualizuj metodęOnPlayerSpawn
tak, 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 mapyTeamMap
za pomocą zmiennejPlayerTeam
i 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ę.