Les Voltigeurs d'URU LIVE
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Réassort du coffret Pokémon 151 Électhor-ex : où l’acheter ?
Voir le deal

Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande

3 participants

Aller en bas

Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande Empty Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande

Message  V@-Michel Mer 4 Juil - 19:08

Et bien, il ne m'a pas fallu très longtemps pour vous présenter cette fonction qui vous permettra de vous téléporter depuis n'importe quel âge vers le bureau de Kadish à Ahnonay.
Je remercie Lyrositeur qui m'a mis sur la voie hier Very Happy

Je vais tout d'abord vous expliquer le problème.

L'avatar est dans un âge quelconque et il doit aller au bureau de Kadish en sphère 4 d'Ahnonay.

Ma fonction doit donc :

1. Regarder si on est déjà à Ahnonay. Sinon y aller.
2. Regarder si on est déjà en sphère 4. Sinon y aller.
3. Se rendre au bureau de Kadish.

Donc si je place toutes les instructions les unes à la suite des autres dans une fonction, appelée, par exemple AuBureau(), cela devrait fonctionner. Et bien non Evil or Very Mad
Pourquoi ?
Vous savez que lorsque vous utilisez un livre de liaison pour vous rendre dans un âge, il s'écoule quelques secondes avant d'y arriver. Vous voyez pendant ce temps les symboles tournants sur un fond noir.

Python, lui ne s'occupe pas du temps qui s'écoule pour que l'avatar se déplace d'un âge à un autre. Lui, il enchaîne en une fraction de seconde toutes les instructions que vous avez tapées dans votre fonction. Mais, certaines de ces instructions, comme vous allez le voir, ont besoin de savoir précisément où se trouve l'avatar pour s'exécuter correctement, et, comme il y a un très grand décallage entre les "déplacements" de l'avatar et l'exécution des instructions, tout se passe comme si l'avatar était toujours dans l'âge de départ Razz . Voilà pourquoi, mon avatar arrivait juste dans la dernière sphère qu'il avait quittée en dernier et n'allait jamais au bureau de Kadish, malgré que toutes mes instructions soient correctes. Je devais donc les scinder en 3 : une pour aller à Ahnonay, une seconde pour aller en sphère 4 et une troisième pour aller au bureau de Kadish.
Mais c'était sans compter sur ma ténacité et l'aide de Lyrositeur qui m'a aiguillé sur la fonction PtSetAlarm()

Cette fonction permet de lancer une instruction après un certain temps, tout en laissant l'instruction en cours se terminer Very Happy
Et voilà comment il est possible de dire à Python de se calmer un peu et laisser le temps à mon avatar de se téléporter vers Ahnonay avant de continuer avec l'instruction suivante.

Voici la fonction AuBureau() et son explication :
Avant tout j'ai créé deux autres fonctions qui seront appelées par la fonction AuBureau()

La première va téléporter mon avatar dans la sphère que je désire. Par exemple, si je tape Sphere(3), mon avatar ira en sphère 3 au point de liaison par défaut.
Attention, je n'ai pas mis de contrôle pour voir si on n'a pas tapé un numéro de sphère qui n'exste pas. Je sais encore calculer jusque 4 ...Razz

Code:
def Sphere (val = 1) :
"""Changer de sphere a Ahnonay"""

ageSDL = PtGetAgeSDL()
ageSDL ["ahnyCurrentSphere"] = (val,)
PtConsole ('Net.linkwithOwnedBook Ahnonay')


La seconde fonction va retourner le numéro de la sphère dans laquelle on se trouve et si on n'est pas dans une sphère, donc si on n'est pas à Ahnonay, elle retourne la valeur 0.

Code:
QSphere() :
"""pour savoir dans quelle sphere on se trouve"""

ageName = PtGetAgeName ()
if ageName != 'Ahnonay' :
    print "Vous n'etes pas à Ahnonay"
    return 0
else:
    ageSDL = PtGetAgeSDL ()
    sphere = ageSDL ["ahnyCurrentSphere"] [0]
    return sphere

Et ma fonction principale :

Code:
def AuBureau () :
"""Pour aller jusqu'au Bureau de Kadish en sph 4."""

Sphereactuelle =QSphere ()                                                                      #je regarde dans quelle sphere on se trouve
if Sphereactuelle == 0:                                                                            #1. si la valeur est égale à O, on n'est pas a Ahnonay
    PtConsole ('Net.linkWithOwnedBook Ahnonay')                                        #Alors j'y vais
    print "En route vers Ahnonay"                                                              #et je l'indique à l'écran
    PtSetAlarm (8,Vsphere(), 4)                                                                # pause du programme pour laisser l'avatar arriver à Ahnonay avant d'aller en sphere 4
    PtSetAlarm (9,Vbureau(), 0)                                                                #deuxième pause le temps de le laisser aller en sphère 4 avant de le teleporter au bureau
