In quest'ultimo passaggio del tutorial vedrai come migliorare il codice, imparando allo stesso tempo alcuni importanti concetti di Verse.
Migliora il tuo codice Verse
Questa pagina ti guida passo dopo passo attraverso le modifiche al codice; tuttavia, se desideri controllare il tuo lavoro, rivedi la sezione
Il refactoring è un processo mediante il quale si ristruttura il codice esistente per migliorarne la progettazione o l'implementazione, senza modificarne il comportamento. Di seguito sono riportati gli obiettivi più comuni durante il refactoring del codice:
Ottimizza la leggibilità con una migliore denominazione delle variabili, spaziatura o struttura generale del codice.
Migliora le prestazioni con un'implementazione più semplice o più efficiente del comportamento.
Riduci le ripetizioni e il codice bloat (codice lungo, non necessario o eccessivamente complesso), condensando funzioni simili in una singola o raccogliendo più variabili di tipo e scopo simili in contenitori come array.
Il refactoring basato su questi obiettivi dovrebbe aiutarti a scrivere codice facile da aggiornare, leggere e rivedere, nonché estensibile, ovvero con possibilità di estendere facilmente le diverse capacità per migliorare il comportamento in futuro. Porta la tua esperienza di gioco a livelli inediti!
GetFirstPlayer()
Scrivere codice leggibile è un'ottima pratica di programmazione. Ad esempio, scrivere GetFirstPlayer() è più chiaro di GetPlayspace().GetPlayers()[0]. Inoltre, questo approccio rappresenta una buona pratica per la programmazione di operazioni comuni, poiché indica chiaramente l'intento dell'operazione.
Apri il file
shooting_range_manager_device.verse.Aggiungi il metodo
GetFirstPlayer.Tieni presente che il metodo
GetFirstPlayerpresenta gli specificatori di effetto <decides><transacts> perché può fallire e passare al rollback. Leggi Errore in Verse per maggiori dettagli sulle espressioni fallibili e sui contesti di errore.Verse# Returns the first player in the playspace. GetFirstPlayer()<decides><transacts>:player= return GetPlayspace().GetPlayers()[0]Modifica il metodo
AdjustScoreper usare il nuovo metodoGetFirstPlayer.Tieni presente che il metodo
GetFirstPlayerviene chiamato con parentesi quadre, anziché con parentesi tonde, perché può non riuscire.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 il metodo
IncreaseWeaponLevelper usare il nuovo metodoGetFirstPlayer.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 --- #>
Wrapper di classe bersaglio e array
Un altro obiettivo fondamentale, quando si ripulisce il codice, è ridurre al minimo la duplicazione. Nell'implementazione attuale, ogni Bersaglio corretto ed errato definisce il proprio flag di callback e colpo, rendendo il codice ripetitivo.
Un approccio migliore consiste nel creare una classe wrapper che contenga tutto ciò di cui un singolo bersaglio ha bisogno. Il gestore del poligono di tiro può quindi gestire i wrapper di bersagli in un array, anziché definire ogni componente singolarmente.
Ciò non solo riduce le duplicazioni, ma migliora anche la scalabilità. Puoi aggiungere tutti i bersagli che desideri senza dover scrivere codice aggiuntivo.
Definisci la classe
good_target_wrapper. Puoi inserirlo sopra la definizione della classeshooting_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.Definisci la classe
bad_target_wrapper. Puoi inserirlo sopra la definizione della classeshooting_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.Aggiungi le seguenti proprietà array al tuo dispositivo di gestione del poligono di tiro.
Verse@editable: GoodTargets:[]good_target_wrapper = array{} @editable BadTargets:[]bad_target_wrapper = array{}Rimuovi quanto segue dal tuo dispositivo di gestione del poligono di tiro. Da adesso in poi queste operazioni vengono gestite dalle classi wrapper.
GoodTarget1-3
GoodTargetScore
BadTarget1-3
BadTargetScore
HitGoodTarget1-3
OnGoodTarget1-3Hit()
OnBadTarget1-3Hit()
Modifica il metodo
OnBeginper inizializzare il Bersaglio corretto e quello errato eseguendo un ciclo nell'array.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 il metodo
CheckComboper verificare il completamento della combo eseguendo un ciclo nell'array Bersaglio corretto.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?): returnAggiorna il metodo
ResetComboper eseguire un ciclo nell'array Bersaglio corretto.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 --- #>Salva e crea il tuo codice Verse.
Codice 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:
Unisci tutti gli elementi
È necessario impostare nuovi valori per le proprietà modificabili cambiate sul dispositivo Verse.
Seleziona shooting_range_manager_device nella viewport o nel pannello Outliner.
Nel pannello Dettagli imposta i seguenti parametri:
Aggiungi tre elementi all'array GoodTargets e imposta ciascuno sui rispettivi bersagli. Puoi anche modificare in modo facoltativo il valore del punteggio di un singolo bersaglio.
Aggiungi tre elementi all'array BadTargets e imposta ciascuno sui rispettivi bersagli. Ora puoi anche modificare facoltativamente il valore del punteggio di un singolo bersaglio.
Verifica che tutte le altre proprietà siano impostate come previsto.
Ora tocca a te
Questa sezione è terminata, ma se lo desideri puoi scoprire ancore molto altro. Per esplorare le altre funzionalità e il gameplay di Verse, consulta la documentazione in Scopri le meccaniche di gioco.