Historique des modifications - Message

Message #11062

Sujet: systeme de script pour irrlicht


Type Date Auteur Contenu
Dernière modification 07-01-2013 14:49:29 johnplayer
Dans ce cas l'utilisation que tu veux en faire est bonne. Les langages de scripts ne se soucis pas de ce que tu veux scripter donc pas besoin de irrMachinTruc.^^
J'utilise LUA et Lunar (pour scripter les fonctions membres avec LUA).

Pour télécharger LUA c'est ici.
Pour l'utilisation de LUA et Lunar, c'est ici.
Le tutoriel est vraiment simple, il m'a permis de scripter des fonctions très facilement et rapidement.

Pour Lunar, il n'explique pas bien donc, en fait :
1/ tu vas sur cette page : ici;
2/ tu descends dans la page jusque "lunar.h for Lua 5.0";
3/ tu créé un fichier lunar.h (dans le répertoire des .h de LUA) et tu copies le code de :

extern "C" {
#include "lua.h"
#include "lauxlib.h"
}

jusque :

#define LUNAR_DECLARE_METHOD(Class, Name) {#Name, &Class::Name}

4/ tu as juste à inclure le fichier lunar.h et LUA sera inclu en même temps. Et il y a une lib à linker.

Ah, j'oubliais! Il y a aussi luacgui qui te permet de précompilé tes scripts. Disponible ici.
Maintenant, 1h ou 2 devrait suffir pour te faire la main.

EDIT:

Tiens j'ai retrouvé une classe d'essai que j'avais fait à l'époque. Associée au tuto, tu devrais pouvoir intégrer ça très vite.
Elle te montre comment intégrer LUA et LUNAR, comment créer une classe qui lance des scripts sur demande et une fonction à scripter.
Pour utiliser cette classe, tu créés une instance au début de ton programme, à chaque fois que tu veux lire un script tu utilises la fonction runScript("filename").
Lorsque tu quitte l'application tu détruis l'instance. C'est un exécuteur de script en fait.

ScriptReader.h

Code c++ :


#ifndef SCRIPTREADER_H
#define SCRIPTREADER_H

#include "../../LUA/include/lua.hpp"
#include "../../LUA/include/lunar.h"

#include "../../Irrlicht SVN/include/irrlicht.h"
using namespace irr;
using namespace core;
using namespace video;
using namespace scene;
using namespace gui;
using namespace io;


class ScriptReader
{
    /// INTEGRATION LUA ET LUNAR
    friend class Lunar<ScriptReader>;
    static const char* className;
    static Lunar<ScriptReader>::RegType methods[];

    public:
        /// CONSTRUCTEUR
        ScriptReader(IrrlichtDevice* device);
        /// DESTRUCTEUR
        virtual ~ScriptReader();

        /// FONCTIONS
        bool runScript(stringc pathfile);

    protected:
        /// CONSTRUCTEUR LUNAR
        ScriptReader(lua_State* state);

        /// MEMBRES
        lua_State* LUAEnv;
        IrrlichtDevice* Device;

        /// FONCTIONS
        void affectFonctionLua();

        /// FONCTIONS RESERVEE AU SCRIPTING
        /** ScriptReader **/
        int SCRIPTREADER_print(lua_State* state);

};


#endif // SCRIPTREADER_H



ScriptReader.cpp

Code c++ :


#include "ScriptReader.h"


/// enregistrement aupres de lunar
const char* ScriptReader::className = "ScriptReader";

/// on initialise le tableau des méthodes de la classe.
Lunar<ScriptReader>::RegType ScriptReader::methods[] =
{
    // ScriptReader Méthodes
    LUNAR_DECLARE_METHOD(ScriptReader, SCRIPTREADER_print),
    // toujours mettre ça
    {0,0}
};

