Bonjour à tous,

Je m'initie à DirectX 3D avec C++ Builder6.

Pour cela, j'ai consulté divers tutoriaux et j'ai écrit le programme très simple suivant :

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
class TMainForm : public TForm
{
__published:	// Composants gérés par l'EDI
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall FormDestroy(TObject *Sender);
private:	// Déclarations de l'utilisateur
  LPDIRECT3D9 FD3D;
  LPDIRECT3DDEVICE9 FDevice; // Our rendering device
  HRESULT __fastcall InitD3D( HWND hWnd );
  LPDIRECT3DTEXTURE9 FSpriteTexture;
  LPD3DXSPRITE FSprite;
  void __fastcall Cleanup();
  void __fastcall Render(TObject *Sender, bool &Done);
public:		// Déclarations de l'utilisateur
        __fastcall TMainForm(TComponent* Owner);
};
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
  FDevice = NULL;
  FD3D = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
  Cleanup();        
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
  if( !SUCCEEDED( InitD3D( Handle )))
    Close();
}
//-----------------------------------------------------------------------------
HRESULT __fastcall TMainForm::InitD3D( HWND hWnd )
{
  // Create the D3D object, which is needed to create the D3DDevice.
  if( NULL == ( FD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
    return E_FAIL;
 
  // Remplissage des valeurs de la structure
  D3DPRESENT_PARAMETERS params;
  // Mise à zéro de toutes les valeurs de la structure }
  ZeroMemory( &params, sizeof( params ) );
  params.Windowed = TRUE;
  params.SwapEffect = D3DSWAPEFFECT_DISCARD;
  params.BackBufferFormat = D3DFMT_UNKNOWN;
 
  // Création du dispositif
  if( FAILED( FD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &params, &FDevice ) ) )
    return E_FAIL;
 
  // Création de la texture du sprite
  if (D3D_OK != D3DXCreateTextureFromFile(FDevice, "Ball.png", &FSpriteTexture))
    return E_FAIL;
 
  // Création du sprite
  if( FAILED( D3DXCreateSprite(FDevice, &FSprite)))
    return E_FAIL;
 
  /* Nous branchons un gestionnaire d'évènement sur l'évènement OnIdle de
  l'application */
  Application->OnIdle = Render;
 
  return S_OK;
}
//---------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
void __fastcall TMainForm::Cleanup()
{
  if( FDevice != NULL )
    FDevice->Release();
 
  if( FD3D != NULL )
    FD3D->Release();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Render(TObject *Sender, bool &Done)
{
  // Tracé du fond
  Cardinal dxColor;
  dxColor = D3DCOLOR_XRGB(0, 0, 255); // bleu pour le fond
  FDevice->Clear(0, NULL, D3DCLEAR_TARGET, dxColor, 1, 0);
 
  // Le tracé du sprite nécessite un vecteur de points réels
  D3DXVECTOR3 dxVector;
  dxVector.x=10.0f;
  dxVector.y=20.0f;
  dxVector.z=0.0f;
 
  // Begin the scene
  if( SUCCEEDED( FDevice->BeginScene() ) )
  {
    FSprite->Begin(D3DXSPRITE_ALPHABLEND);
    FSprite->Draw(FSpriteTexture, NULL, NULL, &dxVector, 0xFFFFFFFF);
    FSprite->End();
    FDevice->EndScene();
  }
 
  // DirectX doit maintenant transférer le contenu du buffer vers l'affichage
  FDevice->Present(NULL, NULL, NULL, NULL);
 
  /* Ne pas oublier de mettre Done à false pour que la méthode soit
    appelée à nouveau */
  Done = false;
}
//---------------------------------------------------------------------------
Quelqu'un peut-il me dire pourquoi ce p..... de sprite ne s'affiche pas?