elif Sphereactuelle != 4 :                                                                        #2. On est à Ahnonay mais pas en sphère 4
    Sphere (4)                                                                                        #Alors on y va
    PtSetAlarm (8,Vbureau(), 0)                                                                #On laisse le temps à l'avatar d'y aller avant d'envoyer l'ordre d'aller au bureau
else:                                                                                                  #3. On est en sphère 4
PtConsole ('Avatar.Spawn go 6')                                                              #et donc y a plus qu'à se teleporter au bureau

class Vsphere:                                                                                      #cette classe contient la fonction onAlarm() qui va etre effectuée après un temps de pause
    def onAlarm (self,sph=1) :                                                                  #défini en secondes par le chiffre de la fonction PtSetAlarm() ci dessus qui l'appelle
        sphere = QSphere ()                                                                      #on regarde dans quelle sphere on se trouve
        if sphere != sph:                                                                          #si on n'est pas en sphere 4
            print "En route vers la sphere %d." % sph                                      #on l'indique
            Sphere (sph)                                                                            #et on y va

class Vbureau:                                                                              #cette autre classe contient également la fonction onAlarm() qui va être affectuée après le temps
    def onAlarm (self,context) :                                                        #de pause défini en secondes par la fonction PtSetAlarm() qui l'appelle
        PtConsole ('Avatar.Spawn go 6')                                              #On déplace l'avatar au Spawnpoint 6 qui correspond à la tapisserie du bureau de Kadish.


Il vous suffit de taper, où que vous soyiez, AuBureau() pour vous y rendre en quelques secondes cheers

Expliquons un peu plus la fonction PtSetAlarm()
Prenons la première PtSetAlarm(8,Vsphere(),4) . C'est elle qui va appeler la fonction onAlarm(self,sph=1)

Le premier paramètre 8 est un nombre décimal qui indique après combien de secondes la fonction onAlarm() de la classe Vsphere() va être exécutée.
Le second paramètre Vsphere() est le nom de la classe où la fonction onAlarm() se trouve.
Le troisième paramètre 4 est un entier qui peut être exploité comme variable dans cette classe. Ici, je l'utilise pour indiquer le numéro de la sphère où je dois aller.

Donc, à une instruction PtSetAlarm() doit toujors correspondre une classe du nom du second paramètre et qui doit contenir l'instruction onAlarm().

La classe Vsphere() qui lui est associée doit comporter la fonction onAlarm(self,paramètre). C'est dans cette fonction que vous placerez les instructions qui doivent être exécutées après le temps que vous avez défini dans la fonction PtSetAlarm() correspondante qui l'appelle. Dans notre cas, elle sera exécutée après 8 secondes. C'est en effet le temps que j'ai calculé pour que l'avatar passe d'un âge vers Ahnonay.

On aura le même type d'explication pour l'autre classe Vbureau().

J'espère que cela n'aura pas été trop compliqué à comprendre. En cas de difficultés, n'hésitez pas à me poser des questions Very Happy .

Je suis entrain de réaliser une grande fonction que j'appelle Vers() et qui me permet de téléporter mon avatar partout en tapant simplement cette instructions.
J'utilise des dictionnaires et listes d'endroits, de spawnpoints, de manière à n'avoir qu'une seule instruction pour mes déplacements.
Par exemple si je tape Vers ('VP'), je me rends directement à la ville privée. Si je tape Vers ('Tf') je vais sur le toit du Terminal Ferry et si je tape Vers ('Bk') je me rends au bureau de Kadish à Ahnonay... Je vous en reparlerai plus tard et vous le proposerai en un fichier .py tout prêt à l'emploi !Very Happy


Dernière édition par V@-Michel le Jeu 5 Juil - 7:58, édité 2 fois
V@-Michel
V@-Michel
Admin
Admin

Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique

Revenir en haut Aller en bas

Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande Empty Re: Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande

Message  Lyrositeur Mer 4 Juil - 20:31

