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.