Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.8.0 - Qt Creator : 4.2.2 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4] Mettre une appli en pause pendant qu'une animation se déroule ?

Bonsoir ! J'ai écrit une petite appli, un jeu de dés. Quand on lance les dés il y a une petite animation (durée paramétrable de 0 à 5s), pendant laquelle il ne doit se passer rien d'autre. Mon problème est que lorsqu'on lance un QTimer::singleShot() le timer se lance, OK, mais en parallèle du code en cours : la ligne suivant cette commande est exécutée immédiatement. Ça ne me va pas, alors j'ai contourné de fort vilaine façon en codant ce qui doit se passer après l'animation dans le SLOT appelé lorsque le timer a terminé :
QTimer::singleShot(delaiAttente(), this, SLOT(finDeLancer()));
En fait j'aurais préféré faire quelque chose de plus linéaire, du genre
// le joueur vient de demander à lancer les dés
// préparations diverses
// lancement des animations
// pause du programme pendant les x secondes
// arrêt des animations
// voilà, les dés s'affichent, on peut continuer
Comment puis-je faire ?


Ma question est-elle claire ?


Merci !

Réponses

  • Si tu mets ton application en pause, plus rien ne se passera, même pas l'animation des dès.

    La solution est de désactiver les contrôles du jeu au lancement de l'animation et de les réactiver à la fin de cette dernière via le slot du QTimer.
    C'est la seule solution "potable" que je vois.
  • Oui, c'est ce que je fais, je désactive les contrôles. Mais mon souci est que la fonction
    QTimer::singleShot(delaiAttente(), this, SLOT(slotQuelconque()));
    me rend la main tout de suite alors que j'aimerais implémenter quelque chose du genre
    int d1, d2, d3, d4, d5;
    lancerAnimationEtRetournerValeursAleatoires( &d1, &d2, &d3, &d4, &d5 ); // cette fonction rend la main x secondes plus tard
    // suite où je me sers des valeurs retournées
  • C'est a priori pas comme ça que je ferais.

    J'aurais une fonction qui lancerait l'animation et définirait un timer. A la suite de ça, la fonction ne ferait plus rien.
    Dans la fonction de lancement de l'animation, je génèrerais 5 valeurs aléatoires que je conserverais dans une données membre de ma classe.
    Lorsque l'animation arrive à son terme (et donc que le timer déclenche), je lance un slot qui poursuit la logique de jeu en utilisant les valeurs conservées en données membre.
  • C'est ce que je fais,
    QTimer::singleShot(delaiAttente(), this, SLOT(finDeLancer()));
    (avec finDeLancer() = poursuite du jeu)

    mais ça ne me paraît pas une bonne conception. Je vais revoir cette partie du code, merci pour les conseils ! :)
  • December 2008 modifié
    Résolu :)
    [...]
    faireRoulerLesDes();
    [suite du programme...]

    void faireRoulerLesDes()
    {
    lancerAnimation();
    QTimer::singleShot(delaiAttente(), this, SLOT(stopRolling()));

    m_rolling = true; // on attend simplement que le booléen (membre) passe à false
    while (m_rolling) {
    qApp->processEvents();
    }
    }

    void stopRolling()
    {
    m_rolling = false;
    }
Connectez-vous ou Inscrivez-vous pour répondre.