ScriptReader::ScriptReader(IrrlichtDevice* device) : Device(device)
{
    /// créé l'environnement LUA
    LUAEnv = lua_open();
    /// chargement des libs
    luaL_openlibs(LUAEnv);
    /// on enregistre la classe aupres de lua
	Lunar<ScriptReader>::Register(LUAEnv);
    /// affecte les fonctions utilisable dans les scripts
    affectFonctionLua();
}

ScriptReader::ScriptReader(lua_State* state){}

ScriptReader::~ScriptReader()
{
    /// libération mémoire
    lua_close(LUAEnv);
}


bool ScriptReader::runScript( stringc pathfile)
{
        /// lit le fichier script
        if( luaL_dofile(LUAEnv, pathfile.c_str()) != 0 ) { printf("Erreur : %s\
", lua_tostring(LUAEnv,-1)); return false; }
        else return true;
}

/*************************************************
                FONCTIONS PROTEGEES
*************************************************/

void ScriptReader::affectFonctionLua()
{
    /// on enregistre la classe pour que LUA puisse appeler les methode de ScriptReader.
    Lunar<ScriptReader>::push(LUAEnv, this);
    lua_setglobal(LUAEnv, "SR"); // SR pour ScriptReader, ça va plus vite à écrire^^
    /// on enregistre nos fonctions C++ pour qu'elles soient accessibles depuis Lua
   /* pour celle de ScriptReader, c'est fait dans Lunar<ScriptReader>::RegType ScriptReader::methods[] en haut de ce fichier */
}


/*************************************************
        FONCTIONS RESERVEE AU SCRIPTING
*************************************************/
/** ScriptReader **/
// SR:SCRIPTREADER_print("String à affichée");
int ScriptReader::SCRIPTREADER_print(lua_State* state)
{
    if( lua_gettop(state) == 1 )
        if( lua_isstring(state,1) )
        {
            printf("%s\
",lua_tostring(state,1));
            return 0;
        }
    return -1;
}


Sript.lua
-- ligne qui affiche un texte dans la console (cette ligne est un commentaire à cause des "--")
SR:SCRIPTREADER_print("Debut du Script : 1-Post_Lancement");
Création du message 07-01-2013 14:24:44 johnplayer
Dans ce cas l'utilisation que tu veux en faire est bonne. Les langages de scripts ne se soucis pas de ce que tu veux scripter donc pas besoin de irrMachinTruc.^^
J'utilise LUA et Lunar (pour scripter les fonctions membres avec LUA).

Pour télécharger LUA c'est ici.
Pour l'utilisation de LUA et Lunar, c'est ici.
Le tutoriel est vraiment simple, il m'a permis de scripter des fonctions très facilement et rapidement.

Pour Lunar, il n'explique pas bien donc, en fait :
1/ tu vas sur cette page : ici;
2/ tu descends dans la page jusque "lunar.h for Lua 5.0";
3/ tu créé un fichier lunar.h (dans le répertoire des .h de LUA) et tu copies le code de :

extern "C" {
#include "lua.h"
#include "lauxlib.h"
}

jusque :

#define LUNAR_DECLARE_METHOD(Class, Name) {#Name, &Class::Name}

4/ tu as juste à inclure le fichier lunar.h et LUA sera inclu en même temps. Et il y a une lib à linker.

Ah, j'oubliais! Il y a aussi luacgui qui te permet de précompilé tes scripts. Disponible ici.
Maintenant, 1h ou 2 devrait suffir pour te faire la main.

EDIT:

Tiens j'ai retrouvé une classe d'essai que j'avais fait à l'époque. Associée au tuto, tu devrais pouvoir intégrer ça très vite.
Elle te montre comment intégrer LUA et LUNAR, comment créer une classe qui lance des scripts sur demande et une fonction à scripter.
Pour utiliser cette classe, tu créés une instance au début de ton programme, à chaque fois que tu veux lire un script tu utilises la fonction runScript("filename").
Lorsque tu quitte l'application tu détruis l'instance. C'est un exécuteur de script en fait.

ScriptReader.h

Code c++ :


