Ho avuto difficoltà a implementare gli script nel mio motore di gioco. Ho solo alcuni requisiti: dovrebbe essere intuitivo, non voglio scrivere un linguaggio personalizzato, parser e interprete e non voglio usare il threading. (Sono certo che esiste una soluzione più semplice; non ho bisogno della seccatura di più thread di logica di gioco.) Ecco uno script di esempio, in Python (aka pseudocodice):
def dramatic_scene(actors):
alice = actors["alice"]
bob = actors["bob"]
alice.walk_to(bob)
if bob.can_see(alice):
bob.say("Hello again!")
else:
alice.say("Excuse me, Bob?")
Quella parte epica della narrazione pone problemi di implementazione. Non posso semplicemente valutare l'intero metodo in una volta, perché walk_to
richiede tempo di gioco. Se ritorna subito, Alice inizia a camminare verso Bob, e (nella stessa cornice) saluta (o si saluta). Ma se walk_to
è una chiamata bloccante che ritorna quando raggiunge Bob, allora il mio gioco si blocca, perché sta bloccando lo stesso filo di esecuzione che farebbe camminare Alice.
Ho pensato di rendere ogni funzione accodata in un'azione: alice.walk_to(bob)
spingevo un oggetto in una coda, che sarebbe saltato fuori dopo che Alice avesse raggiunto Bob, dovunque fosse. È più sottilmente rotto: il if
ramo viene valutato immediatamente, quindi Bob potrebbe salutare Alice anche se le si volge le spalle.
In che modo altri motori / persone gestiscono gli script senza creare thread? Sto iniziando a cercare idee in aree non sviluppate dal gioco, come catene di animazioni jQuery. Sembra che ci dovrebbero essere alcuni buoni schemi per questo tipo di problema.