Salut, merci à ceux qui tenteront de m'aider.
Je travaille en sur OpenGL avec gestion des évènements clavier / souris Windows ( pas glut).
Mon prog est censé afficher une grille (matrice). Une sorte d'échiquier.
Si l'utilisateur fait un clic gauche sur une case, il change sa couleure en rouge, un clic droit en bleu.
Le prog marche mais il est bugué, je ne saurais vous expliker trop ce kil fait, il n'attribue pas les couleurs là ou il faut! Kelkun aurait une idée? ou une fason plus simple de faire?
Merci à vous
ci - joint le code.
/* les headers OpenGl sont généralement dans le répertoire \include\gl
du compilateur. Ces headers se rapportent aux dll opengl32.dll et
glu32.dll, il faut donc inclure les libs dans Project>Settings>Links
et les inclurent les libs dans la liste Object/library modules */
#include <windows.h> //Header Window
#include <gl/gl.h> // Header OpenGL
#include <gl/glu.h> // Header GLU
#include <iostream>
using std::cout;
WNDCLASS wc; // paramètres Windows
MSG msg;
HWND hWnd;
HDC DC;
HGLRC RC;
float x=8, y=6, z=14.5;
float a=0, b=0;
int startX = 3, startY = 6; //Location initial du départ
int targetX = 12, targetY = 6;//Location initial de la destination
const int grille = 1, depart = 2, destination = 3, bloc = 4;
const longueur = 16, largeur = 12;
int matrice[longueur][largeur];
int mouseXCoordinate, mouseYCoordinate;
int positionX =0, positionY=0;
void RePaint ()
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //efface tous les pixels avant l'affichage d'une scène
glMatrixMode (GL_MODELVIEW); //** A écrire avant
glLoadIdentity (); //** les commandes de transformation
//code relatif à l'affichage
gluLookAt (x,y,z,8,6,0,0,1,0); //caméra, vu en (x,y,z, sur le point x,y,z
matrice[startX][startY]= depart;
matrice[targetX][targetY]= destination;
int i, j;
for(i=0; i<longueur; i++)
{
for(j=0; j<largeur; j++)
{
//intérieur
glBegin (GL_QUADS);
glColor3d(1,0.5,1); glVertex2i(0+i,1+j);//violet
glColor3d(1,0.5,1); glVertex2i(1+i,1+j);
glColor3d(1,0.5,1); glVertex2i(1+i,0+j);
glColor3d(1,0.5,1); glVertex2i(0+i,0+j);
glEnd ();
//Contour
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(0+i,1+j);
glColor3d(1,1,1); glVertex2i(1+i,1+j);
glEnd();
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(1+i,1+j);
glColor3d(1,1,1); glVertex2i(1+i,0+j);
glEnd ();
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(1+i,0+j);
glColor3d(1,1,1); glVertex2i(0+i,0+j);
glEnd ();
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(0+i,0+j);
glColor3d(1,1,1); glVertex2i(0+i,1+j);
glEnd ();
if(matrice[i][j] == bloc)
{
glBegin (GL_QUADS);
glColor3d(0,0,1); glVertex2i(0+i,1+j); //bleu
glColor3d(0,0,1); glVertex2i(1+i,1+j);
glColor3d(0,0,1); glVertex2i(1+i,0+j);
glColor3d(0,0,1); glVertex2i(0+i,0+j);
glEnd ();
}
if(matrice[i][j] == depart)
{
glBegin (GL_QUADS);
glColor3d(0,1,0); glVertex2i(0+i,1+j); //vert
glColor3d(0,1,0); glVertex2i(1+i,1+j);
glColor3d(0,1,0); glVertex2i(1+i,0+j);
glColor3d(0,1,0); glVertex2i(0+i,0+j);
glEnd ();
}
if(matrice[i][j] == grille)
{
//intérieur
glBegin (GL_QUADS);
glColor3d(1,0.5,1); glVertex2i(0+i,1+j);//violet
glColor3d(1,0.5,1); glVertex2i(1+i,1+j);
glColor3d(1,0.5,1); glVertex2i(1+i,0+j);
glColor3d(1,0.5,1); glVertex2i(0+i,0+j);
glEnd ();
//Contour
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(0+i,1+j);
glColor3d(1,1,1); glVertex2i(1+i,1+j);
glEnd();
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(1+i,1+j);
glColor3d(1,1,1); glVertex2i(1+i,0+j);
glEnd ();
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(1+i,0+j);
glColor3d(1,1,1); glVertex2i(0+i,0+j);
glEnd ();
glBegin(GL_LINES);
glColor3d(1,1,1); glVertex2i(0+i,0+j);
glColor3d(1,1,1); glVertex2i(0+i,1+j);
glEnd ();
}
if(matrice[i][j] == destination)
{
glBegin (GL_QUADS);
glColor3d(1,0,0); glVertex2i(0+i,1+j); //rouge
glColor3d(1,0,0); glVertex2i(1+i,1+j);
glColor3d(1,0,0); glVertex2i(1+i,0+j);
glColor3d(1,0,0); glVertex2i(0+i,0+j);
glEnd ();
}
}
}
glFlush(); //Force l'affichage
SwapBuffers (DC);
}
void InitPixelFormat (HDC hDC) //Initalise le format
{
PIXELFORMATDESCRIPTOR pfd =
{
sizeof (PIXELFORMATDESCRIPTOR),
1,
PFD_SUPPORT_OPENGL | PFD_TYPE_RGBA | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER,
16,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16,
0, 0, 0, 0, 0, 0, 0
};
SetPixelFormat (hDC, ChoosePixelFormat (hDC, &pfd), &pfd);
}
LRESULT CALLBACK WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ // récupère les évènements Windows (clavier / souris ...)
int xPos = LOWORD(lParam); // horizontal position of cursor
int yPos = HIWORD(lParam); // vertical position of cursor
mouseXCoordinate = xPos/50;
mouseYCoordinate = yPos/50;
switch (uMsg)
{
case WM_CREATE:
DC=GetDC (hwnd);
InitPixelFormat (DC);
RC = wglCreateContext (DC);
wglMakeCurrent (DC, RC);
break;
case WM_CLOSE:
wglMakeCurrent (NULL, NULL);
wglDeleteContext (RC);
ReleaseDC (hwnd,DC);
PostQuitMessage (0);
break;
case WM_SIZE:
glViewport (0,0,LOWORD (lParam),HIWORD (lParam));
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (45,(float)(LOWORD(lParam))/(float)(HIWORD(lParam)),1,100);
break;
case WM_PAINT:
RePaint ();
break;
case WM_KEYDOWN: //Clavier
switch(wParam)
{
case VK_DOWN: a-=0.2; break;
case VK_UP: a+=0.2; break;
case VK_RIGHT: b+=0.2; break;
case VK_LEFT: b-=0.2; break;
case 'E': {z+=0.1; cout<<" z = \t" <<z <<"\n"; }break;
case 'D': {z-=0.1; cout<<" z = \t" <<z <<"\n"; }break;
case 'S': {y+=1; cout<<" y = \t" <<y <<"\n"; }break;
case 'Q': {y-=1; cout<<" y = \t" <<y <<"\n"; }break;
case 'Z': {x+=1; cout<<" x = \t" <<x <<"\n"; }break;
case 'A': {x-=1; cout<<" x = \t" <<x <<"\n"; }break;
/*case VK_ENTER:
{
//Start A* pathfinding search if return/enter key is hit
if (path == notfinished) //if path not searched
{
path=FindPath(pathfinderID,startX*50,startY*50,targetX*50,targetY*50);
if (path == found) ReadPath(pathfinderID);
}
}*/
default:
break;
}
break;
//Souris
case WM_LBUTTONUP: //bouton gauche cliqué (UP)
{
if(matrice[mouseXCoordinate][mouseYCoordinate] != destination)
{
matrice[startX][startY] = grille;
startX = mouseXCoordinate;
startY = mouseYCoordinate;
matrice[startX][startY] = depart;
}
}
case WM_RBUTTONUP: //bouton droit cliqué (UP)
{
if(matrice[mouseXCoordinate][mouseYCoordinate] != depart)
{
matrice[targetX][targetY] = grille;
targetX = mouseXCoordinate;
targetY = mouseYCoordinate;
matrice[targetX][targetY] = destination;
}
}
case WM_MBUTTONDOWN: //roulette pressé (DOWN)
{
if((matrice[mouseXCoordinate][mouseYCoordinate] != depart) || (matrice[mouseXCoordinate][mouseYCoordinate] != destination))
{
//Erase walls
if (matrice[mouseXCoordinate][mouseYCoordinate] == bloc )
{
matrice[mouseXCoordinate][mouseYCoordinate] = grille;
}
//Draw walls
if (matrice[mouseXCoordinate][mouseYCoordinate] == grille)
{
matrice[mouseXCoordinate][mouseYCoordinate] = bloc;
}
}
}
default:
return DefWindowProc (hwnd,uMsg,wParam,lParam);
break;
}
return 0;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{ //Initialise les paramètres Windows de la Fenêtre
wc.style = CS_OWNDC;
wc.lpfnWndProc = WindowProc;
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(LTGRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "OGL";
RegisterClass(&wc);
hWnd = CreateWindow
("OGL", "Fenetre OpenGL",
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
positionX, positionY, 772, 600, NULL, NULL, hInstance, NULL
);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}