Generazione procedurale aiuta a migliorare la rigiocabilità usando regole interne per creare parti del gioco al volo: dalla progettazione del piano di un dungeon alla costruzione di un sistema solare. Queste regole sono spesso basate su una serie di numeri che vengono quindi interpretati dal programma per creare il contenuto richiesto.
Ci sono molti modi per generare questi numeri; in questo articolo vedremo Generatori di sequenze e Generatori di numeri pseudocasuali, e le loro differenze.
La prima opzione - un generatore di sequenze - è la più dura delle due procedure menzionate. Ma cos'è?
Un generatore di sequenze è un algoritmo che utilizza una formula matematica per produrre una sequenza di numeri. Ad esempio, vedremo una sequenza molto semplice - quella che spiegherò è una derivazione della nota Sequenza di Fibonacci.
Fondamentalmente la sequenza standard di Fibonacci inizia sempre con 0 e 1. Questi numeri vengono quindi sommati per dare 1 - quindi il secondo e il terzo numero in questa sequenza sono 1 e 1. Quando vengono aggiunti insieme il risultato è 2, e questo è il quarto numero nella sequenza. La sequenza continua così, aggiungendo sempre i due numeri precedenti nella sequenza per generare il successivo.
La programmazione di un generatore di sequenze può sembrare semplice, specialmente se si basano le sue basi sulla sequenza di Fibonacci, ma le prime impressioni sono ingannevoli. Ad esempio, immaginiamo che stiamo cercando di creare uno Starfield bidimensionale come questo:
Guardando questo campo stellare possiamo vedere che ogni stella può essere definita dalle sue coordinate e dalle sue dimensioni. Prendendo l'intervallo di ciascun valore tra 0 e 99, possiamo dividere una sequenza di numeri in gruppi di tre - interpretando ciascun numero come coordinata x, coordinata y o dimensione della stella.
Se preso passo-passo, programmare un generatore di sequenze basato sulla sequenza di Fibonacci per creare una sequenza simile non è un compito difficile.
Iniziamo con un numero (chiamato seme) composto da quattro cifre, ad esempio 1234. Il seme viene quindi diviso in una coppia di numeri a due cifre che prendono il posto dello 0 e 1 della sequenza di Fibonacci. Questi numeri vengono quindi elaborati utilizzando una formula per produrre un terzo numero nel flusso.
Quando si crea un generatore di sequenze, probabilmente si vorrà che i numeri generati cadano in un intervallo specifico (ad esempio 0-99). È quindi importante troncare questo numero se rientra nell'intervallo. (Per il nostro esempio, possiamo semplicemente tagliare la colonna "centinaia".) Anche se questo potrebbe sembrare insignificante, facilita il flusso di lavoro quando si manipola questa sequenza più tardi.
Mentre questo processo viene ripetuto, viene creata una stringa di numeri che è pronta per essere manipolata e quindi può essere implementata:
Creare una sequenzaSfortunatamente è solo dopo aver implementato la sequenza come un disegno 2D che si inizia a notare i modelli ricorrenti. La maggior parte delle volte, risolvendo questo tipo di problemi, si verificheranno lunghe ore di prove ed errori testando diversi algoritmi.
Il secondo approccio di cui sopra sta usando un generatore di numeri pseudocasuali (PRNG). Prima di spiegare cos'è un PRNG, tieni presente che il computer è una macchina logica: deve obbedire a un certo insieme di regole. Pertanto, nulla in un computer è veramente casuale.
Un generatore di numeri pseudocasuali è solo un algoritmo che produce un flusso di numeri (apparentemente) casuali. Dico "apparentemente" perché un PRNG utilizza ancora formule predefinite per generare i numeri. Ciò significa che un PRNG è ancora un generatore di sequenze.
La proprietà chiave di un PRNG rispetto ad altri generatori di sequenza è che bilancia il numero di volte in cui appaiono numeri diversi. Questo processo viene fatto attraverso complesse formule e algoritmi e significa che i numeri che produce appariranno uguali a quelli dei tiri di dadi ripetuti o dei numeri vincenti della lotteria.
Mentre un generatore di sequenze di solito è creato appositamente per un problema, viene utilizzato un PRNG quando la sequenza generata viene di solito scartata o non deve essere conservata.
Un PRNG è più facile da usare e implementare rispetto a un generatore di sequenze e ha vari usi. Nonostante ciò, a volte è più sensato fare il miglio supplementare e utilizzare un generatore di sequenze. Perché?
Nei sistemi complessi, è importante sfruttare al meglio lo spazio. Usare un PRNG significa che, per salvare i dettagli di un sistema solare, dovresti salvare tutta la lunga sequenza. D'altra parte, se si utilizza un generatore di sequenze, è possibile salvare semplicemente il seme iniziale e la lunghezza della sequenza. (In questo caso, è cruciale che il Generatore di Sequenze produca la stessa sequenza da un dato seme.) Lo stesso non si può dire dei PRNG: in generale, un PRNG non espone il suo seme, né lo accetta. Ciò rende estremamente difficile la replica di una sequenza PRNG.
A volte, anche se raramente, un PRNG potrebbe fornirti una sequenza apparentemente parziale (nello stesso modo in cui una moneta equa può occasionalmente atterrare la testa cinque volte di fila). Questo potrebbe non essere facile da rilevare a prima vista o quando si guarda la sequenza nel suo insieme. Tuttavia, quando guardi l'immagine prodotta, potresti notare gruppi di stelle o pianeti. Utilizzando un generatore di sequenze, questo problema può essere ridotto al minimo poiché tale algoritmo è fatto su misura per il problema in questione.
Un altro vantaggio, simile a quello precedente, è controllo dei contenuti. Quando vuoi generare proceduralmente un campo stellare lontano, è naturale che tu voglia che le piccole stelle appaiano più frequentemente delle stelle più grandi. Usando un PRNG inalterato, questo errore non è possibile. Tuttavia, utilizzando un generatore di sequenze è possibile fornire autonomamente il bias richiesto. Ancora una volta, tutto si riduce alla formula o alle formule che decidi di utilizzare e al modo in cui interpreti la stringa risultante.
Mentre un PRNG potrebbe essere utile, quando si crea un motore di generazione procedurale sarebbe probabilmente meglio scegliere un Sequence Generator più specifico. I vantaggi che porta con sé sono vantaggiosi e assicurano che l'implementazione abbia una maggiore possibilità di distinguersi dal resto.