Vas a utilizar un mapa para realizar el seguimiento del número de eliminaciones que ha acumulado un jugador. Los mapas proporcionan una asociación útil de claves a valores, y en este tutorial, usarás al jugador como la clave y su nivel de arma asociado (representado como un entero) como el valor. De esta manera, podrás recuperar el nivel actual del jugador con solo una referencia al jugador. Abajo presentamos un ejemplo de cómo debería ser un mapa de asociaciones de jugador a nivel de arma.
| Clave | jugador 1 | jugador 2 | jugador 3 |
| Valor | 1 | 2 | 2 |
| Arma en el juego | Pistola de combate L1 | Pistola de mecha L1 | Pistola de mecha L1 |
Realiza estos pasos para configurar y propagar el mapa de jugadores:
-
Añade un mapa
[player]intdenominadoPlayerMapa la claseteam_elimination_game. Esto guarda una referencia a cada jugador y su nivel de arma.team_elimination_game := class(creative_device): var PlayerMap : [player]int = map{} -
Añade un nuevo método,
PopulateTeamsAndPlayers(), a la claseteam_elimination_game. Este método propaga tuPlayerMap, y será llamado desdeOnBegin().PopulateTeamsAndPlayers() : void= Print("Comenzando a popular jugadores") -
Añade un nuevo método,
OnPlayerEliminated, a la claseteam_elimination_game. Se llama a este método siempre que se elimina a un jugador, y se determina quién es el jugador eliminador accediendo a la estructuraelimination_resultque se pasa como argumento.OnPlayerEliminated(Result : elimination_result) : void= Print("¡Se eliminó a un jugador!") -
Al comenzar el juego, debes iterar a través de la lista de jugadores y definir a todos en el primer nivel de arma. Dentro de
PopulateTeamsAndPlayers, obtén todos los jugadores conGetPlaySpace().GetPlayers()y guárdalos en la matrizAllPlayers. Para cada jugador, recuperaFortCharacterde dicho jugador y guárdalo en una variableFortCharacter. Define el puntaje del jugador enPlayerMapen 0 para representar la primera arma en la matrizWeaponGrantersy, luego, suscribeFortCharacter.EliminatedEvent()aOnPlayerEliminated.AllPlayers := GetPlayspace().GetPlayers() for (Agent : AllPlayers, TeamPlayer := player[Agent], FortCharacter := TeamPlayer.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Jugador asignado al PlayerMap con Nivel {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) -
Con la referencia al puntaje del jugador definida en
PlayerMap, puedes otorgar a los jugadores su primera arma. ModificaOnPlayerSpawnpara otorgar a los jugadores su primera arma. Cuando aparece un jugador, recupera su nivel de arma dePlayerMapy guárdala en una variableWeaponTier; a continuación, pasaWeaponTiery una referencia al jugador para llamar aGrantWeapon.OnPlayerSpawn(InPlayer : agent) : void = Print("¡Se generó un jugador!") if(WeaponTier := PlayerMap[InPlayer]): GrantWeapon(option{InPlayer}, WeaponTier) Print("El jugador que apareció recibió una pistola de nivel {WeaponTier}") -
Guarda la secuencia de comandos en Visual Studio Code, compílala y haz clic en Comenzar sesión en la barra de herramientas de UEFN para realizar una prueba de juego en el nivel. Cuando pruebas el nivel, deberías aparecer con la primera arma de la matriz
WeaponGranters. Comprueba este comportamiento en el registro.
Cómo mapear equipos de jugadores
Con el mapa de jugadores configurado, es útil pensar cómo comprobar el puntaje de un jugador. Como la secuencia de comandos promoverá automáticamente al jugador en el equipo con la menor cantidad de eliminaciones, no es útil comprobar el nivel de arma de los jugadores del equipo enemigo. Puedes ver que tenemos un problema ya que PlayerMap no diferencia entre equipos.
Para solucionarlo, puedes usar otro mapa. Para ello, adaptarás el PlayerMap que configuraste anteriormente en un sistema de mapa anidado. Dado que los pares clave-valor en un mapa pueden ser cualquier par de tipos, tiene sentido que la clave de equipo pueda tener otro mapa como valor. El primer mapa asociará equipos (clave) con otro mapa de jugadores en dicho equipo (valor). El mapa interno asociará jugadores (clave) con sus puntajes (valor).
Para un jugador determinado, puedes verificar en cuál equipo está con GetTeam(). A partir de allí, puedes recuperar una lista de compañeros de equipo para comparar contra el número de eliminaciones.
La sintaxis del mapa anidado [team][player]int puede no ser clara. Para facilitar su comprensión, puedes aprovechar un alias de tipo para crear un nombre simple para hacer referencia al mapa. En este tutorial, otorgarás a [player]int el alias player_map. Esto significa que puedes usar el nombre player_map siempre que necesites [player]int, y el mapa anidado puede reescribirse como [team]player_map o un mapa que asocie equipos con mapas de jugadores.
Realiza estos pasos para adaptar el mapa a un sistema de mapa anidado:
-
Arriba de la definición de clase
team_elimination_game, añade un alias para[player]intdenominadoplayer_map.player_map := [player]int # ¡Este es un alias de tipo! team_elimination_game := class(creative_device): -
Reemplaza la variable
PlayerMapque definiste anteriormente enteam_elimination_gamepor una nueva variableTeamMapde tipo[team]player_map.# Mapa de mapas de equipos, donde la clave es el equipo y el valor es # un mapa de pares clave-valor jugador ->entero. var TeamMap : [team]player_map = map{} -
Como el valor de
TeamMapes del tipoplayer_map, para cada equipo, necesitas inicializar un mapa de jugadores, completarlos, establecer la puntuación de cada jugador en0y luego asignar el mapa de jugadores aTeamMap. ModificaPopulateTeamsAndPlayers()con el código actualizado.- Para cada equipo, recupera los jugadores de dicho equipo y guárdalos en una variable
TeamPlayers. Inicializa una nueva variablePlayerMapdel tipoplayer_mappara asignar a los puntajes de cada jugador.
PopulateTeamsAndPlayers() : void= Print("Comenzando a popular jugadores") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {}- Para cada jugador en
TeamPlayers, recuperaFortCharacterde dicho jugador y guárdalo en una variableFortCharacter. Define el puntaje del jugador enPlayerMapen0para representar la primera arma en la matrizWeaponGranters, y luego suscribeFortCharacter.EliminatedEvent()aOnPlayerEliminated.
PopulateTeamsAndPlayers() : void = Print("Comenzando a popular jugadores") 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("Jugador asignado al PlayerMap con Nivel {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated)- Para finalizar, establece
PlayerMapcomo el valor de la claveTeamactual enTeamMap. Tu códigoPopulateTeamsAndPlayersdebería verse de la siguiente manera.
PopulateTeamsAndPlayers() : void = Print("Comenzando a popular jugadores") 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("Jugador asignado al PlayerMap con Nivel {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) if(set TeamMap[Team] = PlayerMap): Print("Se configuró correctamente a este equipo en el TeamMap") - Para cada equipo, recupera los jugadores de dicho equipo y guárdalos en una variable
-
Una vez que hayas definido
TeamMap, actualizaOnPlayerSpawnpara acceder al equipo de un jugador conGetTeam[]y guárdalo en una variable localPlayerTeam. Recupera la puntuación actual del jugador deTeamMapmediantePlayerTeamy una referencia al jugador para definirWeaponTier.OnPlayerSpawn()actualizado debería ser similar al siguiente código.OnPlayerSpawn(InPlayer : agent) : void = Print("¡Se generó un jugador!") if: PlayerTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer] WeaponTier:int := TeamMap[PlayerTeam][Player] then: GrantWeapon(option{InPlayer}, WeaponTier) Print("El jugador que apareció recibió una pistola de nivel {WeaponTier}")
Guarda la secuencia de comandos en Visual Studio Code, compílala y haz clic en Comenzar sesión en la barra de herramientas de UEFN para probar el nivel. Cuando pruebes el nivel, deberías aparecer con la primera arma de la matriz WeaponGranters. Comprueba este comportamiento en el registro.
Próximo paso
En el siguiente paso de este tutorial aprenderás cómo otorgar armas a los jugadores cuando realizan una eliminación.