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 :

[DX9] Splash Screen


Sujet :

DirectX

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut [DX9] Splash Screen
    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
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Bonjour,
    Délire8 , je ne peux que te répondre brièvement mais je ne comprends pas ton obstination à créer un thread au démarrage , tu avais déjà posé la question avant.
    Je pense que c'est d'une inutilité totale pour charger un écran de démarrage.
    Il suffit d'utiliser un booléen pour déterminer si oui ou non tu as chargé tes données au démarrage.
    Les threads dans les jeux vidéos sont essentiellement utilisés pour la programmatin multijoueurs avec Direct Play , pour déterminer à un instant donné si un joueur B a modifié son comportement ( programmation client serveur ou en étoile ).

    De plus le message WM_PAINT à ma connaissance est très rarement utilisé en programmation Direct X sauf en mode fenêtré .
    Décortique les exemples du SDK et regardes si c'est le cas

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    D'abord merci de ta réponse.

    Efefctivement j'ai déja posé la question mais je ne m'etais pas obstiné. J'avoue que ton idée du booléen au départ est trés interressant. De plus, WM_PAINT me semble un peu archaïque par rapport a DX9, d'ou les problemes.

    Peux tu me détailler ta méthode avec le booléen : je ne vois pas trés bien comment et initialiser mon jeu et afficher un message sans thread.

    merci.

    ps : les exemples du SDK sont particuliérement difficiles a comprendre car ils sont basés sur le DX9 AppWizard et les MFC... (je ne veux pas du premier, et ne maîtrise pas le second)
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Points : 78
    Points
    78
    Par défaut
    2- dans ton utilisation de WaitForSingleObject, le fait d'utiliser INFINITE fait que ton SendMessage ne sera appellé qu'une seule fois (quand GameInit se termine). Il utiliser WaitForSIngleObject(thread, 0) pour ne pas attendre et tester la valeur de retour de cette fonction pour savoir si ton thread est terminé ou pas. Dans ce cas, WM_PAINT sera envoyé tant que ton thread ne sera pas terminé.

    PS: c'est quoi kom jeu ? y'a un site ? juste par curiosité 8)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    Merci pour l'info.
    Je vais de ce pas essayer.

    Pour le jeu, c'est un genre arkanoïd mais en légerement plus original .
    Mais je n'en dis pas plus : il est pas fini (ca fait juste 6mois qu'on repousse la date de parution pour le perfectionner), et le site est pas encore en ligne (il y sera avec la release du jeu (les sources seront dispos))

    cordialement

    ps : http://v.caltot.free.fr/ScreenWB.ace
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Bonsoir,
    concernant un thread chacun est libre de développer comme bon lui semble mais il me semble que cela ne soit pas vraiment utile pour le but recherché .
    Le problème avec ce genre de technique c'est la synchronisation des tâches comme le suggère bleyblue.

    Peux tu me détailler ta méthode avec le booléen : je ne vois pas trés bien comment et initialiser mon jeu et afficher un message sans thread.
    Eh bien pas trop compliqué : ce booléen peut être mis à TRUE à la fin du message WM_ACTIVEAPP ou WM_CREATE ou bien à la fin de GameInit ,il suffit de mettre à InitializedGame=TRUE.
    Dans le rendu tant que InitializedGame=FALSE on affiche l'écran de démarrage.



    Pour le jeu, c'est un genre arkanoïd mais en légerement plus original
    (soupir): un clône d'Arkanoïd ce n'est pas très original ( quoique pour ma part mon projet est un clône de jeu de stratégie en temps réel ).
    Bon chacun fait ce qui lui plaît , tu as sans doute pris du plaisir à créer cela mais si possible trouver un peu plus d'originalité la prochaine fois ....

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    Merci Mat.M & Bleyblue.

    cordialement

    ps : Arkanoïd n'est pas ce qui est de plus original (même si on a esssayé de le rendre original), mais c'est de loin ce qui nous a semblé le plus facile à coder en tant que 1er jeu (et surtout, test-coding).
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

Discussions similaires

  1. Comment faire un splash screen pour son application?
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/04/2007, 14h28
  2. Splash screen
    Par LapinGarou dans le forum MFC
    Réponses: 5
    Dernier message: 25/10/2005, 09h35
  3. Splash screen transparent
    Par max63 dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 24/02/2005, 16h13
  4. affichage texte style splash screen
    Par scorbo dans le forum MFC
    Réponses: 4
    Dernier message: 13/06/2004, 12h03
  5. affichage de controles sur un splash screen
    Par shrek dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/11/2003, 19h59

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