Partage
  • Partager sur Facebook
  • Partager sur Twitter

[structure code]Importer un fichier précis selon une donnée

Importations imbriquées...

Sujet résolu
    4 décembre 2011 à 23:06:42

    Bonsoir,

    Ayant fini le tutoriel sur python, et celui sur pygame.
    Je me lance prudemment dans la création d'une base souple pour un tactical-RPG.

    Je n'ai pas encore de problème avec le code, mais plutôt dans la structure générale du programme, qui devrait ressembler à ceci:

    1 - Le launcher (Ren'py)
    Un logiciel qui me permettra de créer la majeur partie du jeu, avec un langage qui lui est propre, et d'intégrer du code python pour élargir ses possibilités, en l'occurrence pour rajouter des scène de bataille tactiques.
    Le script sera sépara en plusieurs fichiers, dont un par bataille:
    Dans l'en-tête du fichier correspondant à une bataille, je demande au logiciel, via une ligne python, d'importer le fichier principal du jeu.
    Un peu plus tard dans le script, je lui demanderais de l'exécuter.
    2 - Le fichier principal (scroll.py, parce que je voulais d'abord essayer de créer un scrolling)
    Il contient en quelques sorte les règles du jeu, les réactions...
    Lorsque qu'il est importé par Ren'Py, il importera lui-même la liste d'objet, et le fichier correspondant à la bataille voulue.
    Pour éviter que le code du jeu ne soit exécuté dès l'importation, celui-ci est contenu dans une fonction main()
    3 - La liste d'objet (object.py)
    Contiendra la liste de tout les objets utilisable en jeu: les npc, les personnages jouables, les éléments de décors...
    Il est importé directement depuis "scroll.py"
    4 - Différents fichier de batailles (Actuellement: level.py)
    Un par bataille
    Contient les informations telles que les personnages joués lors de cette batailles, le décors, les conditions de victoires et de défaites...
    Un seul d'entre eux sera importé depuis "main.py", celui à importer devra être déterminé depuis le launcher.

    Le problème, c'est que je ne sais pas comment je peux dire à main.py d'importer tel ou tel fichier, en fonction de ce que contient le launcher. :/
    Y a déjà pas mal de truc qui me sont passé par l'esprit, plus ou moins voués à l'échec ou bien complètement dénués de praticité...
    -Importer le niveau dans le launcher:
    Voué à l’échec, les données du niveaux ne seront pas définis dans le code de "scroll.py"
    -Importer le niveau depuis le launcher, et importer scroll.py depuis le niveau:
    Ça revient au même, les variables du niveau ne sont pas beaucoup plus défini dans "scroll"
    -Importer le niveau dans main, et créer un "scroll.py" par bataille:
    Absolument pas pratique, si je veux modifier une règle, corriger un bug,.. je doit me retaper le code de chaque batailles...
    -Créer dans "scroll.py" une fonction "initialise()", qui prend en paramètre une données, et en deduit le niveau à importer, on appellera cette fonction dans l'entête du script du launcher:
    Le niveau est bien importé dans "scroll.py"... mais uniquement dans ladîte fonction "initialise()".
    Et donc, pas dans "main()"
    -Passer une données en paramètre de la fonction "main()", et en déduire le niveau à importer à l'aide de blocs "if":
    Dans un code python de base, je pense que ça aurait pu marcher...
    Sauf qu'on est pas dans un code python normal, on est dans un code (théoriquement) compatible Ren'Py! Donc si je passe le niveau en paramètre, je dois attendre de lancer jeu avant d'importer le niveau, et donc de l'importer au milieu du script du launcher.
    Et ça, importer quelque chose hors de l'entête, Ren'Py il aime pas...
    -Encore à l'aide de "if", directement dans le corps de "scroll.py", importer le niveau d'après une variable du launcher:
    C'est encore la solution qui me paraissait la plus pertinente, sauf que pour exécuter ces "if", je dois dans le launcher utiliser la ligne python "import scroll;" et avec ça je n'ai aucun moyen de faire passer une variable du launcher vers "scroll.py"...

    À tout hasard, j'avais aussi essayé des trucs comme; "import variable_str_contenant_le_nom_du_niveau", mais python y s'en fout, y cherche le fichier avec le nom de la variable plutôt que le fichier du nom de sa valeur...
    Enfin, je suis en panne de mauvaises idées, j'espère que vous en aurez des meilleurs à me proposer. ^_^

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
    Y s'taient cachés les steaks hachés.
      5 décembre 2011 à 11:05:43

      Salut,

      Bien que cela me semble totalement louche que ta conception t'impose ce genre de trick (ta séparation des divers fichiers me semble peu pertinente à première vue), tu trouveras la réponse simplement en lisant la doc de la fonction __import__().

      En général, on réserve ce genre d'imports dynamiques pour des mécanismes très ciblés (le chargement de plugins facultatifs, par exemple), sans baser une conception entière dessus.
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        5 décembre 2011 à 18:18:57

        Houlà, j'ai pas tout compris à la documentation... Mais j'ai déjà quelques retours positifs de l’interpréteur python. ^^

        Déjà, j'ai réussi à importer un module en fonction d'une variable:
        >>>rd="random"
        >>>rand=__import__(rd)
        >>>rand.randrange(5)
        2


        J'ai aussi saisi une histoire de "niveau d'importation", j'ai pas trop compris comment ça fonctionnait, mais je crois que ça me permettrais de reprendre mon idée de la fonction "initialise()"?
        Avec un truc dans le goût:
        def initialise(filename):
            battle=__import__(filename, autre_instruction_supplémentaires);
        


        Edit:

        bon, n'en n'ayant toujours pas compris plus, j'ai essayé un truc assez moche... mais qui ne renvoie pas l'erreur à laquelle je m'attendait.
        Mon launcher ressemble à ça:
        #Ici l'entête, ou on doit tout importer
        import scroll
        scroll.main("level");
        
        #Ici le corps du script, ou on lance le programme
        scroll.main(1);
        

        Et "scroll.py" ressemble globalement à ça:
        def main(action):
            #Si on entre 1, il lance le programme, sinon, il importe le niveau
            if action!=1:
                battle=__import__(action)
            else:
                print(battle.a);
                #a est une variable que j'ai mis dans "level.py" pour voir si je réussissait à l'importer dans main()
        


        Je m'attendais au pire à une erreur du genre "name 'battle' is not defined"... Et bien pas du tout:
        File "C:/user/ed/desktop/scrolling test/launcher.py", line 7 in <module>
            scroll.main(1)
        File "C:/user/ed/desktop/scrolling test/scroll.py", line 35 in main
            print(battle.a)
        UndboundLocalError: local variable 'battle' referenced before assignement

        Je comprend pas du tout pourquoi c'est cette erreur là qui m'est donnée.
        D'un coté, c'est un peu rassurant parce que ça veux dire que j'ai réussi à importer "level.py" quelque part dans "scroll.py"... mais ce que j'ai du mal à comprendre c'est qu'il en vienne à me parler de variables locales. o_O

        ReEdit:
        J'aurais put y penser une seconde plus tôt, mais vu que c'est un problème de variables locales et globales, il m'a suffit de rajouter la ligne "global battle" dans mon bloc "if action!=1:" pour voir le code fonctionner correctement.
        Et paradoxalement, si je la place en tout début de code, je continue à avoir cette erreur...

        Ceci dit j'ai encore la sensation d'avoir fait un truc hideux, et j'aimerais bien qu'on m'explique ce que j’étais sensé comprendre. :D
        • Partager sur Facebook
        • Partager sur Twitter
        Y s'taient cachés les steaks hachés.

        [structure code]Importer un fichier précis selon une donnée

        × 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