Una delle motivazioni principali per posizionare le pedine nel runtime è variare il gameplay a ogni partita.
Se le pedine vengono posizionate nell'editor e non vengono spostate a ogni partita, quando avrai giocato in un singolo round saprai esattamente dove vengono posizionate ogni volta. Se invece posizioni ogni volta pedine in modo casuale, hai a disposizione diverse configurazioni iniziali.
Ad esempio, se hai un tabellone composto da 5x5 tile e cinque pedine, esistono (25 su 5) 53.130 configurazioni distinte. Se aumenti il tabellone di 1 solo spazio in più in ciascuna dimensione a 6x6 e mantieni cinque pedine, il numero sale a (36 su 5) 11.686.752.
La randomizzazione può essere un potente strumento per creare un gameplay vario.
Generare una coordinata tile casuale
Per posizionare una pedina in modo casuale, devi generare una coordinata tile casuale entro i limiti di un tabellone. Esistono molti modi per generare casualmente una coordinata nello spazio bidimensionale. Il più comune è la distribuzione uniforme, ovvero la modalità che utilizzerai per questo esempio. Una distribuzione uniforme pone un'eguale probabilità che una pedina sia posizionata su qualsiasi tile del tabellone. Per maggiori informazioni, vedi https://en.wikipedia.org/wiki/Discrete_uniform_distribution . A tal fine, costruisci una funzione di utilità denominata GenerateUniformRandomTileCoordinate che accetta un oggetto limiti per sapere in quale dominio generare le coordinate.
Per generare una coordinata tile distribuita uniformemente nello spazio bidimensionale, genera casualmente un intero in ogni dimensione in modo indipendente, quindi combinali in un oggetto coordinata tile.
using { /Verse.org/Simulation }
using { /Verse.org/Random }
UtilityFunctions<public> := module:
...
GenerateUniformRandomTileCoordinate<public>(BoardBounds:board_bounds)<transacts>:tile_coordinate =
tile_coordinate:
Left := GetRandomInt(BoardBounds.LeftBounds.Low, BoardBounds.LeftBounds.High)
Questa funzione esegue i passaggi seguenti:
Genera un numero intero casuale entro i limiti di sinistra del tabellone.
Genera un numero intero casuale entro i limiti in avanti del tabellone.
Combina insieme questi elementi in un oggetto coordinata tile.
Per un elenco di altre distribuzioni discrete con supporto finito, vedi la tabella seguente https://en.wikipedia.org/wiki/List_of_probability_distributions. Puoi provare a creare funzioni personalizzate che generano coordinate rispetto ad alcune di queste distribuzioni e osservare come cambia il posizionamento delle pedine.
Assicurarsi che ci siano abbastanza spazi aperti
Un'altra considerazione da fare, prima di posizionare le pedine sul tabellone, è determinare se ci sono abbastanza spazi disponibili sul tabellone per il numero di pedine. Si può creare una funzione di utilità denominata NumberOfTileCoordinates che prende da un oggetto limiti del tabellone e restituisce il numero di tile sul tabellone.
using { /Verse.org/Simulation }
using { /Verse.org/Random }
UtilityFunctions<public> := module:
...
NumberOfTileCoordinates<public>(BoardBounds:board_bounds)<transacts>:int =
(BoardBounds.LeftBounds.High - BoardBounds.LeftBounds.Low) * (BoardBounds.ForwardBounds.High - BoardBounds.ForwardBounds.Low)Posizionare una pedina in modo casuale
Per posizionare casualmente le pedine sul tabellone, devi sapere quante pedine generare. Aggiungila come variabile modificabile nella classe tabellone.
Dopo aver determinato il numero di pedine sul tabellone, la procedura per posizionare le pedine è la seguente:
Assicurati che ci siano abbastanza coordinate tile disponibili per il numero di pedine con
NumberOfTileCoordinates.Genera in modo casuale una coordinata tile con
GenerateUniformRandomTileCoordinate.Decidi se esiste già una pedina su quella coordinata.
In caso affermativo, torna al passaggio 1.
In caso negativo, vai al passaggio 4.
Decidi se
SetPawnha esito positivo in corrispondenza delle coordinate generate.In caso affermativo, passa alla pedina successiva.
In caso contrario, genera un errore.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
Questa funzione ha esito positivo se e solo se:
Esistono abbastanza spazi sul tabellone per il numero prescritto di pedine.
Ogni pedina viene posizionata correttamente su una coordinata che non ha già una pedina.
Generare il tabellone durante il runtime
Per generare il tabellone in fase di runtime, basta eseguire l'override della funzione OnBegin del tabellone e chiamare PlacePawns:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
Riepilogo
Per riassumere, questa pagina ti ha guidato attraverso il seguente passaggio:
Posizionare tutte le pedine in maniera casuale sul tabellone.
File
using { /Verse.org/Simulation }
using { /Verse.org/Random }
DataTypes<public> := module:
tile_coordinate<public> := class<concrete>:
@editable
Left<public>:int = 0
@editable
Forward<public>:int = 0
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):