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 du moment :
LEGO Icons 10331 – Le martin-pêcheur
Voir le deal
35 €

Animer les objets animables comme l'Urwin, le Sandscrit, etc...

2 participants

Aller en bas

Animer les objets animables comme l'Urwin, le Sandscrit, etc... Empty Animer les objets animables comme l'Urwin, le Sandscrit, etc...

Message  V@-Michel Dim 5 Aoû - 19:16

Lorsque vous placez un animal ou un objet qui se meut uniquement suite à un évènement dans une scène, cet animal ou cet objet reste immobile aussi longtemps qu'on ne lui envoie pas un code d'animation.

Comment réaliser cela ?

Il faut distinguer deux types d'actions dans le jeu :
1. Celle qui fait déplacer l'objet en suivant une trajectoire particulière : c'est une action de type "Animation"
2. Celle qui modifie l'attitude de l'objet : c'est une action de type "Responder"

Nous allons prendre l'exemple de l'Urwin de Negilahn.

Ouvrez Plasmashop >Ages>Negilahn>District_Jungle.prp
Doublecliquez pour ouvrir PrpShop>Negilahn>Jungle>[00A2]Python File Mod>cPythUrwinBird.

Vous voyez un tableau de Paramètres avec les animations et les responders
Les animations peuvent être lancées au moyen d'une commande qui n'est pas la même que les responders.

Voici les codes des fonctions nécessaires :

Code:

import sys
   
def Animer(objet='urwin',param=True):
    if (objet.lower()) == 'urwin':
        anim = sys.modules['Dummy04cPythUrwinBird'].UrwinMasterAnim.animation
    elif (objet.lower()) == 'sandscrit':
        anim = sys.modules['SandscritMovercPyUrwin'].UrwinMasterAnim.animation
    else :
        PtSendKIMessage(45,"%s n'existe pas !" % objet)
        return   
    if param == True :
        anim.resume()
    else :
        anim.stop()
       
#Ces deux fonctions servent à modifier l'etat de l'animal
def runResp(key, resp, stateidx = None, netForce = 1, netPropagate = 1, fastforward = 0):
    nt = ptNotify(key)
    nt.addReceiver(resp)
    nt.netPropagate(netPropagate)
    nt.netForce(netForce)
    if stateidx != None:
        nt.addResponderState(stateidx)
    if fastforward:
        nt.setType(PtNotificationType.kResponderFF)
        nt.netPropagate(0)
        nt.netForce(0)
    nt.setActivate(1.0)
    nt.send()
 
def call(animal='singe',param=3,state=0):
    #param = numero animation et state est le numero de l'état de la liste correspondante. Si pas d'état, state=0
    if (animal.lower()) == 'singe':
        obj = PtFindSceneobject('TempMonkeyHandle','Negilahn')
    elif (animal.lower()) == 'urwin':
        obj = PtFindSceneobject('Dummy04','Negilahn')
    elif (animal.lower()) == 'sandscrit':
        obj = PtFindSceneobject('Sandscrit_Mover','Payiferen')       
    else:
        PtSendKIMessage(45,"%s n'existe pas !" % objet)   
    responders = obj.getResponders()
    resp = responders[param]
    runResp(obj.getKey(), resp, state)

La fonction Animer() sert à lancer une animation de l'objet. Par exemple, si vous tapez Animer('urwin', True) l'Urwin va se mettre à effectuer son parcours autour du pod comme vous le voyez, si vous avez de la chance, lorsque vous regardez par un hublo de Negilahn. L'objet se déplace suivant une trajectoire bien établie puis s'arrête à sa position de départ, après un certain temps, ce qui n'est pas le cas avec le Sandcrit de Payiferen qui lui, une fois lancé ne s'arrêtra que si vous lancez la commande Animer('sandscrit',False). L'objet s'arrête à l'endroit où vous lancer cette dernière commande.

Les actions de Type Responder sont ponctuelles et peuvent être lancées même si l'objet est animé avec la fonction Animer(). Elle vient s'ajouter à cette animation.
Comme je vous l'ai expliqué, avec la fonction Animer('urwin',True) l'Urwin va bien se déplacer mais sans 'vie'. L'objet se déplace comme sur un carousel. Si vous tapez la fonction call('urwin',5,0), vous verrez que l'Urwin marche réellement. Donc, l'animation de déplacement est plus naturelle. Toutefois, cette action de Responder ne se répète pas. Il faut donc l'appeler plusieurs fois. Mais, je pense qu'il y a moyen de la faire répéter durant tout le temps du déplacement. Je dois encore étudier la chose Laughing .

