Agora que você tem a jogabilidade principal, é importante dar feedback visual ao jogador quando ele realiza ações, como:
Um marcador de objetivo que mostra ao jogador aonde ir.
Adicionar mais tempo à contagem regressiva quando o jogador faz uma pontuação.
Apenas iniciar o jogo quando o jogador entrar no veículo.
Remover pizzas extras do jogador quando ele pega um novo item para que ele não derrube pizzas no mapa.
Ao concluir esta etapa no tutorial Prova de tempo: Em busca da pizza, você aprenderá a aprimorar um jogo.
Como mostrar ao jogador a próxima zona de retirada selecionada
Siga estas etapas para adicionar um marcador de objetivo que mostra ao jogador aonde ir. Atualize o arquivo game_coordinator_device.verse:
Adicione um
objective_markereditável chamadoPickupMarkerque tenha o especificadorpublicà classegame_coordinator_device.@editable PickupMarker<public> : objective_marker = objective_marker{}No início da função
PickupDeliveryLoop(), ative o dispositivo Indicador de Mapa associado ao objetoPickupMarkere configure uma expressãodeferpara desativar e desabilitar o dispositivo quando a função for encerrada.PickupDeliveryLoop<private>()<suspends> : void = PickupZonesTags : []pickup_zone_tag = array{pickup_zone_level_1_tag{}, pickup_zone_level_2_tag{}, pickup_zone_level_3_tag{}} MaxPickupLevel := PickupZonesTags.Length - 1 FirstPickupZoneCompletedEvent := event(){} <# Adie a desativação do MapIndicator para que o encerramento do PickupDeliveryLoop sempre acabe desabilitando o marcador. Defer também será executada se PickupDeliveryLoop for cancelado. #> defer: if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.DeactivateObjectivePulse(ValidPlayer) PickupMarker.MapIndicator.Disable() PickupMarker.MapIndicator.Enable()Quando a próxima zona de retirada for selecionada, mova o marcador de retirada para a zona de retirada selecionada e chame
PickupMarker.MapIndicator.ActivateObjectivePulse()para orientar o jogador até ela.Verserace: loop: if (PickupZone : base_zone = PickupZoneSelectors[PickupLevel].SelectNext[]): PickupZone.ActivateZone() Sleep(0.0) PickupMarker.MoveMarker(PickupZone.GetTransform(), ?OverTime := 0.0) if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.ActivateObjectivePulse(ValidPlayer) <# This is the only defer we need for any PickupZone we activate. It will either deactivate the first PickupZone at the end of each outer loop,
Adicionar mais tempo à contagem regressiva quando o jogador fizer uma pontuação
Você pode incentivar um jogador a entregar itens com mais frequência, recompensando-o com mais tempo para cada item entregue.
Siga estas etapas para adicionar mais tempo à contagem regressiva:
No arquivo score_manager.verse, altere o tipo de retorno da função
AddPendingScoreToTotalScore()parainte adicionereturn PendingScorepara que você possa usar os pontos adicionados à pontuação total para atualizar a contagem regressiva.AddPendingScoreToTotalScore<public>() : int = set TotalGameScore += PendingScore defer: set PendingScore = 0 UpdateUI() return PendingScoreNo arquivo game_coordinator_device.verse, adicione uma expressão
floateditável chamadoDeliveryBonusSecondsque tenha o especificadorpublicà definição da classegame_coordinator_devicepara representar quantos segundos adicionar ao temporizador de contagem regressiva para cada ponto confirmado na entrega.# Quantos segundos devem ser adicionados ao cronômetro de contagem regressiva quando uma retirada é entregue. @editable DeliveryBonusSeconds<public> : float = 20.0Atualize a expressão
blockde entrega para calcular o tempo de bônus e atualize o tempo restante no temporizador de contagem regressiva.block: FirstPickupZoneCompletedEvent.Await() if (DeliveryZone := DeliveryZoneSelector.SelectNext[]): DeliveryZone.ActivateZone() # Adiamos a desativação da zona para que o cancelamento de PickupDeliveryLoop também acabe desativando qualquer zona de entrega ativa. defer: Logger.Print("Desativando zona de entrega.", ?Level := log_level.Normal) DeliveryZone.DeactivateZone() DeliveryZone.ZoneCompletedEvent.Await() Logger.Print("Deactivating delivery zone.", ?Level := log_level.Normal) PointsCommitted := ScoreManager.AddPendingScoreToTotalScore() BonusTime : float = DeliveryBonusSeconds * PointsCommitted CountdownTimer.AddRemainingTime(BonusTime) else: Logger.Print("Não é possível encontrar a próxima DeliveryZone para selecionar.", ?Level := log_level.Error) return # Erro proveniente de PickupDeliveryLoopQuando você joga, ir para a área de entrega depois de pegar uma pizza adiciona mais tempo à contagem regressiva.
Iniciar o jogo quando o jogador entra no veículo
Siga estas etapas para iniciar o jogo quando o jogador entrar no veículo e definir uma estratégia para quando ele sair do veículo:
Crie uma referência editável para o dispositivo Gerador de Veículos que tenha o especificador
public.@editable VehicleSpawner<public> : vehicle_spawner_atk_device = vehicle_spawner_atk_device{}Crie uma função chamada
StartGameOnPlayerEntersVehicle()que tenha os especificadoresprivateesuspends. Essa função deve esperar que o jogador entre no veículo antes de chamarStartGame()e atualizar a variávelMaybePlayercom a referência do jogador ao entrar no veículo. AtualizeOnBegin()para chamar essa função em vez deStartGame().OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Só queremos ser notificados na primeira vez que o jogador entrar no veículo para iniciar o jogo. # StartGameOnPlayerEntersVehicle aguardará esse evento e iniciará o loop de jogo. StartGameOnPlayerEntersVehicle() StartGameOnPlayerEntersVehicle<private>()<suspends> : void = VehiclePlayer := VehicleSpawner.AgentEntersVehicleEvent.Await() Logger.Print("O jogador entrou no veículo") set MaybePlayer = option{player[VehiclePlayer]} StartGame()Configure um manipulador de eventos para quando o jogador sair do veículo. Crie uma função chamada
HandlePlayerExitsVehicle()que tenha o especificadorprivate.OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Depois de entrar no veículo, o jogador pode sair a qualquer momento; nós # queremos detectar isso todas as vezes que acontecer para colocá-lo de volta no veículo. VehicleSpawner.AgentExitsVehicleEvent.Subscribe(HandlePlayerExitsVehicle) # Só queremos ser notificados na primeira vez que o jogador entrar no veículo para iniciar o jogo. # StartGameOnPlayerEntersVehicle aguardará esse evento e iniciará o loop de jogo. StartGameOnPlayerEntersVehicle() HandlePlayerExitsVehicle<private>(VehiclePlayer : agent) : void = Logger.Print("O jogador saiu do veículo. Reatribuindo o jogador ao veículo") VehicleSpawner.AssignDriver(VehiclePlayer)
Como remover pizzas extras
Siga estas etapas para remover pizzas extras do jogador quando ele pegar um novo item, para que ele não derrube pizzas no mapa:
Adicione uma referência editável ao dispositivo de remoção de itens que seja responsável por remover pizzas do inventário do jogador.
@editable PizzaRemover<public> : item_remover_device = item_remover_device{}Na função
PickupDeliveryLoop(), remova as pizzas do jogador logo após ele pegar um item.Verseloop: if (PickupZone : base_zone = PickupZones[PickupLevel].SelectNext[]): PickupZone.ActivateZone() Sleep(0.0) PickupMarker.MoveMarker(PickupZone.GetTransform(), ?OverTime := 0.0) if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.ActivateObjectivePulse(ValidPlayer) <# This is the only defer we need for any PickupZone we activate. It will either deactivate the first PickupZone at the end of each outer loop, or it'll deactivate any later PickupZone. That's because the expression is evaluated at the end, when the PickupZone variable has been bound to a newer zone. #>