En este último paso del tutorial, descubrirás cómo mejorar tu código mientras aprendes algunos conceptos clave de Verse sobre la marcha.
Mejora tu código Verse
En esta página, se te guía paso a paso para realizar los cambios en el código, pero si quieres comprobar tu trabajo, consulta la sección Código completo para ver el resultado final.
Refactorizar es un proceso en el cual restructuras el código existente para mejorar el diseño o la implementación sin cambiar su comportamiento. A continuación te presentamos las metas más comunes al refactorizar el código:
Usar nombres más claros para tus variables, cuidar el espaciado y mejorar la estructura general de tu código para que todo sea más fácil de leer.
Mejorar el rendimiento gracias a una implementación más simple o más eficiente del comportamiento.
Reducir repeticiones y el código inflado (grande, innecesario o demasiado complejo) combinando funciones similares en una sola, o bien recopilando múltiples variables de un tipo y propósito similares en contenedores, por ejemplo, matrices.
Si refactorizas siguiendo estas metas, podrás escribir código que sea fácil de mantener, leer, revisar y además extensible, para que en el futuro puedas añadir nuevas funciones o mejoras en el comportamiento. ¡Lleva tus juegos al máximo nivel!
GetFirstPlayer()
Escribir código legible es una excelente práctica de programación. Por ejemplo, GetFirstPlayer() es más claro que GetPlayspace().GetPlayers()[0]. Además, este enfoque es 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.Observa que el método
GetFirstPlayertiene los especificadores de efecto <decides><transacts> porque puede fallar y revertir cambios. Lee Fallo en Verse para obtener información detallada sobre las expresiones falibles y los contextos de fallo.Verse# Returns the first player in the playspace. GetFirstPlayer()<decides><transacts>:player= return GetPlayspace().GetPlayers()[0]Modifica el método
AdjustScorepara usar el métodoGetFirstPlayernuevo.Observa que, para llamar al método
GetFirstPlayer, se utilizan corchetes en vez de paréntesis porque es falible.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 usar el métodoGetFirstPlayernuevo.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 --- #>
Contenedores y matrices de clase objetivo
Otra meta clave al limpiar código es minimizar la duplicación. En la implementación actual, cada objetivo bueno y malo define su propia devolución de llamada y bandera de acierto, lo que hace que el código sea repetitivo.
Un mejor enfoque es crear una clase de contenedor que contenga todo lo que necesita un objetivo individual. El administrador de la galería de tiro puede administrar estos contenedores de objetivos en una matriz, en lugar de definir cada componente de manera individual.
Esto no solamente reduce la duplicación, sino que también mejora la escalabilidad. Puedes añadir tantos objetivos como gustes, sin necesidad de escribir código adicional.
Define la clase
good_target_wrapper. Puedes poner esto encima de la definición de la 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 poner esto encima de la definición de la 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 al dispositivo administrador de la galería de tiro.
Verse@editable: GoodTargets:[]good_target_wrapper = array{} @editable BadTargets:[]bad_target_wrapper = array{}Elimina lo siguiente del dispositivo administrador de la galería de tiro. Estas propiedades ahora se controlan mediante las clases de contenedor.
GoodTarget1-3
GoodTargetScore
BadTarget1-3
BadTargetScore
HitGoodTarget1-3
OnGoodTarget1-3Hit()
OnBadTarget1-3Hit()
Modifica el método
OnBeginpara inicializar los objetivos buenos y malos recorriendo 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 recorriendo la matriz de objetivos buenos.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 recorrer la matriz de objetivos buenos.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 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:
Intégralo
Debes establecer valores nuevos para las propiedades editables modificadas en el dispositivo de Verse.
Selecciona shooting_range_manager_device en el visor o el panel del esquematizador.
En el panel de detalles, establece los siguientes parámetros:
Añade tres elementos a la matriz GoodTargets y establece cada uno en sus respectivos objetivos. De forma opcional, puedes cambiar el valor del puntaje de un objetivo individual ahora.
Añade tres elementos a la matriz BadTargets y establece cada uno en sus respectivos objetivos. De forma opcional, puedes cambiar el valor del puntaje de un objetivo individual ahora.
Verifica que todas las demás propiedades estén definidas según lo esperado.
Hazlo por tu cuenta
Esta sección ha concluido, pero tu aventura sigue. Para saber más sobre la jugabilidad y la funcionalidad de Verse, consulta la documentación en Aprende la mecánica del juego.