|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
[C++] Interfacciare con linguaggio di scripting
Salve a tutti
![]() per questo gioco ho già implementato svariate interfacce generiche, che mi permettono di definire il comportamento degli oggetti di gioco semplicemente sovrascrivendo un paio di funzioni per classe figlia... al che, mi è venuto in mente che potrei utilizzare un linguaggio di scripting, sia per facilitarmi la vita, sia per espandere le possibilità a chi lo vorrà moddare... Il linguaggio deve essere non molto espressivo e semplice, adatto per configurare oggetti, per semplici equazioni e clicli e per lanciare funzioni C++. Una cosa che gradirei parecchio sarebbe creare a runtime nuovi tipi di C++, ma credo che non si possa fare ![]() Così ad occhio i migliori mi sembrano Phyton e Lua, e propendo verso il secondo per la maggior semplicità di utilizzo... in fondo Phyton non nasce come linguaggio di scripting, e lascerei troppa libertà agli users (tipo accedere al sistema da dentro il gioco ![]() E poi non ho idea di che wrapper usare... qual'è il migliore? ![]() Aspetto solo i vostri consigli! ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Beh, se il gioco gira sulla LORO macchina, il fatto che vi accedano qual è il problema?
![]() Al limite puoi rimuovere da Python le librerie che ritieni "pericolose", ma... per me è inutile. Per Python ti consiglio di utilizzare Cython oppure BOOST.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2002
Città: Cosenza --> Roma
Messaggi: 853
|
[cdimauro mode on]
ma quale Lua, usa Python ![]() [/cdimauro mode off] in ogni caso, python E' nato come linguaggio di scripting ![]() Come lib prova a vedere boost.python
__________________
GNU MyServer Wants YOU!! We live thinking we will never die. We die thinking we had never lived. Jason Becker Ultima modifica di cisc : 21-08-2008 alle 11:54. Motivo: azz, mi ha anticipato!! |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Il fatto è che non so se girerà sulla LORO macchina... le mods girano, e dopo se a uno va in pappa il computer per una mod maligna la colpa viene subito addossata a me. Meglio evitare
![]() Cmq grazie per i consigli, mi documenterò su quei wrappers... EDIT: Credo proprio che andrò con boost.python, che mi sembra la roba più seria e funzionante che ho visto. Solo veramente complicato ![]() Cmq, mi sapete dire quanto impatta questo nelle prestazioni? Io ho paura che sia davvero pesante "chiamare l'interpreter Python a runtime"... lo stesso Civilization IV era lento da far schifo... siccome che sto sul filo dei 60 fps sui pc vecchi, e manco è completo, le prestazioni sono un'affare più importante della flessibilità mi sa... Ultima modifica di Tommo : 21-08-2008 alle 12:08. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Mica ti devi riscrivere l'intero gioco in Python: che vuoi farci con gli script?
Al limite prova psyco http://psyco.sourceforge.net/ Quanto boost.python, è molto meglio dell'uso delle API C. Meglio ancora ci sarebbe Cython, comunque.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Codice:
//pseudoscript Weapon gun model gun.mesh ammo 12 reload_time 5 //puntatore a funzione callback, implementata nello script use_callback use_gun(Man* user) end //C++ ... Weapon* w = SceneManager->createWeapon( "gun" ); Quindi volevo seguire lo stesso procedimento per i calback: Codice:
//pseudoC++ //l'omino vuole usarla man->weapon->use( man ); //use e' definita in un linguaggio di scripting function use_gun( Man user ) //ma puo' chiamare funzioni dell'engine C++ shoot( user.getDirection() ); end Ovviamente, l'applicazione principale e' in C++, e quindi Python andrebbe embedded... EDIT: In realtà mi piace di nuovo... dovrebbe bastare fare una classe + l'uso di Boost::Python: ![]() ![]() Ultima modifica di Tommo : 21-08-2008 alle 14:20. |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Allora scriviti un tuo linguaggio di script usando ANTLR, e non se ne parla più: così rimani totalmente in ambito C++.
![]() Comunque boost.python elimina buona parte dei problemi relativi alla gestione del reference count con gli oggetti Python, e ti assicuro che è una discreta rogna. ![]() Le API le devi usare, quando servono... perché Python le espone così. EDIT: manco il tempo di risponderti che hai già cambiato idea. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Grazie per l'aiuto... scusami l'indecisione
![]() Per ora direi che tengo il Python, sulla carta sembra molto adatto, e se attivo l'interpreter non sembra esserci alcun calo di prestazioni fin da subito. Al più presto farò un test di "stress", ma per ora mi sembra più che adatto. Però ora che ho addirittura convertito un gioco al sacro Pitone, dovrò chiederti delucidazioni di tanto in tanto... e inizio subito ![]() Questo codice compila correttamente (certo se mi avessero detto subito che il namespace era boost:: python sarebbe stato più facile) Codice:
void GameplayState::initialise() { Py_Initialize(); object main_module = import("__main__"); object main_namespace = main_module.attr("__dict__"); object ignored = exec("hello = file('hello.txt', 'w')\n" "hello.write('Hello world!')\n" "hello.close()", main_namespace); Quote:
![]() |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Francamente nemmeno io: non mi dice nulla.
![]() Non puoi cominciare con qualche esempio "base" (qualcosa dovrebbe esserci per boost.python)? Per le prestazioni non ti preoccupare. Al limite puoi usare psyco (dopo che lo installi sono sufficienti DUE istruzioni per abilitarlo). ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
![]() E non dice nient'altro in quello schifo di tutorial... l'errore viene probabilmente da una cattiva inizializzazione di qualcosa... spero di venirne a capo ![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Open source rulez.
![]() Fammi sapere qualcosa se ne vieni a capo, se non ti è troppo di disturbo. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Mi chiedo se fosse corretto in python quel codice... ![]() Ora provo a fare un mio bel file .py e creare una funzione un pò più complessa, per individuare magari altri errori.... |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quello è codice Python. Forse è il \n mancante nell'ultima riga a creare problemi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Dunque. Ho scoperto che quell'eccezione viene lanciata per un qualsiasi errore di Python, tipo sintassi, file non trovato, un pò tutto insomma.
Ora invece ho creato un Modulo, l'ho importato, ma non riesco a chiamarne le funzioni... mi sa che passo a Cython, qualsiasi cosa sia. La documentazione di Boost è semplicemente penosa. ![]() Codice:
void GameplayState::initialise() { Py_Initialize(); object main_module = import("__main__"); object main_namespace = main_module.attr("__dict__"); object test = import("test"); object test_namespace = test.attr("__dict__"); object ignored = exec("print 'Hello World'\n", main_namespace, test_namespace); object i = exec("hello()\n", main_namespace, test_namespace); ![]() Codice:
#Modulo di prova def hello(): print 'Hello World' |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Guarda che il diavolo è meno brutto di come lo si dipinga.
![]() Il tuo problema al momento non è né nel C++ né in boost.python: è in Python. Semplicemente... non lo conosci! ![]() Ecco qui il codice corretto: Codice:
void GameplayState::initialise() { Py_Initialize(); object main_module = import("__main__"); object main_namespace = main_module.attr("__dict__"); object test = import("test"); object test_namespace = test.attr("__dict__"); object ignored = exec("print 'Hello World'\n", main_namespace, test_namespace); object i = exec("test.hello()\n", main_namespace, test_namespace); ![]() ![]() Se vuoi accedere alla funzioni contenute in test senza dover specificare prima il nome del modulo, devi usare: Codice:
from test import * # Per importare TUTTI gli oggetti di test. ALTAMENTE SCONSIGLIATO!!! from test import hello # Importa soltanto hello, che adesso è disponibile nel namespace
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Ecco, non funziona
![]() Ho provato: Codice:
object i = exec("test.hello()\n", main_namespace, test_namespace); object i = exec("from test import hello\n"+"test.hello()\n", main_namespace, test_namespace); object i = exec("from test import hello\n"+"hello()\n", main_namespace, test_namespace); object i = exec("from test import *\n"+"hello()\n", main_namespace, test_namespace); object i = exec("from test import *\n"+"hello()\n", main_namespace); BOH. ![]() |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
![]() ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
FAIL.
Se cancello il file mi da lo stesso errore...cioè non cambia nulla Il (per il momento) maledetto Python dove li va a cercare sti dannati moduli da importare? E PERCHESANTODDIO non mi ha detto per tutto il pomeriggio che non lo trovava? ![]() Io il file l'ho messo nella cartella dell'eseguibile del mio programma... magari sbaglio ![]() |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Qui il problema è boost. Python ti assicuro che da solo funziona di lusso.
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Codice:
Py_Initialize(); PyRun_SimpleString( "import test\n" "from test import *\n" "test.hello(5)\n"); Codice:
def hello(n): print 'Hello World' Infatti Boost se la cava benissimo se gli passo il nome del file. E' proprio quel disperato dell'interpreter che non trova i moduli... |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:16.