Cómo configurar los equipos
En esta sección, aprenderás a configurar los equipos de cazadores y de elementos al inicio de la partida y a teletransportarlos a sus zonas de arranque.
Esta página incluye fragmentos de Verse que muestran cómo ejecutar las mecánicas de juego necesarias. Sigue los pasos que se indican a continuación y copia la secuencia de comandos completa del paso 6 de este tutorial.
Sigue estos pasos para configurar correctamente tus equipos:
-
Crea una nueva función SetupTeams(). Aquí configurarás múltiples suscripciones a funciones que definirás más adelante, como funciones para cuando se elimina un elemento o qué hacer cuando un jugador se une a la partida.
# Cuando se inicia una ronda, suscríbete a los dispositivos de los equipos, elige aleatoriamente a los agentes cazadores, activa el cronómetro del cazador, configura los agentes de elementos y teletranspórtalos a la zona de juego. SetUpTeams()<suspends>:void = Logger.Print("Configurando los equipos.") -
Primero suscríbete al SuccessEvent del cronómetro de puntuación del equipo de elementos, al evento Eliminated del TeamManager del equipo de elementos y establece la puntuación concedida del gestor de puntuaciones.
# Cuando se inicia una ronda, suscríbete a los dispositivos de los equipos, elige aleatoriamente a los agentes cazadores, activa el cronómetro del cazador, configura los agentes de elementos y teletranspórtalos a la zona de juego. SetUpTeams()<suspends>:void = Logger.Print("Configurando los equipos.") # Suscríbete al cronómetro de puntuación del equipo de elementos, establece el premio de puntuación y suscríbete al evento eliminado del equipo de elementos. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Se produce cuando se elimina un agente de elementos. -
A continuación, haz lo mismo con el equipo de cazadores. A continuación, ajusta el cronómetro de espera del equipo de cazadores al retraso de aparición que desees para los cazadores.
# Cuando se inicia una ronda, suscríbete a los dispositivos de los equipos, elige aleatoriamente a los agentes cazadores, activa el cronómetro del cazador, configura los agentes de elementos y teletranspórtalos a la zona de juego. SetUpTeams()<suspends>:void = Logger.Print("Configurando los equipos.") # Suscríbete al cronómetro de puntuación del equipo de elementos, establece el premio de puntuación y suscríbete al evento eliminado del equipo de elementos. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Se produce cuando se elimina un agente de elementos. # Suscríbete al cronómetro de espera del equipo de cazadores y establece la duración. Además, suscríbete al evento de eliminación del equipo de cazadores. HunterTeam.WaitTimer.SuccessEvent.Subscribe(HuntersGo) HunterTeam.WaitTimer.SetMaxDuration(HunterTeam.SpawnDelay) HunterTeam.TeamManager.EnemyEliminatedEvent.Subscribe(OnHunterEliminated) # Se produce cuando un agente cazador elimina un agente de elementos. -
Todavía dentro de
SetupTeams(), inicializa las matrices de agentes cazadores y de elementos iniciales y, a continuación, activa el HUD de espera mientras compruebas si hay suficientes jugadores para empezar la partida. Si los hay, desactiva el HUD de espera.# Inicializa las matrices de agentes cazadores y de elementos iniciales. Obtén los jugadores y averigua el número de jugadores que hay en el servidor. var StartingHunterAgents:[]agent = array{} var StartingPropAgents:[]agent = array{} var Players:[]player = GetPlayspace().GetPlayers() # Activa el HUD adecuado para esperar a los jugadores. HUDControllerWaiting.Enable() # Comprueba si hay suficientes jugadores para empezar la ronda. set Players = WaitingForMorePlayers.WaitForMinimumNumberOfPlayers(Players) Logger.Print("Ronda iniciada.") # Desactiva el HUD de espera para utilizar el siguiente HUD de mayor prioridad. HUDControllerWaiting.Disable() -
Ahora que la ronda ha comenzado, tienes que ocuparte de lo que ocurre cuando un jugador se une o se retira de la partida. Aquí configurarás las suscripciones y definirás estas funciones más adelante.
# Ahora que la ronda ha comenzado, tenemos que gestionar los jugadores que se añaden o eliminan de la partida. Suscríbete a esos eventos. GetPlayspace().PlayerAddedEvent().Subscribe(OnPlayerAdded) GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved) -
El número de cazadores iniciales depende de cuántos jugadores haya en tu partida. No te interesa que un cazador tenga que enfrentarse a diez jugadores, así que establece una función que fije el número de cazadores basándose en una fórmula. Convierte el número de jugadores en un valor float para utilizarlo en la fórmula.
# Calcula el número de agentes cazadores iniciales de la partida en función del recuento de jugadores y del número de agentes cazadores por número de jugadores. NumberOfPlayers:float = 1.0 * Players.Length # Convierte Players.Length en un valor float para poder utilizarlo en la siguiente función Ceil. -
Ahora ajusta el número de cazadores iniciales al tope de la siguiente fórmula. A continuación, mezcla la matriz de todos los jugadores, ya que quieres que los cazadores iniciales se elijan al azar de la lista de jugadores.
# Calcula el número de agentes cazadores iniciales de la partida en función del recuento de jugadores y del número de agentes cazadores por número de jugadores. NumberOfPlayers:float = 1.0 * Players.Length # Convierte Players.Length en un valor float para poder utilizarlo en la siguiente función Ceil. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Mezcla los jugadores y luego corta la matriz para obtener los agentes cazadores iniciales. Los jugadores restantes son los agentes de elementos iniciales. var RandomizedPlayers:[]agent = Shuffle(Players) -
Corta la matriz aleatoria a un tamaño comprendido entre 0 y tu número de cazadores iniciales. Este será el equipo inicial del cazador, así que ajústalo en StartingHunterAgents. El resto de los jugadores serán el equipo de elementos inicial, así que configúralos como StartingPropAgents.
# Calcula el número de agentes cazadores iniciales de la partida en función del recuento de jugadores y del número de agentes cazadores por número de jugadores. NumberOfPlayers:float = 1.0 * Players.Length # Convierte Players.Length en un valor float para poder utilizarlo en la siguiente función Ceil. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Mezcla los jugadores y luego corta la matriz para obtener los agentes cazadores iniciales. Los jugadores restantes son los agentes de elementos iniciales. var RandomizedPlayers:[]agent = Shuffle(Players) if (set StartingHunterAgents = RandomizedPlayers.Slice[0,NumberOfStartingHunters]) {} if (set StartingPropAgents = RandomizedPlayers.Slice[NumberOfStartingHunters,RandomizedPlayers.Length]) {} # Itera por los agentes cazadores iniciales y asígnalos al equipo de cazadores. A continuación, inicia el cronómetro de espera del cazador. Logger.Print("Configurando {StartingHunterAgents.Length} agente(s) cazador(es).") for (StartingHunterAgent : StartingHunterAgents): HunterTeam.InitializeAgent(StartingHunterAgent) HunterTeam.WaitTimer.Start() # Itera por los agentes de elementos iniciales y asígnalos al equipo de elementos. Teletranspórtalos a la zona de juego. Logger.Print("Configurando {StartingPropAgents.Length} agente(s) de elementos.") -
Con los equipos configurados, activa el teletransportador de la sala para teletransportar los elementos fuera de la sala de inicio, y activa su latido. Luego desactiva el teletransportador de la sala, ya que no lo necesitas después de esto. Por último, establece el número de elementos restantes en PropsRemainingTracker en función del tamaño del equipo de elementos.
LobbyTeleporter.Enable() for (StartingPropAgent : StartingPropAgents): PropTeam.InitializeAgent(StartingPropAgent) PropTeam.HeartBeat.SetUpUI(StartingPropAgent) LobbyTeleporter.Activate(StartingPropAgent) LobbyTeleporter.Disable() # Establece los valores de Target y Value del rastreador de elementos restantes en el número actual de elementos. # En el futuro, solo actualizaremos Value a medida que se eliminen elementos. PropTeam.PropsRemainingTracker.SetTarget(PropTeam.Count()) PropTeam.UpdatePropsRemainingTracker()
Cómo gestionar las eliminaciones de los jugadores
Los cazadores ganan eliminando todos los elementos y convirtiéndolos en cazadores. Sigue estos pasos para conceder a los cazadores una puntuación cuando se elimina un elemento y para transferir los elementos eliminados al equipo de cazadores.
-
Crea una función nombrada OnHunterEliminated(). Antes has suscrito el dispositivo del gestor de equipos de cazadores EnemyEliminatedEvent, así que se activará siempre que un cazador elimine un elemento.
# Cuando un agente cazador elimina a un agente de elementos, se concede una puntuación. La puntuación se divide por el número de agentes de elementos restantes. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("El agente cazador ha eliminado a un agente de elementos.") -
Primero tienes que otorgar a los cazadores una puntuación proporcional al número de agentes de elementos que queden. Crea una variable
EliminationAwardque sea igual aMaxEliminationScoredividido entrePropTeamSize. Ajusta el gestor de puntuaciones del equipo de cazadores a esa puntuación y luego premia al cazador que marcó la eliminación.# Cuando un agente cazador elimina a un agente de elementos, se concede una puntuación. La puntuación se divide por el número de agentes de elementos restantes. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("El agente cazador ha eliminado a un agente de elementos.") PropTeamSize := PropTeam.Count() if (EliminationAward := Floor(HunterTeam.MaxEliminationScore / PropTeamSize)): Logger.Print("Concediendo {EliminationAward} puntos.") HunterTeam.ScoreManager.SetScoreAward(EliminationAward HunterTeam.ScoreManager.Activate(HunterAgent) -
También tienes que ocuparte de lo que le ocurre al equipo de elementos cuando se elimina un elemento. Crea una función nombrada OnPropEliminated(). Al igual que con OnHunterEliminated(), te has suscrito a esta función anteriormente. Cuando se elimina un elemento, tienes que retirarlo del equipo de elementos mediante la función EliminateAgent() de PropTeam y luego inicializarlo como cazador con la función InitializeAgent() de HunterTeam.
# Cuando un agente de elementos sea eliminado, retira el elemento del equipo de elementos, comprueba si ha terminado la ronda y configúralo como cazador. OnPropEliminated(PropAgent:agent):void = Logger.Print("Agente de elementos eliminado.") spawn{ PropTeam.EliminateAgent(PropAgent) } HunterTeam.InitializeAgent(PropAgent)
Cómo gestionar la entrada y la salida de jugadores
Cuando un jugador se une a la partida a mitad de la ronda, querrás que aparezca como cazador.
-
Crea una función OnPlayerAdded() para ello. Esta función solo inicializa al jugador que se une como cazador.
# Cuando un jugador se une a la partida a mitad de la ronda, conviértelo en cazador. OnPlayerAdded(Player:player):void = Logger.Print("Un jugador se ha unido a la partida.") HunterTeam.InitializeAgent(Player) -
Que los jugadores abandonen la partida es un poco más complicado. Si un jugador abandona la partida, tenemos que eliminarlo del equipo en el que está y también comprobar si su abandono provoca el fin de la partida. Esto puede deberse a que el jugador que se marcha era el último elemento o el único cazador. De esta lógica se encargan las funciones EliminateAgent() de cada equipo, por lo que generarás una instancia de ellas en función del equipo al que perteneciera el jugador eliminado.
# Cuando un jugador abandona la partida, comprueba en qué equipo estaba y luego comprueba el final de ronda. OnPlayerRemoved(Player:player):void= Logger.Print("Un jugador ha abandonado la partida.") if (PropTeam.FindOnTeam[Player]): Logger.Print("El jugador era un elemento.") spawn{ PropTeam.EliminateAgent(Player) } if (HunterTeam.FindOnTeam[Player]): Logger.Print("El jugador era un cazador.") spawn{ HunterTeam.EliminateAgent(Player) }
Final de la ronda
Una vez configurados todos los equipos, tienes que controlar el tamaño de cada equipo para comprobar el final de la ronda. La partida termina cuando uno de los dos equipos se vacía o cuando se acaba el tiempo de la ronda, por lo que utilizarás una expresión race para ver qué sucede primero.
-
Al final de tu función OnBegin(), en una expresión
race, aplica Await() tanto a TeamEmptyEvent del equipo de cazadores y elementos, como a la función AwaitEnd() de RoundTimer. Cuando termine la carrera, llama a la función EndRound() que definirás en el siguiente paso.# Cuando no queden más elementos o agentes cazadores (lo que ocurra primero), o el cronómetro de la ronda termine, o la ronda termine race: PropTeam.TeamEmptyEvent.Await() HunterTeam.TeamEmptyEvent.Await() RoundTimer.AwaitEnd() Logger.Print("La ronda va a terminar.") EndRound() -
En la función EndRound(), tienes que desactivar el sensor de latidos para cada jugador del equipo de elementos y llamar a EndRound() en el dispositivo RoundSettings. Como la función EndRound() del dispositivo RoundSettings requiere que se pase un jugador, obtén el primer jugador de la matriz Players y pásalo como instigador.
# Limpia los efectos visuales de latidos y termina la ronda. EndRound():void= PropTeam.HeartBeat.DisableAll() # Haz que cualquier jugador pase a EndRound. Players:[]player = GetPlayspace().GetPlayers() if (RoundEndInstigator := Players[0]): Logger.Print("Ronda finalizada.") RoundSettings.EndRound(RoundEndInstigator)