Salut !!

On (un amis et moi) a fait un "jeu". Il marche bien, même au dela de nos espérances. Mais justement, étant perfectionnistes, on veut faire un truc de qualité : on voudrai donc notamment ajouter un splash screen pendant que le jeu s'initialise.

Pour cela, rien de plus logique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
Creation de la fenetre
Affichage (ShowWindow(....))
Curseur off
 
Création d'une thread( GameInit )
  -> Pendant que GameInit s'execute (Init DGraphics, textures,etc...)
      Afficher a l'ecran "Loading.... Please wait"
 
Tester la valeur de retour de GameInit (GetExitCodeThread(...))
Si == -1, stopper
 
Boucle infinie d'affichage
Mais il y a plusieurs erreurs !
1- La fonction rentre dans une boucle infinie :
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
 
g_hMainThread = CreateThread(NULL,NULL,&GameInit,l_Prm,NULL,&g_MainThreadID);
 
	if( g_hMainThread == NULL )
	{
	 MessageBox(hDlg,"Impossible de lancer la thread d'initialisation !","Erreur fatale !",0+MB_ICONHAND);
	 FreeAll();
	 return -1;
	}
 
	GetExitCodeThread(g_hMainThread,&l_ExitCode);//1er pour init l_ExitCode
 
	while( l_ExitCode == STILL_ACTIVE )
	{
		SendMessage(hDlg,WM_PAINT,NULL,NULL);
		GetExitCodeThread(g_hMainThread,&l_ExitCode);
	}
 
	if( l_ExitCode == -1 )
	{
	 FreeAll();
	 return -1;
	}
=> rien a faire, la boucle de finie pas.

2- si on fait une boucle par rapport a une variable g_bLoaded telle qu'elle vaille false au début de GameInit et true a la fin (GameInit la change), rien n'est affiché
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
	while( WaitForSingleObject(g_hMainThread,INFINITE) )
		SendMessage(hDlg,WM_PAINT,NULL,NULL);
 
	GetExitCodeThread(g_hMainThread,&l_ExitCode);//1er pour init l_ExitCode
	if( l_ExitCode == -1 )
	{
	 FreeAll();
	 return -1;
	}
3- Avec le 2nd code, qui a le mérite de ne pas faire une boucle infinie, l'ecran reste noir de noir aprés. je pense que ca vient du fait que WM_PAINT soit traité donc pas de place pour Update():

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
 
	while(1)
	{
//pour les erreurs non débug
#ifndef _DEBUG
		try{
#endif
 
		if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
		{
			if ( !GetMessage(&Msg, NULL, 0, 0) )	break;
				DispatchMessage(&Msg);
		}
		else
		{
		 if( !Update(hDlg) ) break;
		}
//suite de "pour les erreurs non débug"
#ifndef _DEBUG
		}catch(...)
		{
			g_CLogM->AddEvent("Erreur dans la boucle\n",true);
			break;
		}
#endif
	}
Si WM_PAINT n'est plus traité, Update() affiche ce qu'elle doit afficher correctement.

4- Si avec tout ca j'arrive a avoir le jeu rendu, j'ai pas de son ! Pire, la méthode CloseDown() du IDirectMusicPerformance8* fait planter (violation d'accés) ! Pas mal non plus, le curseur reste affiché (malgré le fait que j'ai demandé qu'il soit caché et par le Device et par ShowCursor(false)) !


Mis a part tout ca, ca marche...

merci