W ostatnim kroku samouczka dowiesz się, jak ulepszyć swój kod, i jednocześnie poznasz kilka ważnych pojęć związanych z Verse.
Doskonalenie kodu Verse
Na tej stronie przedstawiono szczegółowe instrukcje dotyczące zmian w kodzie, ale jeśli chcesz sprawdzić swoją pracę, zapoznaj się z sekcją Kompletny kod, aby zobaczyć ostateczny wynik.
Refaktoryzacja to proces, w którym przebudowuje się istniejący kod w celu poprawy projektu lub implementacji bez zmiany jego działania. Poniżej przedstawiono najczęstsze cele refaktoryzacji kodu:
Poprawa czytelności poprzez lepsze nazewnictwo zmiennych, lepsze rozmieszczenie odstępów lub ogólną strukturę kodu.
Poprawa wydajności dzięki prostszemu lub bardziej efektywnemu wdrażaniu zachowań.
Ograniczanie powtórzeń i nadmiaru kodu (obszernego, niepotrzebnego lub zbyt złożonego kodu) poprzez kondensowanie podobnych funkcji w jedną lub gromadzenie wielu zmiennych podobnego typu i przeznaczenia w kontenerach, takich jak tablice.
Refaktoryzacja zgodnie z tymi celami powinna pomóc w pisaniu kodu, który jest łatwy w utrzymaniu, czytelny i łatwy do ponownego przejrzenia, a także rozszerzalny, co ułatwia rozbudowę jego możliwości w celu przyszłych ulepszeń działania. Twoje gry naprawdę osiągną wyższy poziom!
GetFirstPlayer()
Pisanie czytelnego kodu to świetna praktyka programistyczna. Na przykład GetFirstPlayer() jest bardziej czytelny niż GetPlayspace().GetPlayers()[0]. Ponadto podejście to stanowi najlepszą praktykę w zakresie programowania typowych operacji, ponieważ jasno określa cel operacji.
Otwórz plik
shooting_range_manager_device.verse.Dodaj metodę
GetFirstPlayer.Zwróć uwagę, że metoda
GetFirstPlayerma specyfikatory efektów <decides><transacts>, ponieważ może zakończyć się niepowodzeniem i wycofaniem. Aby dowiedzieć się więcej na temat wyrażeń zawodnych i kontekstów niepowodzenia, patrz: Niepowodzenie w Verse.Verse# Returns the first player in the playspace. GetFirstPlayer()<decides><transacts>:player= return GetPlayspace().GetPlayers()[0]Zmodyfikuj metodę
AdjustScore, aby korzystała z nowej metodyGetFirstPlayer.Zwróć uwagę, że metoda
GetFirstPlayerjest wywoływana za pomocą nawiasów klamrowych zamiast okrągłych, ponieważ może zakończyć się niepowodzeniem.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 --- #>Zmodyfikuj metodę
IncreaseWeaponLevel, aby korzystała z nowej metodyGetFirstPlayer.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 --- #>
Otoki klas docelowych i tablice
Kolejnym kluczowym celem podczas czyszczenia kodu jest minimalizacja sytuacji, w których kod duplikuje się. W obecnej implementacji każdy właściwy i niewłaściwy cel definiuje własną funkcję wywołania zwrotnego i flagę trafienia, co powoduje powtarzalność kodu.
Lepszym podejściem jest stworzenie klasy otoki, która zawiera wszystko, czego potrzebuje poszczególny cel. Menedżer strzelnicy może następnie zarządzać tymi otokami celów w tablicy, zamiast definiować każdy komponent osobno.
To nie tylko ogranicza ilość zduplikowanych elementów, ale także poprawia skalowalność. Możesz dodać dowolną liczbę celów bez konieczności pisania dodatkowego kodu.
Zdefiniuj klasę
good_target_wrapper. Możesz to umieścić powyżej definicji klasyshooting_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.Zdefiniuj klasę
bad_target_wrapper. Możesz to umieścić powyżej definicji klasyshooting_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.Dodaj następujące właściwości tablicy do urządzenia menedżera strzelnicy.
Verse@editable: GoodTargets:[]good_target_wrapper = array{} @editable BadTargets:[]bad_target_wrapper = array{}Usuń następujące elementy z urządzenia menedżera strzelnicy. Są one obecnie obsługiwane przez klasy otoki.
GoodTarget1-3
GoodTargetScore
BadTarget1-3
BadTargetScore
HitGoodTarget1-3
OnGoodTarget1-3Hit()
OnBadTarget1-3Hit()
Zmodyfikuj metodę
OnBegin, aby zainicjowała właściwe i niewłaściwe cele, przechodząc pętlą przez tablicę.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.Zmodyfikuj metodę
CheckCombo, aby sprawdzała ukończenie kombo, przechodząc pętlą przez tablicę Właściwy cel.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?): returnZaktualizuj metodę
ResetCombo, aby przeszła pętlą przez tablicę Właściwy cel.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 --- #>Zapisz i skompiluj kod Verse.
Gotowy kod
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:
Połączenie wszystkiego w całość
Ustaw nowe wartości dla zmienionych właściwości edytowalnych w urządzeniu Verse.
Wybierz shooting_range_manager_device w oknie wizualizacji lub panelu Outliner.
W panelu szczegółów ustaw następujące parametry:
Dodaj trzy elementy do tablicy GoodTargets i ustaw każdy z nich na odpowiedni cel. Opcjonalnie możesz teraz również zmienić wartość punktową poszczególnych celów.
Dodaj trzy elementy do tablicy BadTargets i ustaw każdy z nich na odpowiedni cel. Opcjonalnie możesz teraz również zmienić wartość punktową poszczególnych celów.
Sprawdź, czy wszystkie pozostałe właściwości są ustawione zgodnie z oczekiwaniami.
Praca własna
To już koniec tej sekcji, ale ty nie musisz kończyć. Więcej informacji na temat funkcjonalności i rozgrywki Verse znajdziesz w dokumentacji Poznaj mechanikę gry.