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

DirectX Discussion :

[DGraphics]Ecran de chargement


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut [DGraphics]Ecran de chargement
    Salut !!

    Voila, pour un jeu, j'aimerai faire un écran de chargement lors du... chargement du niveau.
    Pour pouvoir afficher un texte "Loading..." durant le chargement, j'ai fait appel a une thread dans ma boucle principale. Tant que celle ci n'est pas terminée, m_Loading vaut true donc je dois afficher dansma boucle infinie le texte. Or j'observe, au moment du chargement, un "freezing" et il s'arrete... aprés le chargement
    => resultat mon "Loading..." ne s'affiche pas !

    Voici mon code :
    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
    36
    37
    38
    39
    40
    41
     
    void Update(HWND hWnd)
    {
     if( !IsIconic(hWnd))
     { 
    	g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
    	g_Device->BeginScene();
    	//-------------------------------------------------------------------
    	static float Timer = 0.0f;
    	static float dwFrames = 0.0f;
    	float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
     
    	g_Cadre->Draw();
     
    	if( g_CLM->GetLoading() || g_CMM->GetLoading() )
    		PrintText("Loading...",-1,-1,D3DCOLOR_ARGB(255,255,0,0));
    	else
    	{
         if( !g_CLM->IsActived() || !g_CLM->IsEditing() )
    		g_CMM->RenderFrame();
     
    	 g_CLM->RenderFrame();
    	}
     
    	dwFrames++;
    	if( CurrentTime - Timer > 1.0f )
    	{
    		itoa(dwFrames / (CurrentTime - Timer),g_FPS,10);
    		dwFrames = 0;
    		Timer = CurrentTime;
    	}
     
    	PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,64));
     
    	//-------------------------------------------------------------------
    	g_Device->EndScene();
    	if( g_Device->Present( NULL, NULL, NULL, NULL ) == D3DERR_DEVICELOST )
    		g_Device->Reset(&g_d3dpp);
     }
     
    }
    g_CLM et g_CMM sont deux objets gerant, pour l'un, le niveau, et pour l'autre, le menu.

    Si l'un a m_Loading = true, alors j'affiche le texte "loading...."

    voici le code de g_CLM->Active(..) qui st la fonction de chargement, celle qui freeze la frame:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    void CLevelsManager::Active(int _Difficulty, bool Editing)
    {
     m_ThreadParam_Difficulty = _Difficulty;
     m_ThreadParam_Editing = Editing;
     m_Loading = true;
     
     HANDLE l_hThread;
     DWORD l_ThreadID;
     
     l_hThread = CreateThread(NULL,
    						  0,
    						  reinterpret_cast<LPTHREAD_START_ROUTINE>(PvActive),
    						  this,
    						  THREAD_PRIORITY_NORMAL,
    						  &l_ThreadID);
     
     if( l_hThread != NULL )
     {
      DWORD l_Wait;
     
      l_Wait = WaitForSingleObject(l_hThread,INFINITE);
     
      if( l_Wait == WAIT_OBJECT_0 )
      {
       CloseHandle(l_hThread); 
       m_Loading = false;
      }
     }
    }
     
     
    void CLevelsManager::PvActive(CLevelsManager* _Self)
    {
    	_Self->m_Actived=true;
    	Sleep(400);		//Pour eviter que la balle ne parte seule :)
    	if (!_Self->m_ThreadParam_Editing)
    	{
    		_Self->m_IM->SetLimits(192,766,479);
    		*_Self->m_Balle->m_ViesRestantes=3;
    		_Self->m_NextLevel=1;
    		_Self->LoadLevel(true);
    		if (!_Self->m_Difficulty)					//m_Difficulty est égal à 0 après un game over
    		{
    			_Self->m_Difficulty =_Self->m_ThreadParam_Difficulty;
    			_Self->m_Balle->m_Vitesse = _Self->m_ThreadParam_Difficulty+1;
    		}
    		srand((unsigned int)timeGetTime());
    		_Self->ResetScore();
    		_Self->m_Phase=ls_PlayGame;
    	}
    	else
    	{
    		_Self->m_IM->SetLimits(0,1024,492);
    		_Self->DoEmptyLevel();
    		_Self->m_Phase = ls_Editing;
    		_Self->m_MouseDown = false;
    	}
    	_Self->m_IM->ActualiseState();
     
    }
    Aucuns pbs de comilations, cependant, malgré la thread, eh bien la frame est quand meme bloquée !

    Ou est le probleme ?

    Merci.
    cordialemet

    ps : la fonction Active de g_CMM n'est pas encore implémentée mais sera basée sur le meme principe.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Par défaut
    il faut créer un thread supplémentaire pour le chargement et non pour l'affichage

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Bonjour,
    La boucle principale c'est déjà un Thread
    C'est un peu chercher midi à quatorze heure que de vouloir programmer un Thread pour afficher un écran de chargement.
    Y a-t-il tant de données à charger ?
    En général les Thread sous Direct X sont utilisés pour Direct Play.
    Je pense que cela risque de ralentir plus qu'autre chose.
    MAIS si tu tiens absolument à utiliser un Thread ...libre à toi


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    l_hThread = CreateThread(NULL, 
                        0, 
                        reinterpret_cast<LPTHREAD_START_ROUTINE>(PvActive), 
                        this, 
                        THREAD_PRIORITY_NORMAL, 
                        &l_ThreadID);
    Cela m'intrigue un peu car en général avec CreateThread on utilise une fonction de type __cdecl du genre LPVOID MaFonctiondeThread() et non le pointeur d'une instance de classe this.
    Là c'est en quelque sorte un méchanisme "récursif" car la méthode de classe se lance toute seule non ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    SI si Mat.M

    Cependant, j'avais un probleme : la fonction n'etait pas reconnues. j'ai cherché sur le forum et me suis apercu que pour les fonctions membre d'une classe, il fallait utiliser CreateThread Comme ceci.

    Sinon, je sais bien que l'ecran de chargement risque de ne pas m'etre veritablemet utile, mais je voudrais le faire quand meme, pour vori comment on fait.

    merci

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Ok delire8 , si c'est vraiment plus performant fais-nous signe

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Par défaut
    le prob ac dx c'est qu'il faut faire le rendering en temps réel et donc en même temps que tu charges... quoi qu'il soit etre possible de figer l'écran(le processus) mais dans ce cas tu ne peux pas tenir compte des entrées (clavier + souris) avant la fin du chargement.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    Ah la mat.m, je suis pas sur que ce soir plus performant, je pense meme le contraire. Cependant, il m'etait impossible de compiler avec un code du genre :

    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
     
    class A
    {
    private:
            DWORD WINAPI MaFct();
    ....
     
    };
     
    .....
     
    void A::FctMere()
    {
     HANDLE l_hThread ;
     
    l_hThread = CreateThread(NULL, 
                        0, 
                        PvActive, 
                        NULL, 
                        THREAD_PRIORITY_NORMAL, 
                        &l_ThreadID); 
    .....
    }

    enfin, tout est expliqué la :
    http://www.developpez.net/forums/vie...ghlight=thread


    SInon, tu ne veux vraiment pas m'aider pr mon ecran de chargement?

    merci

Discussions similaires

  1. Ecran de chargement
    Par Sarawyn dans le forum VB.NET
    Réponses: 5
    Dernier message: 03/08/2010, 17h09
  2. Ecran de chargement
    Par LastSpear dans le forum OpenGL
    Réponses: 8
    Dernier message: 11/08/2009, 15h38
  3. Ecran de chargement qui ne marche pas !
    Par yrauma dans le forum Flash
    Réponses: 2
    Dernier message: 12/02/2009, 16h19
  4. Ecran noir chargement XP
    Par CHP123 dans le forum Composants
    Réponses: 27
    Dernier message: 11/03/2008, 17h51
  5. [VB.net] Ecran de chargement
    Par Speranza dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/05/2006, 16h50

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