2014-01-06 5 views
1

내 마우스가 화면에있는 동안 화면이 더 이상 회전하지 않습니다. 응용 프로그램이 더 이상 활성화되지 않은 경우에만. 나는이 워프 포인터를 가지고가는 경우에응용 프로그램이 활성화되어있는 동안 glutWarpPointer가 작동하지 않습니다.

후 다시 작업을 시작합니다

(http://youtu.be/h5Sg3nQoWKs 일어나는 것은 뭐죠 비디오를 표시합니다).

mouse.x = x; 
mouse.y = y; 

if (x > screen.x/2) 
{ 
    player.angle -= 0.05f; 
    player.lx = sin(player.angle); 
    player.lz = -cos(player.angle); 
    glutWarpPointer(screen.x/2,screen.y/2); 
} 
else if (x < screen.x/2) 
{ 
    player.angle += 0.05f; 
    //if (player.vertAngle < 0) 
     //player.vertAngle = 0; 
    player.lx = sin(player.angle); 
    player.lz = -cos(player.angle); 
    glutWarpPointer(screen.x/2,screen.y/2); 
} 
if (y < screen.y/2) 
{ 
    player.vertAngle += 0.05f; 
    player.ly = sin(player.vertAngle); 
    glutWarpPointer(screen.x/2,screen.y/2); 
} 
else if (y > screen.y/2) 
{ 
    player.vertAngle -= 0.05f; 
    //if (player.vertAngle > 360) 
     //player.vertAngle = 360; 
    player.ly = sin(player.vertAngle); 
    glutWarpPointer(screen.x/2,screen.y/2); 
} 
+1

을하지만을하지만, 할 수있는 더 좋은 방법이 여기에

내 마우스 업데이트입니다 플레이어 회전은'player.angle = x - screen.x/2'입니다. 마우스가 1 픽셀 또는 100 픽셀 이동하는지 여부에 관계없이 플레이어가 지금 가지고있는 방식대로 플레이어가 항상 동일한 양을 돌리기 때문에 더 좋습니다. 이 문제가 해결되었습니다. – BWG

답변

1

glutWarpPointer()가 생성하는 별도의 모션 이벤트 무시하도록 플래그를 사용 : 아마 도움이되지 않습니다이

#include <GL/glut.h> 

#include <iostream> 
using namespace std; 

bool capture = false; 
void keyboard(unsigned char key, int x, int y) 
{ 
    if(key == 'z') 
    { 
     capture = !capture; 
    } 
} 

void passiveMotion(int x, int y) 
{ 
    static bool warped = false; 
    if(warped) 
    { 
     warped = false; 
     return; 
    } 

    if(capture) 
    { 
     warped = true; 
     int w = glutGet(GLUT_WINDOW_WIDTH); 
     int h = glutGet(GLUT_WINDOW_HEIGHT); 
     glutWarpPointer(w/2, h/2); 

     int dx = (w/2) - x; 
     int dy = (h/2) - y; 
     cout << dx << " " << dy << endl; 
    } 
    else 
    { 
     cout << x << " " << y << endl; 
    } 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutKeyboardFunc(keyboard); 
    glutPassiveMotionFunc(passiveMotion); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
관련 문제