Connexion
Menu Principal
Recherche
Menu secondaire
Image Aléatoire
Voiture2.jpg
Publicité
Formation Blender ElephormBlender 3d Elephorm


     






python, exécuter une action après un délai
Blendie
Inscrit:
02/08/2012 13:16
Post(s): 39
Slt a tous, mon problème est qu'avec ce script
    if leftClick.positive and ray.positive:
        if "tree." in target.name and tools == 4 and cont.owner["ToolTime"] == 0:
             hand.playAction("handAction", 0, 35)
             cont.owner['ToolTime'] += 35
             target['tree'] -= 1


l'action "target['tree'] -= 1" va s'exécuter dé que je click, or j'aimerais quel s'exécute que quand la propriété toolTime (qui descent tout le temps a 0 automatiquement) est égale a 10 mais le fait que ce soit un click m'empeche de simplement mettre une condition a la suite.

En version plus imagée, j'ai une pioche et quand je regarde un rocher et que click, l'action de la pioche ce joue et un morceau de rocher apparait,dé que je click et non pas quand ma pioche fini de donner son coup. J'espère avoir été compréhensible et merci d'avance

Contribution le : 13/02 23:27:04
Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
OverdOzed
Inscrit:
21/08/2013 20:12
De CH [+]
Post(s): 1433
Salut,

(J'imagine que target est un élément variable? Sinon c'est trivial avec trois briques)

Tu pourrais p.ex. définir sur l'objet maître deux propriétés "target_name" (str) et "tree_active" (bool), puis ajouter un réseau de briques indépendant: un senseur Property avec Equal/ToolTime/10, lié à un contrôleur Python, lequel aurait un script du genre:

if cont.owner["tree_active"]:
    scene.objects[cont.owner["target_name"]]["tree"] -= 1
    cont.owner["tree_active"] = False


et tu modifierais ton script en:

    if leftClick.positive and ray.positive:
        if "tree." in target.name and tools == 4 and cont.owner["ToolTime"] == 0:
             hand.playAction("handAction", 0, 35)
             cont.owner['ToolTime'] += 35
             cont.owner["target_name"] = target.name
             cont.owner["tree_active"] = True



Il y a peut-être plus simple.

Après, tu pourrais aussi définir target_name et tree_active en-dehors du système de Game Properties (p.ex. comme des variables "ne sortant pas" du monde Python), histoire notamment de ne pas devoir sauvegarder le nom de la target et de devoir la rechercher dans les objets de la scène...
(un moyen est de les "crocher" directement à bge.logic, et un autre moyen bien plus "pythonique" et joli est de regrouper les deux scripts en un seul en mode Module et de faire des variables globales dedans.)



Et sinon, essaie stp. de soigner un peu ton orthographe, là ça fait mal aux yeux...

Contribution le : 13/02 23:44:56
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
Blendie
Inscrit:
02/08/2012 13:16
Post(s): 39
Ok merci, j'ai pris la base de ton idée et ça fonctionne,a peut près. Vu qu'il y a plusieurs arbres les même qui sont créés, leurs noms est le même et quand j'effectue ce script.
Avec la première partie:
    if leftClick.positive and ray.positive:
        if "tree." in target.name and tools == 4 and cont.owner["ToolTime"] == 0:
            hand.playAction("handAction", 0, 35)
            cont.owner['ToolTime'] += 35
            cont.owner['ToolDelay'] = 10
            cont.owner['ToolActive'] = True
            cont.owner['TargetName'] = target.name
            cont.owner['TargetPropName'] = "tree"
            print(cont.owner['TargetName'])


Et la deuxième toujours dans le même script;
    if cont.owner["ToolActive"]:
        cont.owner['ToolDelay'] -= 1
        if cont.owner["ToolDelay"] == 0:
            scene.objects[cont.owner["TargetName"]][cont.owner['TargetPropName']] -= 1
            cont.owner["ToolActive"] = False


La propriété tree (ici "TargetName") qui va être changer est celle du premier arbre créé(jusqu'à ce qu'il soit cassé), puis le deuxième et ainsi de suite... et non l'arbre que je regarde.
Merci quand même de ta réponse

Contribution le : 14/02 22:42:53
Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
OverdOzed
Inscrit:
21/08/2013 20:12
De CH [+]
Post(s): 1433
Si tu as des problèmes avec des noms non-uniques, tu peux comme je l'ai ajouté en commentaire passer par des variables globales dans le script en mode Module. De cette façon tout reste dans le "monde" Python, et il n'y a pas besoin de passer par la sauvegarde d'un nom.

Si tu montres le code avec les fonctions, etc., je peux t'expliquer comment je le ferais.