Ces actions Responder sont définies par les 2 chiffres de la fonction call().

Comment savoir quels chiffres utiliser ?
Cette fois, regardons dans le répertoire Python le module qui correspond aux animations de l'Urwin.
C'est le module nglnUrwinBrain.py qui nous intéresse.

Au début du module nous voyons :

# define the attributes that will be entered in max
UrwinMasterAnim = ptAttribAnimation(1, "Urwin Master Anim", netForce=1)

respUrwinVocalize = ptAttribResponder(2, "resp: Urwin Vocalize")
respUrwinIdle = ptAttribResponder(3, "resp: Urwin Idles")
respUrwinIdleToWalk = ptAttribResponder(4, "resp: Urwin Idle To Walk")
respUrwinWalkLoop = ptAttribResponder(5, "resp: Urwin Walk Loop")
respUrwinWalkToIdle = ptAttribResponder(6, "resp: Urwin Walk To Idle")
respUrwinEat = ptAttribResponder(7, "resp: Urwin Eats")

Ce qui nous intéresse c'est les animations ptAttribResponder. Vous voyez, en anglais l'animation. Par exemple, respUrwinWalkLoop fait marcher l'Urwin.
Remarquez les chiffres dans la parenthèse. Retirez 1 du chiffre maximal et vous obtenez le plus grand chiffre que vous pouvez utiliser comme premier chiffre à placer dans la fonction call(). Si vous entrez un chiffre plus grand que le maximum, vous obtiendrez un message d'erreur.
D'autre part, la première étant une action de type Animation, le plus petit chiffre a placer comme premier chiffre de la fonction call() sera 1.
Malheureusement, l'ordre des responder n'est pas celui indiqué dans les parenthèses. Sad Il faut donc procéder par essais pour savoir quel chiffre placer dans la fonction call() pour obtenir l'effet désiré.

Par exemple, pou voir l'Urwin marcher vous taperez : call('urwin',4,0).

Je vais vous parler du second chiffre de la fonction call().

Pour cela, regardons le module python d'animation du singe. Il s'agit du module nglnTreeMonkey.py

Nous avons :
# define the attributes that will be entered in max
respSpawnPt = ptAttribResponder(1, "resp: Spawn Point", ['0','1','2'], netForce=1)
respMonkeyAct = ptAttribResponder(2, "resp: Monkey Actions", ['Alarmed','Up','Eat','Idle', 'Vocalize'])
respMonkeySfx = ptAttribNamedResponder(3, "resp: Monkey SFX", ['Alarmed','Up','Eat','Idle','Off','Vocalize'], netForce=1)
respMonkeyOff = ptAttribResponder(4, "resp: Monkey Off")

Tout d'abord, remarquez bien qu'il n'y a pas d'action de type Animation. Donc, la fonction Animer() n'est pas utilisée pour le petit singe.
Par contre nous voyons qu'il y a 4 actions de type responder.
Prenons l'exmple de respMonkeyAct. Nous voyons que nous avons 5 animations entre crochets séparées par une virgule. Ceux qui connaissent python, savent que dans un crochet nous avons une liste et que chaque élément de la liste peut être numéroté en commençant par 0 pour le premier élément.
Lorsqu'il n'y a pas de liste, le chiffre à placer est 0.

Ainsi, nous avons :
Alarmed = 0
Up = 1
Eat = 2
Idle = 3
Vocalize = 4
Et bien c'est précisément ce chiffre que vous mettrez comme troisième paramètre dans la fonction call().

Si vous voulez voir le singe monter à un arbre ('Up'), tapez la commande : call ('singe',3,1)

Je compte modifier les fonctions pour que tout ceci soit plus simple et qu'il soit possible de taper, par exemple, Animer('singe','grimper').
En attendant voici ce que vous devez taper pour animer l'Urwin, le Sandscrit et le Singe.
Attention, je précise que vous devez d'abord charger la prp et l'objet correspondant.
Je vous conseille d'utiliser la fonction Suivre() que j'ai expliquée dans un post précédent qui charge tout cela avant de vous téléporter sur l'animal en question.

