El último paso del tutorial te enseña cómo puedes mejorar el código a la vez que aprendes algunos conceptos importantes de Verse.
Cómo mejorar tu código de Verse
En esta página encontrarás instrucciones paso a paso sobre los cambios que debes realizar en el código. No obstante, si deseas revisar tu trabajo, consulta la sección Código completo para ver el resultado final.
La refactorización es un proceso mediante el cual se reestructura el código existente con el objetivo de mejorar el diseño o la implementación sin alterar su comportamiento. A continuación se enumeran los objetivos más comunes a la hora de refactorizar el código:
Mejorar la legibilidad con nombres de variables más claros, un mejor espaciado o una estructura general de código más adecuada.
Mejorar el rendimiento con una implementación más sencilla o eficiente del comportamiento.
Reducir la repetición y la sobrecarga de código (código grande, innecesario o demasiado complejo) mediante la condensación de funciones similares en una sola o la agrupación de múltiples variables de tipo y finalidad similares en contenedores como matrices.
Refactorizar siguiendo estos objetivos te ayudará a escribir un código que sea fácil de mantener, leer y revisar, así como de extender, lo que facilitará la ampliación de sus capacidades para futuras mejoras en el comportamiento. ¡Así llevarás a tus juegos al siguiente nivel!
GetFirstPlayer()
Escribir código fácil de leer es una práctica de programación excelente. Por ejemplo, GetFirstPlayer() es más claro que GetPlayspace().GetPlayers()[0]. Además, este planteamiento constituye una práctica recomendada para programar operaciones comunes, ya que establece claramente la intención de la operación.
Abre el archivo
shooting_range_manager_device.verse.Añade el método
GetFirstPlayer.Fíjate en que el método
GetFirstPlayertiene los especificadores de efecto <decides><transacts> porque puede fallar y revertirse. Consulta la sección Error en Verse para obtener más información sobre las expresiones que pueden fallar y los contextos de error.Verse# Returns the first player in the playspace. GetFirstPlayer()<decides><transacts>:player= return GetPlayspace().GetPlayers()[0]Modifica el método
AdjustScorepara utilizar el nuevo métodoGetFirstPlayer.Fíjate en que el método
GetFirstPlayerse llama con corchetes en vez de con paréntesis porque puede fallar.Verse# Adjusts the player's score by the provided value. AdjustScore(Value:int):void= # Start the timer if it hasn't started yet. if (not IsTimerStarted?): StartTimer() # Sets the score award to the base value of the target multiplied by the current weapon level. ScoreManager.SetScoreAward(Value * CurrentWeaponLevel) <# --- New Code Start --- #>Modifica el método
IncreaseWeaponLevelpara utilizar el nuevo métodoGetFirstPlayer.Verse# Increases the player's weapon level by one (up to the maximum value). IncreaseWeaponLevel():void= if: # If able to retrieve the first player and current weapon level isn't maxed, then... <# --- New Code Start --- #> Player:player = GetFirstPlayer[] <# --- New Code End --- #>
Matrices y clases envoltorio de objetivos
Otro de los objetivos clave a la hora de optimizar el código es minimizar la duplicación. En la implementación actual, cada objetivo correcto e incorrecto define su propia devolución de llamada y su propio habilitador de impacto, lo que hace que el código sea repetitivo.
Un enfoque más adecuado consiste en crear una clase envoltorio que incluya todo lo que necesita un objetivo individual. El gestor de campo de tiro puede así gestionar estos envoltorios de objetivos en una matriz, en vez de definir cada componente por separado.
Esto no solo reduce la duplicación, sino que también mejora la capacidad de ampliación. Podrás añadir tantos objetivos como desees sin necesidad de escribir código adicional.
Define la clase
good_target_wrapper. Puedes colocar esto encima de la definición de tu claseshooting_range_manager_device.Verse# A wrapper class for the good targets to support array storage with a self-contained event callback. good_target_wrapper := class: @editable Target:shooting_range_target_track_device = shooting_range_target_track_device{} @editable Score:int = 100 # A circular reference to the shooting range manager device.Define la clase
bad_target_wrapper. Puedes colocar esto encima de la definición de tu claseshooting_range_manager_device.Verse# A wrapper class for the bad targets to support array storage with a self-contained event callback. bad_target_wrapper := class: @editable Target:shooting_range_target_device = shooting_range_target_device{} @editable Score:int = -100 # A circular reference to the shooting range manager device.Añade las siguientes propiedades de matriz a tu dispositivo gestor de campo de tiro.
Verse@editable: GoodTargets:[]good_target_wrapper = array{} @editable BadTargets:[]bad_target_wrapper = array{}Elimina lo siguiente de tu dispositivo gestor del campo de tiro. Ahora se gestionan mediante las clases envoltorio.
GoodTarget1-3
GoodTargetScore
BadTarget1-3
BadTargetScore
HitGoodTarget1-3
OnGoodTarget1-3Hit()
OnBadTarget1-3Hit()
Modifica el método
OnBeginpara inicializar los objetivos correctos e incorrectos mediante un bucle a través de la matriz.Verse# Runs when the device is started in a running game. OnBegin<override>()<suspends>:void= <# --- New Code Start --- #> # Initialize GoodTargets. for (GoodTarget : GoodTargets): GoodTarget.Init(Self) # Initialize BadTargets.Modifica el método
CheckCombopara comprobar la finalización del combo mediante un bucle a través de la matriz de objetivos correctos.Verse# If the combo is complete, enable the ComboTarget. CheckCombo():void= <# --- New Code Start --- #> # If any of the good targets are not hit, exit the function. for (GoodTarget : GoodTargets): if (not GoodTarget.IsHit?): returnActualiza el método
ResetCombopara ejecutar en bucle la matriz de objetivos correctos.Verse# Resets the combo tracking variables, re-enables all GoodTargets, and disables the ComboTarget. ResetCombo():void= <# --- New Code Start --- #> for (GoodTarget : GoodTargets): GoodTarget.Reset() <# --- New Code End --- #>Guarda y compila tu código de Verse.
Código completo
using { /Fortnite.com/Devices }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
<#>
Utility Classes
<#>
# A wrapper class for the good targets to support array storage with a self-contained event callback.
good_target_wrapper := class:
Cómo juntarlo todo
Debes establecer nuevos valores para las propiedades editables modificadas en tu dispositivo de Verse.
Selecciona shooting_range_manager_device en el visor o en el panel Esquematizador.
En el panel Detalles, configura los siguientes parámetros:
Añade tres elementos a la matriz GoodTargets y establece cada uno de ellos en sus respectivos objetivos. Además, si lo deseas, ahora también puedes cambiar el valor de puntuación de un objetivo individual.
Añade tres elementos a la matriz BadTargets y establece cada uno de ellos en sus respectivos objetivos. Además, si lo deseas, ahora también puedes cambiar el valor de puntuación de un objetivo individual.
Comprueba que todas las demás propiedades estén configuradas según lo esperado.
Por tu cuenta
Esta sección ha acabado, pero tú no tienes por qué hacerlo. Para obtener más información sobre la funcionalidad y la jugabilidad de Verse, consulta la documentación Aprendizaje de mecánicas de juego.