Contribution le : 14/02 23:43:01
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
Blendie
Inscrit:
02/08/2012 13:16
Post(s): 39
ok, je suis pas très expérimenté en python du coup j'ai pas tout compris
Mais pour mon script en gros j'ai ça:
import bge


def main():

    cont = bge.logic.getCurrentController()
    scene = bge.logic.getCurrentScene()
    own = cont.owner

    tools = cont.owner['tools']
    
    leftClick = cont.sensors['Left_Click']
    ray = cont.sensors['Ray']
    
    
    target = ray.hitObject
    hand = scene.objects["hand"]

    if leftClick.positive and ray.positive:
        if "tree." in target.name and tools == 4 and cont.owner["ToolTime"] == 0:
            hand.playAction("handAction", 0, 35)
            cont.owner['ToolTime'] += 35
            cont.owner['ToolDelay'] = 10
            cont.owner['ToolActive'] = True
            cont.owner['TargetName'] = target.name
            cont.owner['TargetPropName'] = "tree"
            print(cont.owner['TargetName'])
        if "stone." in target.name and tools == 4 and cont.owner["ToolTime"] == 0:
            hand.playAction("handAction", 35, 55)
            cont.owner['ToolTime'] += 20
            cont.owner['ToolDelay'] = 5
            cont.owner['ToolActive'] = True
            cont.owner['TargetName'] = target.name
            cont.owner['TargetPropName'] = "stone"
            print(cont.owner['TargetName'])
    
    if cont.owner["ToolActive"]:
        cont.owner['ToolDelay'] -= 1
        if cont.owner["ToolDelay"] == 0:
            scene.objects[cont.owner["TargetName"]][cont.owner['TargetPropName']] -= 1
            cont.owner["ToolActive"] = False
                

main()


(si il y a des espaces en trop c'est parce que je l'ai modifié pour prendre que ce qui nous intéresse.)

Contribution le : 15/02 16:12:27
Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
OverdOzed
Inscrit:
21/08/2013 20:12
De CH [+]
Post(s): 1433
A quels senseurs ce script est-il lié? Seulement Left_Click et Ray, ou aussi un autre? (p.ex. un Always, etc.)

Contribution le : 15/02 17:13:52
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
Blendie
Inscrit:
02/08/2012 13:16
Post(s): 39
Il y a aussi des autres mais ce sont juste des trucs genres right_click ou un keyboard R mais c'est tout, le ray est en pulse mode et le Left_Click a le tap activé mais il est pas en pulse. Je dois mettre une senseur always ?

Contribution le : 15/02 17:28:47
Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
OverdOzed
Inscrit:
21/08/2013 20:12
De CH [+]
Post(s): 1433
Non pas forcément. C'était juste pour comprendre la logique.

Mon idée serait de créer un script comportant plusieurs fonctions, et d'appeler ces fonctions individuellement selon les senseurs (avec des contrôleurs Python en mode Module).

Cela permet de gérer des parties indépendamment, tout en gardant un aspect commun (plusieurs fonctions dans un script global), permettant ainsi de garder une partie mémoire commune.

Par exemple:

import bge

current_target = [False, None]


def shoot(cont):

    own = cont.owner

    tools = cont.owner['tools']
    
    leftClick = cont.sensors['Left_Click']
    ray = cont.sensors['Ray']
    
    
    target = ray.hitObject
    hand = scene.objects["hand"]

    if leftClick.positive and ray.positive:
        if "tree." in target.name and tools == 4 and cont.owner["ToolTime"] == 0:
            hand.playAction("handAction", 0, 35)
            cont.owner['ToolTime'] += 35
            cont.owner['ToolDelay'] = 10
            current_target[0] = True
            current_target[1] = target
            cont.owner['TargetPropName'] = "tree"
            print(cont.owner['TargetName'])
        if "stone." in target.name and tools == 4 and cont.owner["ToolTime"] == 0:
            hand.playAction("handAction", 35, 55)
            cont.owner['ToolTime'] += 20
            cont.owner['ToolDelay'] = 5
            current_target[0] = True
            current_target[1] = target
            cont.owner['TargetPropName'] = "stone"
            print(cont.owner['TargetName'])


def update(cont):
    
    if current_target[0]:
        cont.owner['ToolDelay'] -= 1
        if cont.owner["ToolDelay"] == 0:
            if not current_target[1].invalid:
                current_target[1][cont.owner['TargetPropName']] -= 1
            current_target[:] = [False, None]



Pour utiliser ce script:

1) change le mode du contrôleur Python lié au script de Script en Module
2) dans le champ texte à côté, écris <le nom donné au script ci-dessus>.shoot
3) ajoute un senseur Always en Pulse on
4) lie-le à un contrôleur Python également nouvellement créé, que tu passes également en mode Module et assignes à <le nom donné au script ci-dessus>.update.