Urwin :
Le faire se déplacer : Animer('urwin')
Le faire s'arrêter : Animer('urwin',False)
Lui faire pousser un cri : call('urwin',1,0)
Le faire marcher :call('urwin',2,0) ou call('urwin',4,0) ou call('urwin',5,0)
Lui faire bouger la tête : call('urwin',6,0)

Singe :
Saute au sol et disparaît dans le sol : call('singe',0,0)
Pousse un petit cri : call('singe',1,0)
Pousse un cri plus long : call('singe',1,5)
Passe à l'arbre 1 : call('singe',2,0)
Passe à l'arbre 2 : call('singe',2,1)
Passe à l'arbre 3 : call('singe',2,2)
Etat d'alerte : call('singe',3,0)
Grimpe à l'arbre : call('singe',3,1)
Mange : call('singe',3,2)
Attend : call('singe',3,3)
Fait des volalize (sans le son) : call('singe',3,4)

Pour le Sandscrit je n'ai pas encore testé les Responder. Vous trouverez la liste dans le module payiUrwinBrain.py

Pour le faire avancer tapez simplement Animer('sandscrit') et pour le stopper : Animer('sandscrit',False)

Il faut encore que je fasse la même chose pour Shroomie de Teledahn.
Une fois que je serai en possession de tous les éléments, je vous en ferai part ici Very Happy

Dernière précision.
Il m'a fallu chercher plusieurs jours afin de trouver le nom du module qui est chargé en mémoire pour animer le Sandscrit.Il s'agit de 'SandscritMovercPyUrwin'. J'avais comme base le nom pour l'Urwin grâce au fichier qu'Annabelle m'avait envoyé : 'Dummy04cPythUrwinBird'
Voici comment j'ai procédé.
Tout d'abord, j'ai cru qu'il s'agissait d'un module python qui se trouvait dans le répertoire du jeu. J'ai donc lancé une recherche de nom de fichier dans tous les répertoires et sous-répertoires de mon installation du jeu. Mais en vain !

J'ai ensuite remarqué que la seconde partie du nom de ce module est le nom du module que l'on trouve dans Python File Mod.
J'ai donc essayé d'utiliser des noms qui ressemblaient à celui de Negilahn mais avec Payiferen et remplacer Urwin par Sandscrit. Mais comme généralement dans le jeu et les noms il n'y a pas de logique cela a été peine perdue. Lorsque je lançais Animer(...) j'obtenais toujours un message d'erreur me disant que le nom du module n'était pas correct.
C'est alors qu'il m'est venu un éclair de lucidité clown oui cela m'arrive !
J'ai donc voulu voir quels étaient les modules chargés en mémoire une fois la prp de Negilhan chargée en tapant dans la console python la commande print sys.modules.
J'ai obtenu toute une série de noms de modules ouverts dans le jeu depuis son lancement. Mais, car il y a un mais, la fenêtre de Python dans PlClient est trop petite et donc je ne voyais qu'une partie des modules chargés Crying or Very sad . Je ne crois pas qu'il soit possible de remonter dans cette fenêtre pour voir ce qu'il y a avant. Mais finalement, je me suis concocté une petite fonction qui écrit dans un fichier, sur mon disque dur, cette fameuse liste et là, oh miracle, j'ai bien retrouvé le fameux module 'Dummy04cPythUrwinBird' !
Il ne me restait plus qu'à ouvrir la prp de Negilhan, de relancer mon petit programme et de reparcourir le fichier écrit sur mon disque et de trouver ainsi le nom du module 'SandscritMovercPyUrwin' qui permet d'animer le Sandscrit de Negilhan avec la commande Animer() cheers .

Alors, comme j'aime partager mes découvertes voici cette fonction :

Code:

def ExportLogMod():
    fichier = open('Modules.txt','w+')
    texte=str(sys.modules)
    fichier.write(texte)

Tapez simplement ExportLogMod() et vous aurez un fichier intitulé Modules.txt dans le répertoire principal de votre jeu dans lequel vous pourrez voir le nom de tous les modules ouverts au moment du lancement de la fonction.

Désolé pour ce long exposé technique mais le résultat est vraiment à la hauteur du temps consacré à mes recherches. Voyez les images ci-dessous.
Je vous rappelle qu'avant de lancer la commande Animer() ou call() je relie mon avatar à l'objet que je veux animer avec la fonction Suivre() que j'ai déjà developpée dans un post précédent.
Je peux vous envoyer le module Animer.py par Mail privé qui reprend ces fonctions. Il vous suffit de me le demander Very Happy

