Maintenant que vous avez le jeu de base, il est important de donner au joueur un retour visuel lorsqu'il exécute des actions, par exemple :
Un marqueur d'objectif qui indique au joueur où aller.
Ajoutez du temps au compte à rebours lorsque le joueur marque des points.
Ne démarrez le jeu que lorsque le joueur entre dans le véhicule.
Retirez les pizzas en trop lorsque le joueur collecte un nouvel objet afin qu'il ne laisse pas tomber de pizzas sur la carte.
Dans cette étape du tutoriel
Montrer au joueur la prochaine zone de collecte sélectionnée
Procédez comme suit pour ajouter un marqueur d'objectif qui indique au joueur où aller. Mettez à jour le fichier game_coordinator_device.verse :
Ajoutez un
marqueur d'objectifmodifiable nomméPickupMarkeravec le spécificateurpublicà la classegame_coordinator_device.@editable PickupMarker<public> : objective_marker = objective_marker{}Au début de la fonction
PickupDeliveryLoop(), activez l'appareil Indicateur de carte associé à l'objetPickupMarkeret configurez une expressiondeferpour désactiver l'appareil à la sortie de la fonction.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(){} <# Reporter la désactivation de l’indicateur MapIndicator afin que la fin de la boucle PickupDeliveryLoop finisse toujours par désactiver le marqueur. Le report a lieu également si la boucle PickupDeliveryLoop est annulée. #> defer: if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.DeactivateObjectivePulse(ValidPlayer) PickupMarker.MapIndicator.Disable() PickupMarker.MapIndicator.Enable()Lors de la sélection de la prochaine zone de collecte, déplacez le marqueur de collecte vers la zone de collecte sélectionnée et appelez
PickupMarker.MapIndicator.ActivateObjectivePulse()pour guider le joueur vers cette zone.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,
Ajouter du temps au compte à rebours lorsque le joueur marque des points
Vous pouvez encourager un joueur à livrer des objets plus souvent ; vous pouvez pour cela le récompenser en ajoutant du temps supplémentaire au compte à rebours chaque fois qu’il livre un objet.
Procédez comme suit pour ajouter du temps au compte à rebours :
Dans le fichier score_manager.verse, remplacez le type de retour de la fonction
AddPendingScoreToTotalScore()parintet ajoutezreturn PendingScoreafin de pouvoir utiliser les points ajoutés au score total pour mettre à jour le compte à rebours.AddPendingScoreToTotalScore<public>() : int = set TotalGameScore += PendingScore defer: set PendingScore = 0 UpdateUI() return PendingScoreDans le fichier game_coordinator_device.verse, ajoutez à la définition de classe
game_coordinator_deviceune expressionfloatmodifiable nomméeDeliveryBonusSecondsavec le spécificateurpublic, pour représenter le nombre de secondes à ajouter au compte à rebours pour chaque point marqué à la livraison.# Nombre de secondes à ajouter au compte à rebours lors de la livraison d'un objet collecté. @editable DeliveryBonusSeconds<public> : float = 20.0Mettez à jour l'expression
blockde livraison pour calculer le temps de bonus et mettez à jour le temps restant sur le compte à rebours.block: FirstPickupZoneCompletedEvent.Await() if (DeliveryZone := DeliveryZoneSelector.SelectNext[]): DeliveryZone.ActivateZone() # La désactivation de zone est reportée afin que l'annulation de la boucle PickupDeliveryLoop entraîne également la désactivation de toute zone de livraison active. defer: Logger.Print("Deactivating delivery zone.", ?Level := log_level.Normal) DeliveryZone.DeactivateZone() DeliveryZone.ZoneCompletedEvent.Await() Logger.Print("Delivered", ?Level := log_level.Normal) PointsCommitted := ScoreManager.AddPendingScoreToTotalScore() BonusTime : float = DeliveryBonusSeconds * PointsCommitted CountdownTimer.AddRemainingTime(BonusTime) else: Logger.Print("Can't find next DeliveryZone to select.", ?Level := log_level.Error) return # Error out of the PickupDeliveryLoopLorsque vous testez le jeu, vous constatez que diriger le joueur vers la zone de livraison après avoir collecté une pizza ajoute du temps au compte à rebours.
Démarrer la partie lorsque le joueur entre dans le véhicule
Procédez comme suit pour lancer le jeu lorsque le joueur entre dans le véhicule et le prendre en charge lorsqu'il en sort :
Créez une référence modifiable à l'appareil Générateur de véhicule avec le spécificateur
public.@editable VehicleSpawner<public> : vehicle_spawner_atk_device = vehicle_spawner_atk_device{}Créez une fonction nommée
StartGameOnPlayerEntersVehicle()avec les spécificateursprivateetsuspends. Cette fonction doit attendre que le joueur entre dans le véhicule avant d'appelerStartGame(), et actualiser la variableMaybePlayerselon la référence du joueur qui entre dans le véhicule. Mettez à jourOnBegin()pour appeler cette fonction plutôt queStartGame().OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Nous souhaitons uniquement obtenir une notification la première fois que le joueur entre dans le véhicule pour démarrer le jeu. # StartGameOnPlayerEntersVehicle attend cet événement et lance la boucle de jeu. StartGameOnPlayerEntersVehicle() StartGameOnPlayerEntersVehicle<private>()<suspends> : void = VehiclePlayer := VehicleSpawner.AgentEntersVehicleEvent.Await() Logger.Print("Player entered the vehicle") set MaybePlayer = option{player[VehiclePlayer]} StartGame()Configurez un gestionnaire d'événements lorsque le joueur sort du véhicule. Créez une fonction nommée
HandlePlayerExitsVehicle()avec le spécificateurprivate.OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Après être entré dans le véhicule, le joueur peut en sortir à tout moment ; il # est nécessaire de détecter cet événement chaque fois qu’il se produit pour remettre le joueur dans le véhicule. VehicleSpawner.AgentExitsVehicleEvent.Subscribe(HandlePlayerExitsVehicle) # Nous souhaitons uniquement obtenir une notification la première fois que le joueur entre dans le véhicule pour démarrer le jeu. # StartGameOnPlayerEntersVehicle attend cet événement et lance la boucle de jeu. StartGameOnPlayerEntersVehicle() HandlePlayerExitsVehicle<private>(VehiclePlayer : agent) : void = Logger.Print("Player exited the vehicle. Reassigning player to vehicle") VehicleSpawner.AssignDriver(VehiclePlayer)
Retirer les pizzas en trop
Procédez comme suit pour retirer les pizzas en trop lorsque le joueur collecte un nouvel objet afin qu'il ne laisse pas tomber de pizzas sur la carte :
Ajoutez une référence modifiable à l'appareil Soustracteur d’objets chargé de la suppression des pizzas de l'inventaire du joueur.
@editable PizzaRemover<public> : item_remover_device = item_remover_device{}Dans la fonction
PickupDeliveryLoop(), retirez les pizzas juste après que le joueur a ramassé un objet.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. #>