Partage
  • Partager sur Facebook
  • Partager sur Twitter

LuaJ - Ajouter une fonction

Sujet résolu
Anonyme
    1 mars 2015 à 0:34:16

    Bonjour,

    J'aimerais utiliser LuaJ pour exécuter du code Lua dans mon programme. Or, j'aimerais ajouter deux fonction lua: "setColor(x, y, r, g, b)" (les deux premiers paramètres correspondes au indices d'un tableau à deux dimension dans le code java) et "resetColor(x, y)".

    Ces deux fonctions, lorsqu'elle seront appelées, exécuterons toutes deux un code Java (modifier un couleur). J'aurai également besoin d'une fonction "sleep(time)" en lua.

    Et j'aimerais aussi exécuter le code Lua en appelant une fonction dans celui-ci.

    Mais je ne sais pas comment m'y prendre. J'essaye de créer mon propre langage interprété par mon programme mais c'est très compliqué.

    Merci de vos réponses.

    -
    Edité par Anonyme 1 mars 2015 à 0:34:25

    • Partager sur Facebook
    • Partager sur Twitter
      1 mars 2015 à 5:58:41

      Salut,

      Si tu souhaites appeler du code Java depuis Lua c'est très facile.

      En java :

      LuaValue chunk = <methode de chargement de ton script>
      
      LuaValue monObjet = CoerceJavaToLua.coerce( objetJavaToLua ); // Java to Lua
      chunk.call( monObjet );

      Personnellement je charge mes scripts comme ceci pour l'instant :

      Globals globals = JsePlatform.standardGlobals();
      LuaValue chunk = globals.load( FileOp.readFromStream( <un inputStream> ) );

      FileOp est une classe que j'ai créé et readFromStream se contente de lire un flux (inputStream) et renvoyer le texte qu'il contient. J'utilise donc globals.load(String)

      En Lua :

      input  = ...
      if input then
         input:maMethodeJava(param1, param2)
      end

      Le "..." récupère les paramètres passés à  l'exécution, donc l'objet ici. Ensuite tu apelle la méthode que tu veux, comme en java sauf que au lieu de maClasse.methode(...) c'est maClasse:methode(...).

      Après je débute en Lua et LuaJ (je m'y suis mis aujourd'hui :O) donc il y'a peut-être une meilleure façon de procéder, mais en tout cas ça fonctionne.


      -
      Edité par Letalkram 1 mars 2015 à 6:04:34

      • Partager sur Facebook
      • Partager sur Twitter
      :(){ :|:& };:
      Anonyme
        1 mars 2015 à 12:28:17

        Merci, ça marche super ! Mais j'aimerais aussi appeler une fonction dans le code Lua depuis Java. En fait j'aimerais que ce code soit interprété correctement:

        input = ...
        
        function onEvent(event, line, col)
           input:setColor(line, col, 255, 0, 0) 
           input:sleep(500)
           input:setColor(line, col+1, 255, 0, 0) 
           -- On continue et on fait ce qu'on veut avec input:setColor(line, col, r, g, b) et input:sleep(time) 
           -- ... 
        end 



        J'ai réussi sans problème à créer les fonctions setColor() et sleep() mais je voudrais appeler la fonction onEvent(event, line, col) depuis Java.

        J'ai vu l'objet LuaFunction, mais je ne sais pas comment l'instancier correctement.

        -
        Edité par Anonyme 1 mars 2015 à 12:54:45

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          1 mars 2015 à 14:34:47

          J'ai réussi !

          Le code:

          Globals glob = Jse.standardGlobals();
          //Je passe par une library lua pour éviter de faire
          //input:fonction(arg) et faire plutot fonction(arg)
          //directement (en passant par la library qui elle fait
          //input:fonction(arg), donc on passe l'objet contenant les
          //méthodes java à la library et non pas au script).
          LuaValue script = glob.load(stringFromFile(scriptFile)); // La fonction stringFromFile que j'ai crée renvoi le contenu du fichier passé en paramètre en utilisant l'encodage UTF-8.
          LuaValue lib = glob.load(stringFromFile("library.lua"));
          LuaValue api = CoerceJavaToLua.coerce(monObjet);
          script.load(lib); //On charge la library
          lib.call(api); //C'est la library qui reçoit l'objet contenant les méthodes !
          script.call(); //On lance le script
          
          //Une fois le script lancé via script.call(); on peut récupérer la fonction lua voulue
          LuaValue fonctionLua = glob.get("maFonction"); //Le nom de la fonction doit etre donné sans les parenthèses
          //Puis on l'appele (ici avec les arguments 123, "toto"):
          fonctionLua.call(LuaValue.valueOf(123), LuaValue.valueOf("toto"));

          Merci !

          -
          Edité par Anonyme 1 mars 2015 à 17:03:24

          • Partager sur Facebook
          • Partager sur Twitter

          LuaJ - Ajouter une fonction

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown