MTProd > Dev4all > Articles > APIs > DirectX > Votre premier jeu Windows - C++/DirectX > 7 fonctions.h
Rechercher19 Personnes en-ligne
Votre premier jeu Windows - C++/DirectX

7  fonctions.h

Nous allons voir dans ce chapitre quatres petites fonctions simples et bien pratiques :



7.1  GetImage()

Listing 7.1.1 : GetImage()
(
ouvrir dans une nouvelle fenêtre)

 1  RECT GetImage( int sizeX, int sizeY, int nbImage )
 2  {
 3      RECT        srcRect;
 4  
 5      srcRect.left = nbImage % IMG_PER_LINE * sizeX;
 6      srcRect.top = nbImage / IMG_PER_LINE * sizeY;
 7      srcRect.right = srcRect.left + sizeX;
 8      srcRect.bottom = srcRect.top + sizeY;
 9  
 10      return srcRect;
 11  }


Première ligne, vous remarquez qu'il s'agit d'une fonction de type RECT pour rectangle, elle prend trois paramètres :

  1. int sizeX : La longueur du sprite

  2. int sizeY : La hauteur du sprite

  3. BYTE nbImage : Le numéro de l'image


Ligne 3, nous déclarons une structure RECT appellé srcRect.
Ligne 5, nous definissons le coté gauche du rectangle srcRect avec le calcul suivant :
nbImage % IMG_PER_LINE * sizeX
Soit : "numéro de l'image" (nbImage) modulo (%) "nombre d'images par ligne" IMG_PER_LINE fois * "longueur d'une image" sizeX
Modulo retourne le reste d'une division, ici le reste de nbImage divisé par IMG_PER_LINE.
Imaginons que notre sprite ai une taille de 32 pixels par 32 et que nous voulons prendre l'image numéro 15, sachant qu'il y a 10 images par ligne dans notre bitmap, cela donnera le calcul suivant :
15 % 10 * 32, 15 % 10 retourne 5 (15 / 10 = 1 reste 5), puis 5 * 32 donne 160, c'est la position (en pixels) gauche de l'image 15 (figure 7.1.1).



Figure 7.1.1: Position de l'image 15

Ligne 6, nous calculons maintenant la position depuis le haut de l'image 15, cette fois nous effectuons une division afin d'obtenir le nombre de lignes depuis le haut où se trouve l'image 15, effectivement nbImage / IMG_PER_LINE nous donnera 1, donc une ligne depuis le haut, nous multiplions en suite cette valeur par la hauteur d'une image, ici 32 (valeur de sizeY) ce qui nous donne 1 * 32 = 32, c'est bien la position en pixels depuis le haut pour l'image 15.
Nous connaissons les coordonnées de départ de notre image 15, à savoir (160;32), calculons maintenant les coordonnées de fin, nous savons qu'une image fait 32 (sizeX) sur 32 (sizeY), nous allons donc ajouter, respectivement, ces deux valeurs aux côtés que nous venons de calculer :
Ligne 7, nous ajoutons la longueur d'une image (sizeX) à notre côté gauche (srcRect.left), cela nous donnera ici 192 (figure 7.1.1).
Ligne 8, nous ajoutons la hauteur d'une image (sizeY) à notre côté haut (srcRect.top), cela nous donnera ici 64 (figure 7.1.1).
Ligne 10, nous retournons le rectangle srcRect que nous venons de calculer.




7.2  Fail()

Listing 7.2.1 : Fail()
(
ouvrir dans une nouvelle fenêtre)

 1  int Fail( HWND hWnd, char *szMsg )
 2  {
 3      ReleaseAllObjects();
 4      FreeDirectInput();
 5      OutputDebugString( szMsg );
 6      MessageBox( hWnd, szMsg, "Erreur", MB_OK | MB_ICONERROR );
 7      DestroyWindow( hWnd );
 8  
 9      return FALSE;
 10  }


Première ligne, il s'agit d'une fonction de type int (entier), elle prend comme arguments :

  1. HWND hWnd : La fenêtre de notre application

  2. char *szMsg : Un pointeur vers le message d'erreur à afficher


Ligne 3, nous appellons la fonction ReleaseAllObjects() (décrite plus loin dans ce chapitre) afin de "relacher" et détruire tous nos objets DirectDraw.
Ligne 4, nous appellons la fonction FreeDirectInput() afin de libérer notre périphérique DirectInput.
Ligne 5, nous appellons la fonction OutputDebugString() qui affichera dans notre débuggeur le message d'erreur passée à la fonction.
Ligne 6, nous affichons une boite de message grâce à la fonction Windows MessageBox, voici ces arguments :

  1. HWND hWnd : L'handle de notre fenêtre créant la boite de message, ici hWnd

  2. LPCTSTR lpText : Le texte qui sera affiché dans la boite de message, ici notre erreur szMsg

  3. LPCTSTR lpCaption : Le titre de notre boite de message, ici la chaine Erreur

  4. UINT uType : Les styles de notre boite de message, ici MB_OK afin d'afficher uniquement un bouton "OK", MB_ICONERROR afin d'afficher comme icône une erreur (la croix standard de Windows)


Enfin en ligne 7 nous détruisons notre fenêtre avec la fonction Windows DestroyWindow().
Ligne 9, nous retournons la valeur négative FALSE (faux).




