:-)animation_triangle_2d[dev c++]

Soyez le premier à donner votre avis sur cette source.

Vue 5 989 fois - Téléchargée 243 fois

Description

C'est une application où vous pouvez animer un triangle.
Utilisez les touches F1 à F9 pour modifier les couleurs du triangles.
Utilisez les touches Pause, Verr Num et la touche qui contient une flèche en diagonale pour changer la couleur du fond.
Utilisez les touches directionelles pour déplacer le triangle.
Utilisez les touches Maj et Ctrl pour faire tourner le triangle.
Utilisez la barre d'espace pour "détacher" le triangle.
Utilisez les touches F11, F12, et Suppr pour annuler les couleurs du triangle.
Utilisez la touche Fin pour annuler la couleur du fond.
Dev C++

Source / Exemple :


#include <windows.h>
#include <gl/gl.h>

// Function Declarations

LRESULT CALLBACK 
WndProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam );
VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC );
VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC );
float vitesse;
float couleur1, couleur2, couleur3;
float couleur4, couleur5, couleur6;
float couleur7, couleur8, couleur9;
float positionX1 = 0.0f;
float positionX2 = 0.87f;
float positionX3 = -0.87f;
float positionY1 = 1.0f;
float positionY2 = -0.5f;
float positionY3 = -0.5f;
float objectX1, objectX2, objectX3, objectY1, objectY2, objectY3;
float fond1, fond2, fond3;
int condition = 0;
// WinMain

int WINAPI 
WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow )
{
WNDCLASS wc;
HWND hWnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL bQuit = FALSE;
float theta = 0.0f;

// register window class
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "GLSample";
RegisterClass( &wc );

// create main window
hWnd = CreateWindow( 
"GLSample", "OpenGL Sample", 
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0, 0, 500, 500,
NULL, NULL, hInstance, NULL );

// enable OpenGL for the window
EnableOpenGL( hWnd, &hDC, &hRC );

// program main loop
while ( !bQuit ) {

// check for messages
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {

// handle or dispatch messages
if ( msg.message == WM_QUIT ) {
bQuit = TRUE;
} else {
TranslateMessage( &msg );
DispatchMessage( &msg );
}

} else {

// OpenGL animation code goes here

glClearColor( fond1, fond2, fond3, 0.0f );
glClear( GL_COLOR_BUFFER_BIT );

glPushMatrix();
glRotatef( theta, 0.0f, 0.0f, 1.0f );
glBegin( GL_TRIANGLES );
glColor3f( couleur1, couleur2, couleur3 ); glVertex2f( positionX1, positionY1);
glColor3f( couleur4, couleur5, couleur6 ); glVertex2f( positionX2, positionY2);
glColor3f( couleur7, couleur8, couleur9 ); glVertex2f( positionX3, positionY3);
glEnd();
if (condition == 1)
{
objectY1 = objectY1 + 0.015f;
objectY2 = objectY2 + 0.015f;
objectY3 = objectY3 + 0.015f;

glBegin( GL_TRIANGLES );
glColor3f( couleur1, couleur2, couleur3 ); glVertex2f( objectX1, objectY1);
glColor3f( couleur4, couleur5, couleur6 ); glVertex2f( objectX2, objectY2);
glColor3f( couleur7, couleur8, couleur9 ); glVertex2f( objectX3, objectY3);
glEnd();
}
glPopMatrix();

SwapBuffers( hDC );

theta += vitesse;

}

}

// shutdown OpenGL
DisableOpenGL( hWnd, hDC, hRC );

// destroy the window explicitly
DestroyWindow( hWnd );

return msg.wParam;

}

// Window Procedure

