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 :
g_CLM et g_CMM sont deux objets gerant, pour l'un, le niveau, et pour l'autre, le menu.
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); } }
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:
Aucuns pbs de comilations, cependant, malgré la thread, eh bien la frame est quand meme bloquée !
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(); }
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.
Partager