De cette façon:
- si les conditions sont réunies (senseurs Ray + Click), la target est enregistrée dans la liste globale current_target, qui est également marquée comme active
- à partir de là, le Always va faire décroître la prop tree/stone de la target
- une fois le compteur à zéro, current_target est réinitialisé, et donc "désactivé" (le premier champ repasse à False).


Après, peut-être voudras-tu permettre à plusieurs targets d'être exécutées en même temps, p.ex. en ajoutant de nouvelles sous-listes à current_target, etc.


Je ne sais pas si ce script répond exactement à tes besoins, il faut peut-être le modifier légèrement.

Contribution le : 15/02 18:09:30
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: python, exécuter une action après un délai
Blendie
Inscrit:
02/08/2012 13:16
Post(s): 39
C'est bon ça fonctionne parfaitement, merci beaucoup (après pas sûr que je coupe 2 arbre en même temps , mais merci quand même du conseil)

Contribution le : 15/02 18:35:06
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Moteur de jeu GameBlender et alternatives [WIP] Tales Of Rain nouvelle version 3D    [1][2][3]...[5] 48 3608 Aujourd'hui 13:53:44
Hook 
Le coin des geeks Ralentissement avec un modèle au nombre de polygones éleve 3 106 Aujourd'hui 13:14:29
Philelopez 
Questions & Réponses Plusieurs matériaux attribuer à un objet en fonction de la hauteur (RenduCycles) 7 406 Aujourd'hui 12:07:42
Philelopez 
Questions & Réponses Raccord d'objet torsadé 3 123 Aujourd'hui 10:54:57
airamacnaib 
Questions & Réponses Réparation avec impression 3D 8 364 Hier 15:29:00
Europrimus 
Concours Les Défis du Clan 2017 - S.21 - Thème : "Ça pique" 4 334 Hier 13:30:44
BILL 
[WIP] et travaux terminés [WIP] Création d'une prothèse pour impression 3D    [1][2] 11 757 Hier 12:26:28
Redstar 
Questions & Réponses Texture fonction du niveau de gris 2 176 Hier 11:35:32
Philelopez 
Mes premières images sous Blender (débutants) [WIP] Dalek    [1][2] 15 912 26/05 23:21:18
bathal 
The Blender Clan 'tchat [BUG PARIS] RDV en 2017 !    [1][2][3]...[66] 656 135803 26/05 13:45:17
manchukito 
Questions & Réponses Probléme d'ajout de bone supplémentaire lors de l'exportation 0 120 26/05 00:47:16
tpexstyle 
Questions & Réponses [non résolu] Probleme rigging 2 146 25/05 21:46:01
McAsulys 
Questions & Réponses [non résolu] Comment recompiler un script osl a chaque frame lors d'une animation. 0 124 25/05 18:18:27
Gandi 
Questions & Réponses Additionner deux actions : vraiment bizarre... 5 252 25/05 16:05:56
Ran 
Questions & Réponses [non résolu] Gravures en creux sur surfaces arrondies ? 2 233 25/05 09:15:33
Sebastien1979 
Concours Les Défis du Clan 2017 - S.20 - Thème : "Nourriture et/ou Astronomie" - [Votes Ouverts]    [1][2] 16 988 24/05 20:12:39
Jimoke 
Mes premières images sous Blender (débutants) Les Blends de Megeon    [1][2][3]...[29] 280 42081 24/05 14:22:36
timeman13 
The Blender Clan 'tchat Le topic des trucs à voir    [1][2][3]...[301] 3006 676128 23/05 17:34:20
rikoo 
[WIP] et travaux terminés [WIP] Projet Tales & Legends - phase test 2    [1][2][3]...[9] 87 15380 23/05 16:03:08
Redstar 
Questions & Réponses problème Edit prop + Edge rail ? 2 248 23/05 11:50:54
DaWaaaaghBabal 

Qui est en ligne
17 utilisateur(s) en ligne (dont 12 sur Forums)

Membre(s): 0
Invité(s): 17


plus...
Nouveaux membres
JoshuaSwad 28/5/2017
Ihluvathar 28/5/2017
Gamabar 26/5/2017
tpexstyle 26/5/2017
caiico 25/5/2017
Ran 25/5/2017
Sebastien1979 24/5/2017
rhody 23/5/2017
italo 23/5/2017
soovage 22/5/2017
Dernier Ajout
7.jpg

Evènements à venir
Jui 3
BUG de PARIS
Jui 30
Anniv des Jedi :-D
Jui 15
BUG de Lyon
plus 320 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2017 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445