qt4에서 opengl을 사용하여 게임을 구현하려고합니다. 지금까지 축구 피치를 만들었고 사용자가 화살표 키를 사용하여 자유롭게 움직일 수있는 카메라를 구현하려고합니다. 제 친구는 NeHe의 튜토리얼에서 찾은 코드를 사용하여 코드에 붙여 넣기 만하면 카메라가 그를 대신했습니다. 같은 것을 시도해도 이스케이프 버튼 만 작동하고 OpenGL 위젯이 닫힙니다. f1 키는 전체 화면으로 전환해야하지만 전체 화면 모드로 전환하지 않고 마우스 커서를 보이지 않게합니다. 화살표 키가 전혀 작동하지 않습니다. OpenGL을 처음 접했을 때 구현에 무엇이 잘못되었는지 알 수 없었습니다.qt opengl에서 키보드 명령을 사용하여 카메라를 이동할 수 없습니다.
나는 피치를 그린 코드와 키보드 이벤트 핸들러를 추가합니다.
void metinalifeyyaz::paintGL(){
movePlayer();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
GLfloat xtrans = -xpos;
GLfloat ytrans = -walkbias - 0.50f;
GLfloat ztrans = -zpos;
GLfloat sceneroty = 360.0f - yrot;
glLoadIdentity();
glRotatef(lookupdown, 1.0f, 0.0f, 0.0f);
glRotatef(sceneroty, 0.0f, 1.0f, 0.0f);
glTranslatef(xtrans, ytrans+50, ztrans-130);
glLoadIdentity();
glTranslatef(1.0f,0.0f,-18.0f);
glRotatef(45,1,0,0);
drawScene();
int delay = time.msecsTo(QTime::currentTime());
if (delay == 0)
delay = 1;
time = QTime::currentTime();
timer->start(qMax(0,10 - delay));
}
void metinalifeyyaz::movePlayer() {
if (keyUp) {
xpos -= sin(yrot * PI_OVER_180) * 0.5f;
zpos -= cos(yrot * PI_OVER_180) * 0.5f;
if (walkbiasangle >= 360.0f)
walkbiasangle = 0.0f;
else
walkbiasangle += 7.0f;
walkbias = sin(walkbiasangle * PI_OVER_180)/10.0f;
} else if (keyDown) {
xpos += sin(yrot * PI_OVER_180)*0.5f;
zpos += cos(yrot * PI_OVER_180)*0.5f ;
if (walkbiasangle <= 7.0f)
walkbiasangle = 360.0f;
else
walkbiasangle -= 7.0f;
walkbias = sin(walkbiasangle * PI_OVER_180)/10.0f;
}
if (keyLeft)
yrot += 0.5f;
else if (keyRight)
yrot -= 0.5f;
if (keyPageUp)
lookupdown -= 0.5;
else if (keyPageDown)
lookupdown += 0.5;
}
void metinalifeyyaz::keyPressEvent(QKeyEvent *event) {
switch (event->key()) {
case Qt::Key_Escape:
close();
break;
case Qt::Key_F1:
setWindowState(windowState()^Qt::WindowFullScreen);
break;
default:
QGLWidget::keyPressEvent(event);
case Qt::Key_PageUp:
keyPageUp = true;
break;
case Qt::Key_PageDown:
keyPageDown = true;
break;
case Qt::Key_Left:
keyLeft = true;
break;
case Qt::Key_Right:
keyRight = true;
break;
case Qt::Key_Up:
keyUp = true;
break;
case Qt::Key_Down:
keyDown = true;
break;
}
}
void metinalifeyyaz::changeEvent(QEvent *event) {
switch (event->type()) {
case QEvent::WindowStateChange:
if (windowState() == Qt::WindowFullScreen)
setCursor(Qt::BlankCursor);
else
unsetCursor();
break;
default:
break;
}
}
void metinalifeyyaz::keyReleaseEvent(QKeyEvent *event) {
switch (event->key()) {
case Qt::Key_PageUp:
keyPageUp = false;
break;
case Qt::Key_PageDown:
keyPageDown = false;
break;
case Qt::Key_Left:
keyLeft = false;
break;
case Qt::Key_Right:
keyRight = false;
break;
case Qt::Key_Up:
keyUp = false;
break;
case Qt::Key_Down:
keyDown = false;
break;
default:
QGLWidget::keyReleaseEvent(event);
}
}
는 그 복사 붙여 넣기 효율적인 방법이 아니라 내 친구의 프로젝트 내 다른 아니라는 것을 알고 그것은 그를 위해 작동합니다. 하나의 프로젝트에서 동일한 코드가 작동하고 다른 프로젝트에서는 작동하지 않을 수있는 사항을 알고 있다면이를 지적하십시오. 물론 코드에 대한 다른 의견도 많이 있습니다.
감사합니다. 당신이 말한 것을하고이 함수 호출에서 +50과 -130을 삭제 한 후에 glTranslatef (xtrans, ytrans + 50, ztrans-130); 그것은 효과가 있었다. – user1432581