2017-04-13 3 views
0

Je suis un peu nouveau à la surabondance et opengl et j'essaie de faire bouger la caméra sur le mouvement de la souris mais en essayant d'obtenir la position de la souris sur l'écran, je suppose que la méthode être référencé dans le paramètre glutPassiveMotionFunc(). Mais j'obtiens des erreurs en essayant de donner à la fonction la méthode CameraMove. Je sais que je passe la mauvaise méthode mais je ne sais pas comment.glutPassiveMotionFunc Problèmes

void helloGl::CameraMove(int x, int y) 
{ 
oldMouseX = mouseX; 
oldMouseY = mouseY; 

// get mouse coordinates from Windows 
mouseX = x; 
mouseY = y; 

// these lines limit the camera's range 
if (mouseY < 60) 
    mouseY = 60; 
if (mouseY > 450) 
    mouseY = 450; 

if ((mouseX - oldMouseX) > 0)  // mouse moved to the right 
    angle += 3.0f;`enter code here` 
else if ((mouseX - oldMouseX) < 0) // mouse moved to the left 
    angle -= 3.0f; 
} 




void helloGl::mouse(int button, int state, int x, int y) 
{ 
switch (button) 
{ 
    // When left button is pressed and released. 
case GLUT_LEFT_BUTTON: 

    if (state == GLUT_DOWN) 
    { 
     glutIdleFunc(NULL); 

    } 
    else if (state == GLUT_UP) 
    { 
     glutIdleFunc(NULL); 
    } 
    break; 
    // When right button is pressed and released. 
case GLUT_RIGHT_BUTTON: 
    if (state == GLUT_DOWN) 
    { 
     glutIdleFunc(NULL); 
     //fltSpeed += 0.1; 
    } 
    else if (state == GLUT_UP) 
    { 
     glutIdleFunc(NULL); 
    } 
    break; 
case WM_MOUSEMOVE: 

    glutPassiveMotionFunc(CameraMove); 

    break; 

default: 
    break; 
} 
} 

Répondre

1

En supposant que helloGl est une classe. Alors la réponse est, vous ne pouvez pas. Une fonction n'est pas la même chose qu'une méthode. La chose est que glutPassiveMotionFunc() attend:

void(*func)(int x, int y) 

Mais ce que vous essayez de donner est la suivante:

void(helloGl::*CameraMove)(int x, int y) 

En d'autres termes, un thiscall. Cela ne fonctionne pas car thiscallfondamentalement a un argument caché supplémentaire contrairement à un cdecl. En tout sa simplicité, vous pouvez imaginer votre CameraMove() comme:

void CameraMove(helloGl *this, int x, int y) 

Comme vous pouvez le voir, ce n'est pas la même chose. La solution consiste donc à déplacer CameraMove() de votre classe helloGl ou à rendre la méthode statique.