Sandscrit passant devant mon Relto mixé avec Payiferen.
Animer les objets animables comme l'Urwin, le Sandscrit, etc... Kiimag10

Avec la fonction Suivre('sandscrit') vous voyagez sur son dos et avec une belle vue de l'ensemble de votre Relto. A faire absolument !
Animer les objets animables comme l'Urwin, le Sandscrit, etc... Kiimag12
Comme vous le voyez, cette photo a été prise a un moment différent et, comme vous le savez, il y a des périodes de clarté et d'obscurité à Negilhan. Ici c'était le soir alors que dans la photo précédente c'était le jour.

Sur le singe sur un arbre de mon Relto Mixé avec Negilhan
Animer les objets animables comme l'Urwin, le Sandscrit, etc... Kiimag11
V@-Michel
V@-Michel
Admin
Admin

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

Revenir en haut Aller en bas

Animer les objets animables comme l'Urwin, le Sandscrit, etc... Empty Re: Animer les objets animables comme l'Urwin, le Sandscrit, etc...

Message  V@-Michel Lun 6 Aoû - 22:52

La version 2 de mon module Animer est prêt Very Happy

Les animations des animaux suivants sont exploités:

L'Urwin et le Monkey de Negilahn
Le Sandscrit de Payiferen
Le Shroomie de Teledahn

Toutes les animations sont regroupées dans une seule fonction : Action()

Les commandes sont très simples. Exemples :
Pour faire monter le singe de Negilahn sur un arbre, je tape simplement : Action ('singe','grimpe')
Pour faire avancer l'Urwin de Negilhan : Action ('urwin','start')
Pour voir le Shroomie de Teledahn : Action ('shroomie','visible')
Pour arrêter le Sandscrit de Payiferen : Action ('sandscrit','stop')

En outre il est possible de placer à l'endroit de notre avatar tout animal. Exemple : Action ('shroomie','sur moi')

Et, en utilisant la fonction Suivre(), vous pouvez voyager ou faire voyager un autre avatar qui occupe le même âge que le vôtre ces animaux.
Par exemple si je tape Suivre('urwin','Annabelle',120)
Annabelle, qui occupe le même âge que moi se retrouvera sur le dos de l'Urwin. La parp sera chargée automatiquement si elle ne l'est pas et l'Urwin sera également visible. Il ne restera plus qu'à taper Action ('urwin','start') pour débuter le voyage !

Imaginez-vous entrain de chevaucher Urwin autour de votre Relto, par exemple ...

Vous voulez ce module ? Je vous l'envoie par mail privé Very Happy

Animer les objets animables comme l'Urwin, le Sandscrit, etc... Kiimag13
V@-Michel
V@-Michel
Admin
Admin

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

Revenir en haut Aller en bas

Animer les objets animables comme l'Urwin, le Sandscrit, etc... Empty Re: Animer les objets animables comme l'Urwin, le Sandscrit, etc...

Message  V@-Michel Sam 11 Aoû - 18:43

Nouvelles images avec Yodawave et Lushun :

Les lucioles autour de Yoda dans le subworld de Kadish:
Animer les objets animables comme l'Urwin, le Sandscrit, etc... Kiimag12

Sandscrit au Relto:
Animer les objets animables comme l'Urwin, le Sandscrit, etc... Kiimag18

Shroomie A Negilhan:
Animer les objets animables comme l'Urwin, le Sandscrit, etc... Kiimag20
V@-Michel
V@-Michel
Admin
Admin

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

Revenir en haut Aller en bas

Animer les objets animables comme l'Urwin, le Sandscrit, etc... Empty Re: Animer les objets animables comme l'Urwin, le Sandscrit, etc...

Message  V@-Annabelle Lun 13 Aoû - 22:22

Oui stp j'aimerais beaucoup recevoir ce module Very Happy

Merci
V@-Annabelle
V@-Annabelle
Modérateur
Modérateur

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

Revenir en haut Aller en bas

Animer les objets animables comme l'Urwin, le Sandscrit, etc... Empty Re: Animer les objets animables comme l'Urwin, le Sandscrit, etc...

Message  V@-Michel Mar 14 Aoû - 17:30

Je te zip tout cela et te l'envoie 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

Animer les objets animables comme l'Urwin, le Sandscrit, etc... Empty Re: Animer les objets animables comme l'Urwin, le Sandscrit, etc...

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