LRESULT CALLBACK 
WndProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{

switch ( message ) {

case WM_CREATE:
return 0;

case WM_CLOSE:
PostQuitMessage( 0 );
return 0;

case WM_DESTROY:
return 0;

case WM_KEYDOWN:
switch ( wParam ) {

case VK_ESCAPE:
PostQuitMessage( 0 );
return 0;

case VK_CONTROL:
vitesse = vitesse + 0.5f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_SHIFT:
vitesse = vitesse - 0.5f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F1:                        //F1
if (couleur1 <= 1.0f)
{
if (couleur1 >= 0.0f)
{
couleur1 = couleur1 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F2:                         //F2
if (couleur2 <= 1.0f)
{
if (couleur2 >= 0.0f)
{
couleur2 = couleur2 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F3:                          //F3
if (couleur3 <= 1.0f)
{
if (couleur3 >= 0.0f)
{
couleur3 = couleur3 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F4:                         //F4
if (couleur4 <= 1.0f)
{
if (couleur4 >= 0.0f)
{
couleur4 = couleur4 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F5:                         //F5
if (couleur5 <= 1.0f)
{
if (couleur5 >= 0.0f)
{
couleur5 = couleur5 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F6:                         //F6
if (couleur6 <= 1.0f)
{
if (couleur6 >= 0.0f)
{
couleur6 = couleur6 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F7:                          //F7
if (couleur7 <= 1.0f)
{
if (couleur7 >= 0.0f)
{
couleur7 = couleur7 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F8:                         //F8
if (couleur8 <= 1.0f)
{
if (couleur8 >= 0.0f)
{
couleur8 = couleur8 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F9:                         //F9
if (couleur9 <= 1.0f)
{
if (couleur9 >= 0.0f)
{
couleur9 = couleur9 + 0.5f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F11:                       //F10
couleur1 = 0.0f;
couleur2 = 0.0f;
couleur3 = 0.0f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_F12:                       //F11
couleur4 = 0.0f;
couleur5 = 0.0f;
couleur6 = 0.0f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_DELETE:                       //F12
couleur7 = 0.0f;
couleur8 = 0.0f;
couleur9 = 0.0f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_DOWN:
positionY1 = positionY1 - 0.01f;
positionY2 = positionY2 - 0.01f;
positionY3 = positionY3 - 0.01f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_UP:
positionY1 = positionY1 + 0.01f;
positionY2 = positionY2 + 0.01f;
positionY3 = positionY3 + 0.01f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_LEFT:
positionX1 = positionX1 - 0.01f;
positionX2 = positionX2 - 0.01f;
positionX3 = positionX3 - 0.01f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_RIGHT:
positionX1 = positionX1 + 0.01f;
positionX2 = positionX2 + 0.01f;
positionX3 = positionX3 + 0.01f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_SPACE:
objectX1 = positionX1;
objectX2 = positionX2;
objectX3 = positionX3;
objectY1 = positionY1;
objectY2 = positionY2;
objectY3 = positionY3;
condition = 1;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_HOME:
if (fond1 <= 1.0f)
{
if (fond1 >= 0.0f)
{
fond1 = fond1 + 0.1f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_PAUSE:
if (fond2 <= 1.0f)
{
if (fond2 >= 0.0f)
{
fond2 = fond2 + 0.1f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_NUMLOCK:
if (fond3 <= 1.0f)
{
if (fond3 >= 0.0f)
{
fond3 = fond3 + 0.1f;
}
}
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

case VK_END:
fond1 = 0.0f;
fond2 = 0.0f;
fond3 = 0.0f;
return DefWindowProc( hWnd, 
message, wParam, lParam );
break;

}
return 0;

default:
return DefWindowProc( hWnd, 
message, wParam, lParam );

}

}

// Enable OpenGL

VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC )
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;

// get the device context (DC)

  • hDC = GetDC( hWnd );
// set the pixel format for the DC ZeroMemory( &pfd, sizeof( pfd ) ); pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat( *hDC, &pfd ); SetPixelFormat( *hDC, iFormat, &pfd ); // create and enable the render context (RC)
  • hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC ); } // Disable OpenGL VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC ) { wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC ); ReleaseDC( hWnd, hDC ); }

Conclusion :


C'est surtout le code source qui est intéressant.
Fonctionne avec Dev C++

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Msgbox
Messages postés
67
Date d'inscription
lundi 1 juillet 2002
Statut
Membre
Dernière intervention
1 septembre 2006

Qd tu deplaces le triangle t'effaces l'ecran a cahque fois.
Je connais pas OpenGL mais je trouve que c un px du gachis.
C pas posible de considerer le triangle comme un objet ou classe et faire DestroyObject(hTriagle); ou un truc du genre ?

Sionon, bonne source, elle m'a bcp aide. Merci !
cmarsc
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003

cliquer sur File
choisir new project...
selectionner l'onglet Graphics
puis choisir OpenGL
OK
enregistrer le project ... compiler
D1m3x
Messages postés
402
Date d'inscription
samedi 28 décembre 2002
Statut
Membre
Dernière intervention
21 juillet 2005
1
moi, j'i compiler ton prog avec tt les compilateur ke javai et ca le mettai tjs, glVertex, glColor,... pas connu, alors je ne sais pas ce que tu as fait pour que ca marche chez toi avec Dev C++
mastave
Messages postés
53
Date d'inscription
samedi 24 novembre 2001
Statut
Membre
Dernière intervention
25 janvier 2003

ouais, c'est exact, mais c'est parce que c'est le ganre de programme que je fais un peu à la "va-vite"...
;-)
cmarsc
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003

salut,
si par exemple couleur4 est un float pourquoi écrire 0.5f ?
couleur4 = couleur4 + 0.5f; on peut le remplacer par couleur4 += 0.5;

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.