Il y a une solution alternative, peut-être plus efficace, maintenant que j'y pense. Tu pourrais également modifier xKI.py et placer le code dans OnFirstUpdate (je crois que c'est la bonne fonction) ; comme ça, chaque fois que le KI est chargé (c'est à dire quand tu arrives dans un Âge) il détecte si tu es à la bonne destination. Il faudrait trouver un moyen de préserver la commande pendant le transfert (comme dans un fichier par exemple) mais cela devrait être faisable aussi.
Lyrositeur
Lyrositeur
Escaladeur
Escaladeur

Messages : 96
Date d'inscription : 03/07/2012
Age : 28
Localisation : Montréal, Canada

http://www.lyros.net

Revenir en haut Aller en bas

Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande Empty Re: Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande

Message  V@-Annabelle Mer 4 Juil - 22:28

Pour ma part, j'attendrai ton fichier .py car je n'ai rien pigé du tout.

En plus tes programmes sont serrés. Tu ne mets aucun espace entre l'objet, le "=" et la fonction. En faire une copie telle quelle sur mon ordi, ça ne marche pas du tout. No
V@-Annabelle
V@-Annabelle
Modérateur
Modérateur

Messages : 340
Date d'inscription : 14/05/2010
Localisation : Canada

Revenir en haut Aller en bas

Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande Empty Re: Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande

Message  Lyrositeur Mer 4 Juil - 22:40

Michel, utilise les balises "code" ; c'est plus lisible ainsi, et cela évite d'avoir à utiliser un grand nombre de points :
Code:
def Exemple(param = 1):
    print "Ceci est un exemple."
Lyrositeur
Lyrositeur
Escaladeur
Escaladeur

Messages : 96
Date d'inscription : 03/07/2012
Age : 28
Localisation : Montréal, Canada

http://www.lyros.net

Revenir en haut Aller en bas

Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande Empty Re: Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande

Message  V@-Michel Jeu 5 Juil - 8:29

V@-Annabelle a écrit:Pour ma part, j'attendrai ton fichier .py car je n'ai rien pigé du tout.

En plus tes programmes sont serrés. Tu ne mets aucun espace entre l'objet, le "=" et la fonction. En faire une copie telle quelle sur mon ordi, ça ne marche pas du tout. No

J'ai modifié mon article de base en mettant les 3 fonctions dans des fenêtres codes séparées et j'ai aéré le texte pour qu'il soit plus lisible. Tu peux donc maintenant faire un copier coller de ces 3 fonctions vers ton fichier personnel.
Normalement cela devrait fonctionner car les petits points en début de lignes sont supprimés.

J'avais déjà tenté d'utiliser ces fenêtres codes mais parfois cela fonctionne parfois l'indentation est supprimée au moment de la publication. Pourquoi ? mystère. C'est pourquoi j'avais finalement opté pour cette écriture, plus lourde certes, mais qui maintient l'indentation factice par les petits points.
Je tâcherai de maintenir à l'avenir la publication des codes avec ces fenêtres.

Maintenant je vais te réexpliquer autrement le but de ces fonctions.
Tout d'abord, la troisième, c'est la fonction principale. C'est elle que tu appelles dans la console Python de PlClient.
Pour te rendre au bureau de Kadish, tu tapes simplement : AuBureau()
Et c'est tout.

Les deux premières fonctions sont appelées automatiquement par la fonction AuBureau() mais tu peux également t'en servir séparément. Si étant à Ahnonay, tu tapes, par exemple, Sphere(3), ton avatar va aller en sphère 3.
Si, étant à Ahnonay, tu tapes QSphere(), il sera inscrit dans la console Python le numéro de la sphère dans laquelle tu te trouves. Bien-sûr cette dernière commande n'a aucun intérêt en soi puisque tu vois bien où tu te trouves. Mais ma fonction principale en a besoin pour savoir dans quelle sphère l'avatar se trouve.

Pour le reste, il s'agit d'une explication détaillée de l'utilité de la fonction PtSetAlarm() pour celles et ceux que la programmation intéresse Very Happy
En résumé, cette fonction diffère de x secondes l'exécution des instructions qui se trouvent dans la classe correspondante.

Je vais t'envoyer par mail le fichier AuBureau.py en attendant que mon module Vers() soit terminé.
Si d'autres souhaitent l'obtenir, je le leur enverrai avec plaisir Smile
Alors, soit tu intègres le contenu de ce fichier dans le tien, en faisant un copier coller, soit tu l'appelles dans la console Python avec l'instruction from AuBureau import *.

Il y a une manière plus pure, plus jolie, plus efficace pour intégrer plusieurs modules c'est de créer un fichier d'initialisation. Je vais développer cela dans l'article suivant Very Happy
V@-Michel
V@-Michel
Admin
Admin

Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique

Revenir en haut Aller en bas

Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande Empty Re: Se téléporter au bureau de Kadish depuis n'importe quel âge en une seule commande

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum