Jetzt, wo du den Kern des Gameplays hast, ist es wichtig, dem Spieler visuelles Feedback zu geben, wenn er Aktionen ausführt, wie zum Beispiel:
Eine Zielmarkierung, die dem Spieler zeigt, wohin er gehen muss.
Der Countdown wird verlängert, wenn der Spieler einen Punkt erzielt.
Das Spiel beginnt erst, wenn der Spieler in das Fahrzeug steigt.
Dem Spieler werden zusätzliche Pizzen abgenommen, wenn er einen neuen Gegenstand aufnimmt, damit der Spieler keine Pizzen auf der Karte fallen lässt.
Wenn du diesen Schritt im Tutorial Time Trial: Pizza Pursuit abgeschlossen hast, weißt du, wie man ein Spiel aufpoliert.
Dem Spieler die nächste ausgewählte Abholzone zeigen
Befolge diese Schritte, um eine objective marker hinzuzufügen, die dem Spieler zeigt, wohin er gehen muss. Aktualisiere die Datei game_coordinator_device.verse:
Füge der Klasse
game_coordinator_deviceeinen editierbarenobjective_markermit dem NamenPickupMarkerhinzu, der denpublic-Bezeichner hat.@editable PickupMarker<public> : objective_marker = objective_marker{}Aktiviere zu Beginn der Funktion
PickupDeliveryLoop()das mit dem ObjektPickupMarkerverbundene Kartenkennzeichner-Gerät und richte einendeferein, um das Gerät zu deaktivieren und zu deaktivieren, wenn die Funktion beendet wird.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(){} <# Die Deaktivierung des MapIndicator aufschieben, so dass das Beenden der PickupDeliveryLoop immer mit der Deaktivierung des Markers endet. Der Aufschub wird auch ausgeführt, wenn die PickupDeliveryLoop abgebrochen wird. #> defer: if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.DeactivateObjectivePulse(ValidPlayer) PickupMarker.MapIndicator.Disable() PickupMarker.MapIndicator.Enable()Wenn die nächste Abholzone ausgewählt ist, verschiebe den Abholmarker zur ausgewählten Abholzone und rufe
PickupMarker.MapIndicator.ActivateObjectivePulse()auf, um den Spieler dorthin zu führen.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,
Hinzufügen von mehr Zeit zum Countdown, wenn ein Spieler einen Punkt erzielt
Du kannst einen Spieler dazu ermutigen, öfter Gegenstände auszuliefern, indem du ihn mit zusätzlicher Zeit für jeden ausgelieferten Gegenstand belohnst.
Folge diesen Schritten, um dem Countdown mehr Zeit hinzuzufügen:
Ändere in der Datei score_manager.verse den Rückgabetyp für die Funktion
AddPendingScoreToTotalScore()inintund fügereturn PendingScorehinzu, damit du die zum Gesamtergebnis hinzugefügten Punkte zur Aktualisierung des Countdowns verwenden kannst.AddPendingScoreToTotalScore<public>() : int = set TotalGameScore += PendingScore defer: set PendingScore = 0 UpdateUI() return PendingScoreFüge in der Datei game_coordinator_device.verse einen editierbaren
float-Wert mit dem NamenDeliveryBonusSecondsmit dem Bezeichnerpubliczur Klassendefinition vongame_coordinator_devicehinzu, der angibt, wie viele Sekunden zum Countdown-Timer für jeden bei der Übergabe vergebenen Punkt hinzugefügt werden sollen.# Wie viele Sekunden zum Countdown-Timer hinzugefügt werden sollen, wenn eine Abholung zugestellt wird. @editable DeliveryBonusSeconds<public> : float = 20.0Aktualisiere den
block-Ausdruck, um die Bonuszeit zu berechnen und die verbleibende Zeit auf dem Countdown-Timer zu aktualisieren.block: FirstPickupZoneCompletedEvent.Await() if (DeliveryZone := DeliveryZoneSelector.SelectNext[]): DeliveryZone.ActivateZone() # Wir verschieben die Deaktivierung der Zone, so dass das Abbrechen von PickupDeliveryLoop auch die Deaktivierung einer aktiven Lieferzone zur Folge hat. defer: Logger.Print("Lieferzone wird deaktiviert.", ?Level := log_level.Normal) DeliveryZone.DeactivateZone() DeliveryZone.ZoneCompletedEvent.Await() Logger.Print("Abgeliefert", ?Level := log_level.Normal) PointsCommitted := ScoreManager.AddPendingScoreToTotalScore() BonusTime : float = DeliveryBonusSeconds * PointsCommitted CountdownTimer.AddRemainingTime(BonusTime) else: Logger.Print("Nächste auszuwählende Lieferzone kann nicht gefunden werden.", ?Level:= log_level.Error) return # Fehler aus dem PickupDeliveryLoopWenn du beim Spieltest zur Lieferzone gehst, nachdem du eine Pizza abgeholt hast, verlängert sich der Countdown.
Start des Spiels, wenn der Spieler in das Fahrzeug steigt
Befolge diese Schritte, um das Spiel zu starten, wenn der Spieler in das Fahrzeug einsteigt, und es zu beenden, wenn er das Fahrzeug verlässt:
Erstelle einen bearbeitbaren Verweis auf das Fahrzeug-Spawnpunkt-Gerät mit dem Bezeichner
public.@editable VehicleSpawner<public> : vehicle_spawner_atk_device = vehicle_spawner_atk_device{}Erstelle eine Funktion namens
StartGameOnPlayerEntersVehicle(), die die Parameterprivateundsuspendsenthält. Diese Funktion sollte darauf warten, dass der Spieler das Fahrzeug besteigt, bevor sieStartGame()aufruft, und die VariableMaybePlayermit der Spielerreferenz vom Besteigen des Fahrzeugs aktualisieren. AktualisiereOnBegin(), um diese Funktion anstelle vonStartGame()aufzurufen.OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Wir wollen nur benachrichtigt werden, wenn der Spieler zum ersten Mal das Fahrzeug besteigt, um das Spiel zu starten. # StartGameOnPlayerEntersVehicle wartet auf dieses Event und startet dann die Gameplay-Schleife. StartGameOnPlayerEntersVehicle() StartGameOnPlayerEntersVehicle<private>()<suspends> : void = VehiclePlayer := VehicleSpawner.AgentEntersVehicleEvent.Await() Logger.Print("Spieler hat das Fahrzeug bestiegen") set MaybePlayer = option{player[VehiclePlayer]} StartGame()Richte einen Event-handler ein, wenn der Spieler das Fahrzeug verlässt. Erstelle eine Funktion mit dem Namen
HandlePlayerExitsVehicle(), die den Bezeichnerprivatehat.OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Nachdem der Spieler das Fahrzeug bestiegen hat, kann er jederzeit aussteigen; wir # wollen dies jedes Mal erkennen, wenn es passiert, um sie wieder in das Fahrzeug zu setzen. VehicleSpawner.AgentExitsVehicleEvent.Subscribe(HandlePlayerExitsVehicle) # Wir wollen nur benachrichtigt werden, wenn der Spieler zum ersten Mal das Fahrzeug besteigt, um das Spiel zu starten. # StartGameOnPlayerEntersVehicle wartet auf dieses Event und startet dann die Gameplay-Schleife. StartGameOnPlayerEntersVehicle() HandlePlayerExitsVehicle<private>(VehiclePlayer : agent) : void = Logger.Print("Spieler ist ausgestiegen. Spieler wird dem Fahrzeug neu zugeordnet") VehicleSpawner.AssignDriver(VehiclePlayer)
Extra Pizzen entfernen
Befolge diese Schritte, um zusätzliche Pizzen vom Spieler zu entfernen, wenn er einen neuen Gegenstand aufnimmt, damit der Spieler keine Pizzen auf der Karte fallen lässt:
Füge eine editierbare Referenz auf das Gegenstandsentferner-Gerät hinzu, das für das Entfernen von Pizzen aus dem Inventar des Spielers verantwortlich ist.
@editable PizzaRemover<public> : item_remover_device = item_remover_device{}In der Funktion
PickupDeliveryLoop()werden dem Spieler die Pizzen abgenommen, nachdem er einen Gegenstand abgeholt hat.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. #>