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 :
Mais il y a plusieurs erreurs !
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
1- La fonction rentre dans une boucle infinie :
=> rien a faire, la boucle de finie pas.
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; }
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é
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 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; }
Si WM_PAINT n'est plus traité, Update() affiche ce qu'elle doit afficher correctement.
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 }
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
Partager