Vas a utilizar un mapa para registrar el número de eliminaciones que ha conseguido un jugador. Los mapas proporcionan una práctica asociación de claves a valores, y en este tutorial utilizarás el jugador como clave y su nivel de armas asociado (representado como un entero) como valor. De este modo, puedes recuperar el nivel actual de un jugador solo con una referencia al jugador. A continuación se ofrece un ejemplo de cómo podría ser un mapa de asociaciones de niveles entre jugadores y armas.
| Clave | jugador 1 | jugador 2 | jugador 3 |
| Valor | 1 | 2 | 2 |
| Arma en la partida | Pistola de combate L1 | Pistola de mecha L1 | Pistola de mecha L1 |
Sigue estos pasos para configurar y rellenar tu mapa de jugadores:
-
Añade el mapa
[player]intnombradoPlayerMapa la claseteam_elimination_game. Almacena una referencia a cada jugador y a su nivel de armas.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("Empezando a rellenar con jugadores") -
Añade un nuevo método,
OnPlayerEliminated, a la claseteam_elimination_game. Se ejecuta cada vez que se elimina a un jugador, y determinará quién es el jugador eliminado accediendo a la estructuraelimination_resultpasada como argumento.OnPlayerEliminated(Result : elimination_result) : void= Print("¡Se ha eliminado un jugador!") -
Cuando empiece la partida, tienes que recorrer la lista de jugadores y ponerlos a todos en el primer nivel de armas. Dentro de
PopulateTeamsAndPlayers, obtén todos los jugadores utilizandoGetPlaySpace().GetPlayers()y guárdalos en una matrizAllPlayers. Para cada jugador, recupera elFortCharacterde ese jugador y guárdalo en una variableFortCharacter. Pon a 0 la puntuación de ese jugador en elPlayerMappara que represente la primera arma de la matrizWeaponGranters; luego suscribeFortCharacter.EliminatedEvent()aOnPlayerEliminated.AllPlayers := GetPlayspace().GetPlayers() para (Agent : AllPlayers, TeamPlayer := player[Agent], FortCharacter := TeamPlayer.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Jugador asignado al mapa de jugadores con el nivel {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) -
Con una referencia a la puntuación del jugador en el conjunto
PlayerMap, puedes conceder a los jugadores su primera arma. ModificaOnPlayerSpawnpara conceder a los jugadores su primera arma. Cuando aparece un jugador, recupera su nivel de armas delPlayerMapy guárdalo en una variableWeaponTier, luego llama aGrantWeaponpasándoleWeaponTiery una referencia al jugador.OnPlayerSpawn(InPlayer : agent) : void = Print("¡Acaba de aparecer un jugador!") if(WeaponTier := PlayerMap[InPlayer]): GrantWeapon(option{InPlayer}, WeaponTier) Print("Al jugador generado se le ha concedido un arma de nivel {WeaponTier}") -
Guarda la secuencia de comandos en Visual Studio Code, compílala y haz clic en Iniciar sesión en la barra de herramientas de UEFN para probar el nivel. Cuando pruebes tu nivel, deberías aparecer con la primera arma de la matriz
WeaponGranters. Comprueba este comportamiento con el registro.
Cómo asignar equipos de jugadores
Con tu mapa de jugadores configurado, es útil pensar en cómo compruebas la puntuación de un jugador. Como tu secuencia de comandos ascenderá automáticamente al jugador del equipo con menos eliminaciones, no resulta útil comprobar el nivel de armas de los jugadores del equipo enemigo. Ya puedes ver que está surgiendo un problema, puesto que PlayerMap no distingue entre equipos.
Para evitar este problema puedes utilizar otro mapa. Para ello, adaptarás el PlayerMap que configuraste anteriormente en un sistema de mapas anidados. Como los pares clave-valor de un mapa pueden ser cualquier par de tipos, tiene sentido que la clave de un equipo pueda tener como valor otro mapa. El primer mapa asociará equipos (clave) a otro mapa de jugadores de ese equipo (valor). El mapa interior asociará los jugadores (clave) a su puntuación (valor).
Ahora, dado un jugador, puedes comprobar en qué equipo está utilizando GetTeam(). Desde ahí puedes recuperar una lista de compañeros de equipo para comparar el número de eliminaciones.
Puede que la sintaxis del mapa anidado [team][player]int no esté clara. Para que esto sea más fácil de entender, puedes aprovechar el alias de tipos para crear un nombre más sencillo que haga referencia al mapa. En este tutorial darás a [player]int el alias de player_map. Esto significa que puedes utilizar 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 a mapas de jugadores.
Sigue estos pasos para adaptar tu mapa a un sistema de mapas anidados:
-
Encima de la definición de la clase
equipo, añade un atajo para[player]intllamadoplayer_map.player_map := [player]int # Esto es un alias de tipo. team_elimination_game := class(creative_device): -
Sustituye la variable
PlayerMapque configuraste antes enequipopor una nueva variableTeamMapde tipo[equipo]player_map.# Mapa de mapas de equipos, donde la clave es el equipo y el valor es un mapa de # pares clave-valor player->int var TeamMap : [team]player_map = map{} -
Como el valor de
TeamMapes del tipoplayer_map, para cada equipo, tienes que inicializar un mapa de jugadores, propagarlos, establecer (definir) la puntuación de cada jugador en0, y luego asignar el mapa de jugadores. aTeamMap. ModificaPopulateTeamsAndPlayers()con el código actualizado.- Para cada equipo, recupera los jugadores de ese equipo y almacénalos en una variable
TeamPlayers. Inicializa una nueva variablePlayerMapde tipoplayer_mappara asignar jugadores a su puntuación.
PopulateTeamsAndPlayers() : void= Print("Empezando a rellenar con jugadores") para (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {}- Para cada jugador de
TeamPlayers, recupera elFortCharacterde ese jugador y guárdalo en una variableFortCharacter. Pon a0la puntuación de ese jugador en elPlayerMappara que represente la primera arma de la matrizWeaponGranters; luego suscribeFortCharacter.EliminatedEvent()aOnPlayerEliminated.
PopulateTeamsAndPlayers() : void = Print("Empezando a rellenar con jugadores") para (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} para (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Jugador asignado al mapa de jugadores con el nivel {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated)- Por último, establece
PlayerMapcomo el valor de la clave actualTeamenTeamMap. Tu códigoPopulateTeamsAndPlayersdebe ser como el siguiente.
PopulateTeamsAndPlayers() : void = Print("Empezando a rellenar con jugadores") para (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} para (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Jugador asignado al mapa de jugadores con el nivel {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) if(set TeamMap[Team] = PlayerMap): Print("Este equipo está configurado correctamente en el TeamMap") - Para cada equipo, recupera los jugadores de ese equipo y almacénalos en una variable
-
Una vez que hayas configurado el
TeamMap, actualizaOnPlayerSpawnpara acceder al equipo de un jugador medianteGetTeam[]y guárdalo en una variable localPlayerTeam. EstableceWeaponTierrecuperando la puntuación actual del jugador delTeamMap, utilizando tantoPlayerTeamcomo una referencia al jugador. El código actualizado deOnPlayerSpawn()debería ser como el siguiente.OnPlayerSpawn(InPlayer : agent) : void = Print("¡Acaba de aparecer un jugador!") if: PlayerTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer] WeaponTier:int := TeamMap[PlayerTeam][InPlayer] then: GrantWeapon(option{InPlayer}, WeaponTier) Print("Al jugador generado se le ha concedido un arma de nivel {WeaponTier}")
Guarda la secuencia de comandos en Visual Studio Code, compílala y haz clic en Abrir sesión en la barra de herramientas de UEFN para poner a prueba el nivel. Cuando pruebes tu nivel, deberías aparecer de nuevo con la primera arma de la matriz WeaponGranters. Comprueba este comportamiento con el registro.
Siguiente paso
En el siguiente paso de este tutorial, aprenderás a conceder armas a los jugadores cuando consigan una eliminación.