7.3  ReleaseAllObjects()

Listing 7.3.1 : ReleaseAllObjects()
(
ouvrir dans une nouvelle fenêtre)

 1  void ReleaseAllObjects( void )
 2  {
 3      if (lpDD != NULL)
 4      {
 5          if ( surfFront != NULL )
 6              surfFront->Release();
 7  
 8          if ( surfCurseur != NULL )
 9              surfCurseur->Release();
 10  
 11          if ( surfSprite != NULL )
 12              surfSprite->Release();
 13  
 14          lpDD->Release();
 15          lpDD = NULL;
 16      }
 17  }


Il s'agit d'une fonction de type void, elle ne prend pas de paramêtres, nous nous assurons de cela grâce au mot-clé void.
Ligne 3, nous testons avant de commencer à "rélacher" nos objets DirectDraw, si notre objet principal DirectDraw lpDD (déclaré dans globals.h) vaut quelque chose.
Si oui, ligne 5, nous testons si notre surface surfFront vaut quelque chose (pas égal à NULL), si oui, nous appellons la fonction Release() (ligne 6) qu'hérites chaque objet DirectDraw, elle se chargera de "relacher" notre surface ainsi que ses éventuels surfaces attachées (ici notre "back buffer" surfBack).
Nous effectuons les mêmes opérations pour la surface surfCurseur (ligne 8) et pour surfSprite (ligne 11).
Ligne 14, nous pouvons maintenant "relacher" notre objet principal DirectDraw, nous le faisons en suite pointer sur rien (NULL).




7.4  RestoreAll()

Listing 7.4.1 : RestoreAll()
(
ouvrir dans une nouvelle fenêtre)

 1  HRESULT RestoreAll( void )
 2  {
 3      HRESULT            hRet;
 4  
 5      hRet = surfFront->Restore();
 6      if ( hRet == DD_OK )
 7      {
 8          hRet = surfSprite->Restore();
 9          if ( hRet == DD_OK )
 10              DDReLoadBitmap(surfSprite, "data\\sprite.bmp");
 11  
 12          hRet = surfCurseur->Restore();
 13          if ( hRet == DD_OK )
 14              DDReLoadBitmap(surfCurseur, "data\\curseur.bmp");
 15      }
 16  
 17      return hRet;
 18  }


Voici la dernière fonction du fichier fonctions.h, elle s'appelle RestoreAll et est de type HRESULT, elle ne contient pas de paramêtres (void).
Ligne 3, nous déclarons une variable de type HRESULT, ligne 5 nous lui affectons la valeur de retour de la fonction Restore() de notre surface primaire surfFront.
Ligne 6, nous testons si hRet vaut DD_OK, si oui la restauration de surfFront c'est correctement déroulée, nous allons alors restaurer nos autres surfaces.
Ligne 8, nous affectons la valeur de retour de la fonction Restore() de notre surface surfSprite, si cette restauration c'est bien déroulée (test en ligne 9) nous rechargons le bitmap de notre surface avec la fonction DDReloadBitmap() (définit dans ddutil.cpp), nous indiquons le chemin relatif à notre executable (répertoire "data\", fichier "sprite.bmp"), nous utilisons le double back slash (\\) car il s'agit d'un caractère réservé au C++.
Ligne 12 à 14, nous effectuons les mêmes opérations pour la surface surfCurseur.
Ligne 17, nous retournons la valeur de hRet pour d'éventuels tests.





<<  6  UpdateFrame()Sommaire8  input.h  >>

 Accés rapide

1  Introduction
2  Les fichiers et répertoires
3  WindowProc()
4  InitApp()
5  WinMain()
6  UpdateFrame()
7  fonctions.h

GetImage()

Fail()

ReleaseAllObjects()

RestoreAll()

8  input.h
9  Conclusion
Voir le sommaire complet

 Liens utiles

  • Publier un article
  • Envoyer cette page
  • Ecrire à l'auteur

  •  Mini-Chat

    Thienou (00h11): salut
    Thienou (00h13): Oula mon inscription date de 11 ans je me sent vieux :)
    neowolf25 (17h59): MMF2 en "pay what you want" jusqu'à demain sur
    neowolf25 (17h59): https://www.hu
    mblebundle.com/
    weekly

    Miuka (21h15): Coin coin de 2014
    Miuka (21h15): Des gens qui ont migré sur le forum Clickteam ou ailleurs ?
    Strike (09h45): Salut les vieux !
    Hikarion (12h46): Salut les djeunz
    Hikarion (13h38): A qui profite le scandale ?
    Hikarion (13h44): le chat irc est toujours actif ?

    Votre message



     Archives

     Dev4all Newsletter

    Restez à jour avec la newsletter mensuelle !

    Votre e-mail


    1800 abonnés

     Recommander Dev4all

    Recommandez Dev4all à un ami. Cela fera grandir notre communauté !

    E-mails de vos amis




    [ Accueil | S'inscrire | Mon Dev4all | Communauté | Téléchargements | Articles | Forums | Chat ]

    [ A propos de Dev4all | Aide | La charte Dev4all | Contact ]

    © 2000-2018 MTProd. Tous droits réservés.
    L'utilisation de Dev4all implique l'acceptation et le respect de la charte Dev4all.