IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Délai entre appels de fonction ou fil d'attente [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2019
    Messages : 3
    Par défaut Délai entre appels de fonction ou fil d'attente
    Bonjour à tous,

    Je cherche à développer un jeux vidéo sur Unity, en langage C# et je suis confronté à une problématique.

    J'ai une fonction publique SCT() (pour Scrolling combat text) qui permet d'afficher les dégâts ou soin que prend un personnage au dessus de sa tête et qui disparait rapidement. Cette fonction ne fait pas grand chose à part instancier un objet de type Text avec la valeur passée en paramètre et lancer une animation qui la laisse apparaitre une demi seconde, puis disparaitre.

    Je vais appeler cette fonction à chaque action appliquée à mon joueur, mais il peut y en avoir plusieurs en même temps. Actuellement lorsque cela arrive, tous les textes se superposent et c'est illisible.

    J'aimerai pouvoir mettre un délai entre chaque exécution de cette fonction, ou gérer une sorte de file d'attente qui déclenche les appels avec x milliseconde d'écart, mais je ne sais pas du tout comment implémenter ça.


    Avez-vous une idée à me proposer pour gérer cela ?

    Merci d'avance.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    la classe Queue<T> permet de gérer une collection de type FIFO
    pour afficher un texte tu peux alors faire .Enqueue sans te poser de question
    et si tu peux faire un thread ou un timer assez rapide à côté, il faudra que si .count > 0 il .Dequeue pour afficher, et attendre la fin du délai d'affichage avant de refaire un test sur .count
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2019
    Messages : 3
    Par défaut
    Merci pour ton aide.

    J'ai essayé d'implémenter la Queue<T> sans l'avoir testé, cela donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public void DebutTourJoueur(){
    	Queue<string> SCTMessageQueue=new Queue<string>;
    	Queue<Color> SCTColorQueue=new Queue<Color>;
    	Queue<string> SCTCibleQueue=new Queue<string>;
     
     
    	player.pv-=dmg;
    	SCTMessageQueue.Enqueue(dmg.ToString());
    	SCTColorQueue.Enqueue(color.red);
    	SCTCibleQueue.Enqueue("PLAYER");
     
     
    	player.pv+=soin;
    	SCTMessageQueue.Enqueue(soin.ToString());
    	SCTColorQueue.Enqueue(color.green);
    	SCTCibleQueue.Enqueue("PLAYER");
     
    	StartCorountine(SCTMessageQueue);
    }
     
    IEnumerator SCTDequeue(){
    	while (SCTMessageQueue.Count>0){
    		SCT(SCTMessageQueue.Dequeue(),SCTColorQueue.Dequeue(),SCTCibleQueue.Dequeue());
    		yield return new WaitForSeconds(.1f);
    	}
    }
    J'avais oublié de préciser que ma fonction SCT prend 3 paramètres en entrée à savoir un texte à afficher, une couleur, et une cible. Je suis obligé de gérer 3 Queue synchrones en parallèle ce qui n'est pas très élégant.

    Pensez-vous que ça soit la manière la plus propre de faire ?

    En tous cas ça devrait faire le taf, je test ça ce soir.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    fait une struct pour mettre tes 2 strings et ta color dedans, ca sera plus propre
    après je sais pas trop si tu vas t'en sortir avec ton ienumerator, à voir ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2019
    Messages : 3
    Par défaut
    Je connaissais pas l'utilisation de Struct, je suis encore débutant

    L'implémentation donnerai donc ça (si j'ai pas fait d'erreur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public struct ParamSCT{
    	public string message;
    	public color color;
    	public string target;
    }
     
    public void DebutTourJoueur(){
    	Queue<ParamSCT> SCTQueue=new Queue<ParamSCT>;
     
     
    	player.pv-=dmg;
    	ParamSCT param1;
    	param1.message=dmg.ToString();
    	param1.color=color.red;
    	param1.target="PLAYER";
    	SCTQueue.Enqueue(param1);
     
    	player.pv+=soin;
    	ParamSCT param2;
    	param2.message=soin.ToString();
    	param2.color=color.green;
    	param2.target="PLAYER";
    	SCTQueue.Enqueue(param2);
     
    	StartCorountine(SCTDequeue);
    }
     
    IEnumerator SCTDequeue(){
    	while (SCTQueue.Count>0){
    		ParamSCT param;
    		param=SCTQueue.Dequeue();
    		SCT(param.message,param.color,param.target);
    		yield return new WaitForSeconds(.1f);
    	}
    }
    L'utilisation de IEnumerator j'ai pas trop de doute, je l'ai déjà fait plusieurs fois sur le projet, mais jamais en fonctionnement itératif. On verra bien.

    Je met le sujet en résolu, merci pour ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Garder des informations entre 2 appels de fonctions
    Par cerby dans le forum Débuter
    Réponses: 3
    Dernier message: 22/03/2009, 15h02
  2. Réponses: 1
    Dernier message: 31/07/2008, 10h37
  3. Appel de fonction entre fonction sur architecture complexe
    Par mek-in-gold dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/03/2008, 19h07
  4. Appel de fonction entre 2 window
    Par GogNav dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/06/2007, 15h44
  5. Appel de Fonction entre classes
    Par likenoother dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2006, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo