Dieser letzte Schritt des Tutorials zeigt dir, wie du deinen Code verbessern kannst, und vermittelt dir dabei einige wichtige Verse-Konzepte.
Verbessere deine Verse-Code
Dieser Abschnitt führt dich Schritt für Schritt durch die Codeänderungen, aber wenn du deine Arbeit überprüfen möchtest, schau dir den Abschnitt Vollständiger Code an, um das Endergebnis zu sehen.
Umgestalten ist ein Prozess, bei dem du vorhandenen Code umstrukturierst, um das Design oder die Implementierung zu verbessern, ohne sein Verhalten zu ändern. Die folgenden Ziele werden am häufigsten beim Umgestalten deines Codes verfolgt:
Verbessern der Lesbarkeit durch bessere Variablenbenennung, bessere Abstände oder eine bessere allgemeine Codestruktur
Verbessern der Performance durch einfachere oder effizientere Implementierung von Verhalten
Reduzieren von Wiederholungen und aufgeblähtem Code (umfangreicher, unnötiger oder übermäßig komplexer Code), indem du ähnliche Funktionen zu einer einzigen Funktion zusammenfasst oder mehrere Variablen ähnlichen Typs und Zwecks in Containern wie Arrays sammelst
Durch Umgestalten gemäß diesen Zielen kannst du Code schreiben, der gut zu pflegen, leicht zu lesen und zu überarbeiten ist und der erweiterbar ist, sodass sich die Funktionen für zukünftige Verbesserungen des Verhaltens leicht erweitern lassen. So bringst du deine Spiele wirklich auf ein neues Level!
GetFirstPlayer()
Lesbaren Code zu schreiben ist eine gute Programmierpraxis. Beispielsweise ist GetFirstPlayer() klarer als GetPlayspace().GetPlayers()[0]. Darüber hinaus ist dieser Ansatz eine Best Practice zum Programmieren gängiger Operationen, da er die Absicht der Operation klar zum Ausdruck bringt.
Öffne die Datei
shooting_range_manager_device.verse.Füge die Methode
GetFirstPlayerhinzu.Beachte, dass die Methode
GetFirstPlayerdie Effekt-Bezeichner <decides><transacts> enthält, da sie fehlschlagen und zurückgesetzt werden kann. Lies Fehlschlag in Verse, um mehr über fehlbare Ausdrücke und Fehlerkontexte zu erfahren.Verse# Returns the first player in the playspace. GetFirstPlayer()<decides><transacts>:player= return GetPlayspace().GetPlayers()[0]Ändere die Methode
AdjustScore, um die neue MethodeGetFirstPlayerzu verwenden.Beachte, dass die Methode
GetFirstPlayermit eckigen Klammern statt mit runden Klammern aufgerufen wird, da sie fehlschlagen kann.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 --- #>Ändere die Methode
IncreaseWeaponLevel, um die neue MethodeGetFirstPlayerzu verwenden.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 --- #>
Ziel-Klassen-Wrapper und -Arrays
Ein weiteres wichtiges Ziel beim Bereinigen von Code ist die Minimierung von Duplikaten. In der aktuellen Implementierung definiert jedes gute und schlechte Ziel sein eigenes Callback- und Treffer-Flag, wodurch der Code sich wiederholt.
Ein besserer Ansatz besteht darin, eine Wrapper-Klasse zu erstellen, die alles enthält, was ein einzelnes Ziel benötigt. Der Schießstandmanager kann diese Ziel-Wrapper dann in einem Array verwalten, anstatt jede Komponente einzeln zu definieren.
Das reduziert nicht nur die Duplizierung, sondern verbessert auch die Skalierbarkeit. Du kannst beliebig viele Ziele hinzufügen, ohne zusätzlichen Code zu schreiben.
Definiere die Klasse
good_target_wrapper. Du kannst dies über deine Klassendefinitionshooting_range_manager_devicesetzen.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.Definiere die Klasse
bad_target_wrapper. Du kannst dies über deine Klassendefinitionshooting_range_manager_devicesetzen.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.Füge deinem Schießstandmanager-Gerät die folgenden Array-Eigenschaften hinzu.
Verse@editable: GoodTargets:[]good_target_wrapper = array{} @editable BadTargets:[]bad_target_wrapper = array{}Entferne Folgendes aus deinem Schießstandmanager-Gerät. Diese werden nun von den Wrapper-Klassen verarbeitet.
GoodTarget1-3
GoodTargetScore
BadTarget1-3
BadTargetScore
HitGoodTarget1-3
OnGoodTarget1-3Hit()
OnBadTarget1-3Hit()
Ändere die Methode
OnBegin, um die guten und schlechten Ziele durch Durchlaufen des Arrays zu initialisieren.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.Ändere die Methode
CheckCombo, um die Beendigung der Kombo zu überprüfen, indem du das Array „Gutes Ziel“ durchläufst.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?): returnAktualisiere die Methode
ResetCombo, um das Array „Gutes Ziel“ zu durchlaufen.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 --- #>Speichere und erstelle deinen Verse-Code.
Vollständiger Code
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:
Alles kommt zusammen
Du musst neue Werte für die geänderten bearbeitbaren Eigenschaften auf deinem Verse-Gerät festlegen.
Wähle shooting_range_manager_device im Viewport oder Outliner-Panel aus.
Lege im Details-Panel die folgenden Parameter fest:
Füge drei Elemente zum Array GoodTargets hinzu und lege jedes Element auf sein jeweiliges Ziel fest. Optional kannst du jetzt auch den Punktwert eines einzelnen Ziels ändern.
Füge drei Elemente zum Array BadTargets hinzu und lege jedes Element auf sein jeweiliges Ziel fest. Optional kannst du jetzt auch den Punktwert eines einzelnen Ziels ändern.
Überprüfe, ob alle anderen Eigenschaften wie erwartet festgelegt sind.
Du bist am Zug
Dieser Abschnitt ist zu Ende, aber du musst nicht aufhören. Weitere Informationen zur Funktionalität von Verse und zum Gameplay findest du in der Dokumentation unter Erfahre mehr über Spielmechaniken.