#ifndef SCRIPTREADER_H
#define SCRIPTREADER_H

#include "../../LUA/include/lua.hpp"
#include "../../LUA/include/lunar.h"

#include "../../Irrlicht SVN/include/irrlicht.h"
using namespace irr;
using namespace core;
using namespace video;
using namespace scene;
using namespace gui;
using namespace io;


class ScriptReader
{
    /// INTEGRATION LUA ET LUNAR
    friend class Lunar<ScriptReader>;
    static const char* className;
    static Lunar<ScriptReader>::RegType methods[];

    public:
        /// CONSTRUCTEUR
        ScriptReader(IrrlichtDevice* device);
        /// DESTRUCTEUR
        virtual ~ScriptReader();

        /// FONCTIONS
        bool runScript(stringc pathfile);

    protected:
        /// CONSTRUCTEUR LUNAR
        ScriptReader(lua_State* state);

        /// MEMBRES
        lua_State* LUAEnv;
        IrrlichtDevice* Device;

        /// FONCTIONS
        void affectFonctionLua();

        /// FONCTIONS RESERVEE AU SCRIPTING
        /** ScriptReader **/
        int SCRIPTREADER_print(lua_State* state);

};


#endif // SCRIPTREADER_H



ScriptReader.cpp

Code c++ :


#include "ScriptReader.h"


/// enregistrement aupres de lunar
const char* ScriptReader::className = "ScriptReader";

/// on initialise le tableau des méthodes de la classe.
Lunar<ScriptReader>::RegType ScriptReader::methods[] =
{
    // ScriptReader Méthodes
    LUNAR_DECLARE_METHOD(ScriptReader, SCRIPTREADER_print),
    // toujours mettre ça
    {0,0}
};

ScriptReader::ScriptReader(IrrlichtDevice* device) : Device(device)
{
    /// créé l'environnement LUA
    LUAEnv = lua_open();
    /// chargement des libs
    luaL_openlibs(LUAEnv);
    /// on enregistre la classe aupres de lua
	Lunar<ScriptReader>::Register(LUAEnv);
    /// affecte les fonctions utilisable dans les scripts
    affectFonctionLua();
}

ScriptReader::ScriptReader(lua_State* state){}

ScriptReader::~ScriptReader()
{
    /// libération mémoire
    lua_close(LUAEnv);
}


bool ScriptReader::runScript( stringc pathfile)
{
        /// lit le fichier script
        if( luaL_dofile(LUAEnv, pathfile.c_str()) != 0 ) { printf("Erreur : %s\
", lua_tostring(LUAEnv,-1)); return false; }
        else return true;
}

/*************************************************
                FONCTIONS PROTEGEES
*************************************************/

void ScriptReader::affectFonctionLua()
{
    /// on enregistre la classe pour que LUA puisse appeler les methode de ScriptReader.
    Lunar<ScriptReader>::push(LUAEnv, this);
    lua_setglobal(LUAEnv, "SR"); // SR pour ScriptReader, ça va plus vite à écrire^^
    /// on enregistre nos fonctions C++ pour qu'elles soient accessibles depuis Lua
   /* pour celle de ScriptReader, c'est fait dans Lunar<ScriptReader>::RegType ScriptReader::methods[] en haut de ce fichier */
}


/*************************************************
        FONCTIONS RESERVEE AU SCRIPTING
*************************************************/
/** ScriptReader **/
// SR:SCRIPTREADER_print("String à affichée");
int ScriptReader::SCRIPTREADER_print(lua_State* state)
{
    if( lua_gettop(state) == 1 )
        if( lua_isstring(state,1) )
        {
            printf("%s\
",lua_tostring(state,1));
            return 0;
        }
    return -1;
}


Sript.lua
-- ligne qui affiche un texte dans la console (cette ligne est un commentaire à cause des "--")
SR:SCRIPTREADER_print("Debut du Script : 1-Post_Lancement");

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
481 invités en ligne
membre en ligne: -
RSS Feed