Come creare supporto per i binding per un linguaggio di scripting

6

principale

Sto facendo un linguaggio di scripting usando C ++. Ho intenzione di usarlo con un semplice editor di test di gioco. Ma devo fare un supporto per i binding per chiamare i metodi dei nodi del motore di gioco per aggiornare posizioni, rotazioni, ecc.

Quali sono gli approcci principali per questo?

Il motore di gioco che ho intenzione di usare supporta anche lua, quindi forse posso anche usare questo fatto.

Dettagli

Il problema che ho affrontato risiede nel fatto di come posso chiamare i metodi dell'oggetto libreria C ++ all'interno di uno script. L'inglese non è la mia lingua madre e la mancanza di conoscenza in quella sfera mi impedisce di fare una buona domanda sull'argomento. Quindi non so cosa cercare. Google mi mostra informazioni su come creare binding ad alcuni linguaggi di scripting, non i fondamenti di frasi di ricerca come "come rendere il supporto di binding a un linguaggio di scripting", "scripting binding".

In questo momento sono arrivato alle seguenti cose. Devo ereditare tutti gli oggetti che verranno utilizzati nello script da una classe di servizio, es. CLangObject. Con il suo aiuto posso identificare il tipo di oggetto all'interno di un metodo di oggetti di libreria C ++. Quindi devo definire il puntatore più generale ai tipi di metodo. Ho anche definito una classe di servizio callback per passarla a una macchina byte quando il metodo della libreria C ++ restituisce valore. Il motore di gioco che voglio usare si lega a lua, quindi forse posso usare le sue classi LuaObject e LuaCallback. In questo momento non so se questo approccio porterà a un risultato normale.

    
posta Dmitry K. 01.04.2013 - 09:38
fonte

3 risposte

1

Penso che il termine di ricerca migliore per questo potrebbe essere "ponte", provare con quello.

L'approccio più semplice è utilizzare una funzione C per inviare dal linguaggio di scripting al tuo motore. Immagina una funzione msgSend(target, message, arg0, ...) ; se puoi scrivere il motore del linguaggio di scripting in modo che possa chiamare msgSend con argomenti arbitrari, puoi vedere come da questo puoi chiamare il target del metodo message con arg0, ... .

Poiché menzioni Lua, dai un'occhiata al link . Puoi vedere nell'esempio come passa nelle classi e negli indirizzi di funzione - sul lato Lua questi saranno incapsulati come una sorta di oggetto Lua e chiamando quella funzione entrerà in una funzione di invio messaggi che scaccherà il bersaglio e gli argomenti (se necessario ) e procedere a chiamare la funzione dall'indirizzo.

    
risposta data 21.05.2013 - 08:59
fonte
2

Per ribadire la vostra preoccupazione, si dispone di un pezzo di software, il motore di gioco, che supporta un particolare linguaggio di scripting, Lua, ma sono sicuri di come esporre, l'accesso, e interporre oggetti di gioco e gli eventi a Lua, o per fare il lo stesso con il tuo driver esterno personalizzato (un editor basato su C ++).

Il motore di gioco stesso ha probabilmente un insieme di metodi o decoratori per l'esposizione di oggetti ed eventi che consentirebbero il tracciamento tramite fonti o programmi esterni. Probabilmente ha anche il proprio protocollo specifico per la manipolazione da parte di quelle fonti esterne. Senza sapere quale particolare software o motore stai guardando, è impossibile dare una guida specifica.

Quello che posso suggerire, è rivedere la documentazione di quel particolare motore. In poche parole, guarda come le cose conosciute sono esposte alla sceneggiatura e imita il metodo con cui queste cose vengono esposte e messe in atto.

Ad esempio, Torque3D offre una documentazione che mostra come esporre oggetti allo script (o una fonte esterna come un editor basato su C ++ compilato).

link

link

Il secondo documento mostra come creare call-in, call-out, tipi esposti e limitazioni alla forma della definizione della funzione all'interno del motore di gioco.

Affinché lo script o il driver / editor di consumare e mestieri quei tipi di dati esposti, a un certo livello è necessario essere in grado di creare tipi di dall'interno del linguaggio di scripting (o editore) che può essere marshalling, o trasformato, su strutture che corrispondono al formato e alle convenzioni del motore, fondamentalmente una mappa. Ogni lingua ha il proprio modo di implementare un layout di strutture, un ordine di campo e un dimensionamento. Alcuni seguono una particolare convenzione molto bene, altri usano la propria convenzione.

La mappa potrebbe essere ingombrante o brutto da usare nello script, quindi si consiglia di creare un secondo tipo aggiuntivo 'pulito' nel linguaggio di scripting o del driver / redattore per l'uso normale, con un metodo di 'trasformare' di plasmare il 'tipo facile da usare' nel tipo che può essere eseguito il marshalling sul motore.

Lua ha il proprio modo di lavorare con altri linguaggi, e la sua documentazione parla specificamente dell'accesso e del consumo del software [compilato] basato su C: link (guarda la sezione IV)

    
risposta data 22.05.2013 - 21:17
fonte
-1

Potresti creare il linguaggio di scripting nel motore in modo che il motore possa prendere alcuni file formattati nella tua lingua e inventare alcune grammatiche per il tuo programma per compilare questi file di script durante l'esecuzione e utilizzare uno stack per spingere chiamate di metodo, variabili dichiarazioni ecc. come un normale programma in esecuzione, anche se penso che limiti il tuo linguaggio di scripting solo ai metodi con cui è scritto il tuo motore, a meno che tu non crei buone grammatiche per la lingua che si lega anche alla lingua originale in cui è scritto il motore.

    
risposta data 10.03.2015 - 05:10
fonte

Leggi altre domande sui tag