2015-09-23 30 views
6

Vorrei aggiungere funzionalità di scripting al mio motore di gioco C++.Racchetta come linguaggio di scripting in un motore di gioco

ho Engine.exe, Physics.dll, Audio.dll e sto aggiungendo Scripting.dll che è una racchetta involucro di alto livello.

Engine.exe carichi Physics.dll e imposta il mondo della fisica, carica Audio.dll e imposta il mondo audio. Si suppone di caricare Scripting.dll, impostare i binding su Physics.dll, Audio.dll e caricare gli script di gioco.

mi risulta, ci sono due possibili modi per incorporare Racket in un programma C++:

Uso Foreign Interface sembra strano per necessità di caricare Physics.dll, Audio.dll due volte: prima da Engine.exe e poi dallo script di gioco.

Scrivere Extensions sembra più allettante, perché consente di eseguire collegamenti script sul lato C++. D'altra parte devi costruire la tua estensione con raco ctool, collegarla con il file oggetto mzdyn - che sembra anche imbarazzante: perché non rendere una libreria statica mzdyn?

Vorrei implementare un unico metodo, ad es. setupScriptBindings(), sia in Physics.dll che in Audio.dll e per chiamarlo dallo Engine.exe all'avvio.

C'è un modo semplice per farlo?

+0

Hm, forse la descrizione di questo [http://docs.racket-lang.org/inside/embedding.html) aiuta. –

+0

Hm ... i collegamenti che fornisci parlano di incorporare C/altro codice ** in ** un programma Racket. Dalla tua descrizione, penso che tu voglia il contrario, ad es. incorporare Racket nella tua applicazione C++: http://docs.racket-lang.org/inside/embedding.html Anche se la soluzione più semplice e probabilmente più pulita sarebbe quella di definire una sorta di protocollo per controllare le tue entità di gioco, e quindi iniziare la racchetta come un nuovo processo, comunicare usando socket o qualche altro meccanismo IPC. –

+0

Offtopic: Racket è stato utilizzato con successo nella produzione di videogiochi da Naughty Dog. Vedi [«Racket on the Playstation 3»] (http://www.youtube.com/watch?v=oSmqbnhHp1c) e [«Scripting basato sullo stato in Uncharted 2: Among Thieves»] (http: //www.gameenginebook .com/risorse/gdc09-statescripting-uncharted2.pdf). –

risposta

3

Dopo aver utilizzato entrambi i metodi di estensione e FFI per collegare il racket al codice C, devo dire che l'approccio FFI è molto più bello. I binding in Racket alle funzioni C sono ben definiti e robusti e trattare con i tipi C in Racket è molto bello. L'unico inconveniente dell'utilizzo dell'approccio FFI è che, AFAIK, il tuo programma Racket deve essere l'applicazione driver.

Con l'approccio di incorporamento l'eseguibile C/C++ è il driver, ma dichiarare che l'interfaccia con il codice Racket è molto più manuale e soggetta a errori. Per non parlare del fatto che devi o capire raco ctool e replicarlo o avere il sistema di costruzione della racchetta prendere in consegna il tuo. Per i nostri scopi abbiamo finito per estrarre le sorgenti di Racket e costruirle da soli. Non consiglio davvero questo approccio.

In definitiva per i miei scopi avere la mia applicazione essere un'applicazione Racket con un file .DLL/.so esterno che ha caricato per le funzioni C ha funzionato meglio, ma sembra che tu possa essere bloccato con l'approccio di incorporamento.

+0

Grazie. Sì, ho bisogno di una soluzione integrata. Sebbene tu dica che potrebbe essere difficile, costruire Racket dalla fonte sembra più allettante per me. Se potessi fornire un esempio di legame «nativo» ↔ «copione» dal tuo approccio basato sull'incorporazione, sarebbe molto utile. Quale forma di esecuzione dello script hai scelto: testo normale, [bytecode] (http://docs.racket-lang.org/raco/make.html) o [eseguibile standalone] (http: //docs.racket-lang. org/Raco/exe.html)? –

+2

Useremo il testo normale o il bytecode. Bytecode è notevolmente più veloce, ma devi fare attenzione che sia aggiornato o che Racket lo compili quando necessario. –

+2

E il nostro bind di script nativo <-> sembrava proprio come l'esempio nei documenti ... niente di speciale. –