Esta etapa final do tutorial mostra como melhorar seu código enquanto ensina alguns conceitos importantes de Verse ao longo do processo.
Melhore seu código Verse
Esta página apresenta um passo a passo sobre as alterações no código, mas se quiser verificar seu trabalho, revise a seção Código Completo para ver o resultado final.
A refatoração é um processo no qual você reestrutura o código existente para melhorar o design ou a implementação sem alterar seu comportamento. A seguir estão os objetivos mais comuns da refatoração de código:
Melhorar a legibilidade com nomes de variáveis mais claros, espaçamento adequado ou uma estrutura geral de código mais organizada.
Melhorar o desempenho com implementação de comportamento mais simples ou eficiente.
Reduzir a repetição e o excesso de código (código grande, desnecessário ou muito complexo) condensando funções semelhantes em uma só ou agrupando várias variáveis de tipo e finalidade semelhantes em estruturas como matrizes.
Executar a refatoração seguindo essas metas deve ajudar você a escrever um código que seja gerenciável, fácil de ler e revisitar, além de extensível, com recursos fáceis de estender para melhorias futuras no comportamento. Fazendo seus jogos evoluírem de verdade!
GetFirstPlayer()
Escrever código legível é uma ótima prática de programação. Por exemplo, GetFirstPlayer() é mais claro que GetPlayspace().GetPlayers()[0]. Além disso, essa abordagem é uma prática recomendada para programar operações comuns, pois declara de forma clara a intenção da operação.
Abra o arquivo
shooting_range_manager_device.verse.Adicione o método
GetFirstPlayer.Observe que o método
GetFirstPlayertem os especificadores de efeito <decides><transacts> porque pode falhar e ser revertido. Leia mais detalhes sobre expressões falíveis e contextos de falha em Falha em Verse.Verse# Returns the first player in the playspace. GetFirstPlayer()<decides><transacts>:player= return GetPlayspace().GetPlayers()[0]Modifique o método
AdjustScorepara usar o novo métodoGetFirstPlayer.Observe que o método
GetFirstPlayeré chamado com colchetes em vez de parênteses porque permite falhas.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 --- #>Modifique o método
IncreaseWeaponLevelpara usar o novo 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 --- #>
Agrupadores e matrizes de classe alvo
Outro objetivo importante ao organizar o código é minimizar a duplicação. Na implementação atual, cada alvo bom e ruim define seu próprio retorno de chamada e sinalizador de acerto, tornando o código repetitivo.
Uma abordagem melhor é criar uma classe de agrupador que contenha tudo o que um alvo individual precisa. O gerenciador de estande de tiro poderá então gerenciar esses agrupadores de alvo em uma matriz, em vez de definir cada componente individualmente.
Isso não só reduz a duplicação como também melhora a escalabilidade. Você pode adicionar quantos alvos quiser sem escrever código adicional.
Defina a classe
good_target_wrapper. Você pode colocar isso acima da definição da 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.Defina a classe
bad_target_wrapper. Você pode colocar isso acima da definição da 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.Adicione as seguintes propriedades de matriz ao seu dispositivo gerenciador de estande de tiro.
Verse@editable: GoodTargets:[]good_target_wrapper = array{} @editable BadTargets:[]bad_target_wrapper = array{}Remova o seguinte do seu dispositivo gerenciador de estande de tiro. Agora, elas são manipuladas pelas classes de agrupadores.
GoodTarget1-3
GoodTargetScore
BadTarget1-3
BadTargetScore
HitGoodTarget1-3
OnGoodTarget1-3Hit()
OnBadTarget1-3Hit()
Modifique o método
OnBeginpara inicializar os alvos bons e ruins executando um loop por meio da 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.Modifique o método
CheckCombopara verificar a conclusão do combo executando um loop na matriz GoodTarget.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?): returnAtualize o método
ResetCombopara fazer um loop na matriz GoodTarget.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 --- #>Salve e compile seu 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:
Reunindo as partes
Você deve definir novos valores para as propriedades editáveis alteradas no seu dispositivo Verse.
Selecione shooting_range_manager_device na janela de visualização ou no painel Organizador.
No painel Detalhes, defina os seguintes parâmetros:
Adicione três elementos à matriz GoodTargets e defina cada um como seus respectivos alvos. Opcionalmente, você também pode alterar o valor da pontuação de um alvo individual agora.
Adicione três elementos à matriz BadTargets e defina cada um como seus respectivos alvos. Opcionalmente, agora você também pode alterar o valor da pontuação de um alvo individual.
Verifique se todas as outras propriedades estão definidas conforme o esperado.
Por si só
Esta seção acabou, mas você não precisa parar por aqui! Consulte mais informações sobre funcionalidades e jogabilidade em Verse na documentação Aprenda mecânicas de jogo.