2016-11-22 7 views
-1

Je tire vraiment mes cheveux avec ce problème. J'essaye de créer un jeu simple où le joueur roule une boule autour d'une aire de jeu. J'utilise WinAPI pour la gestion des fenêtres et la gestion des entrées. J'ai aussi essayé de rendre des quads simples, au lieu de la sphère GLU, mais cela ne fonctionnait pas non plus.OpenGL + GLU + C++ ne tire rien

J'ai séparé le code entre différentes classes. Je présente le code pertinent ci-dessous. Ce code est dans mon WinMain:

while (running) { 

    PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE); 

    if (msg.message == WM_QUIT) 
     running = false; 

    else { 

     // handle key presses 

     // update 
     gameWorld->update(getDirections()); 

     // render 
     gameWorld->render(deviceContext); 

     // I added this block of code for testing, still does not work 
     glColor4f(1, 1, 1, 1); 
     glBegin(GL_QUADS); 
     glVertex3f(10, 10, 0); 
     glVertex3f(10, -10, 0); 
     glVertex3f(-10, -10, 0); 
     glVertex3f(-10, 10, 0); 
     glEnd(); 

     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

Voilà GameWorld.cpp:

GameWorld::GameWorld() 
{ 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    this->ball = new Ball(1, 10, 10); 
    this->camera = new Camera(ball); 
} 

GameWorld::~GameWorld() 
{ 
    delete this->ball; 
} 

void GameWorld::render(HDC deviceContext) { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    this->ball->draw(); 

    SwapBuffers(deviceContext); 
} 

void GameWorld::update(Directions dirs) { 

    glLoadIdentity(); 

    this->ball->handleInput(dirs); 
    this->ball->update(); 

    this->camera->update(); 
} 

est ici Caméra méthode update:

void Camera::update() { 

    GLdouble ballX = ball->getLocation()->getX(); 
    GLdouble ballY = ball->getLocation()->getY(); 
    GLdouble ballZ = ball->getLocation()->getZ(); 

    GLdouble x = ballX + cos(90) * this->distanceFromBall; 
    GLdouble y = ballY + cos(90) * this->distanceFromBall; 
    GLdouble z = ballZ + cos(90) * this->distanceFromBall; 

    gluLookAt(
     x, y, z, 
     ballX, ballY, ballZ, 
     0, 1, 0 
    ); 
} 

Voici la méthode boule draw:

void Ball::draw() { 

    glPushMatrix(); 
    this->quadric = gluNewQuadric(); 

    glTranslated(this->location->getX(), this->location->getY(), this->location->getZ()); 

    gluQuadricDrawStyle(this->quadric, GLU_FILL); 
    glColor4f(1, 1, 1, 1); 

    gluSphere(this->quadric, this->radius, this->slices, this->stacks); 
    gluDeleteQuadric(this->quadric); 

    glPopMatrix(); 
} 

Qu'est-ce que le #! @% Ne va pas avec ce code? Je devrais obtenir cette chose en une semaine, donc je pourrais vraiment utiliser de l'aide ...

Répondre

0

Je devais utiliser la fonction gluPerspective() pour que cela fonctionne. Mon constructeur GameWorld ressemble maintenant à ceci:

GameWorld::GameWorld() 
{ 
    glViewport(0, 0, WIDTH, HEIGHT);  // reset the viewport to new dimensions 
    glMatrixMode(GL_PROJECTION);   // set projection matrix current matrix 
    glLoadIdentity();      // reset projection matrix 

              // calculate aspect ratio of window 
    gluPerspective(54.0f, (GLfloat)WIDTH/(GLfloat)HEIGHT, 1.0f, 1000.0f); 

    glMatrixMode(GL_MODELVIEW);    // set modelview matrix 
    glLoadIdentity(); 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    this->ball = new Ball(1, 20, 20); 
    this->camera = new Camera(ball); 
} 

Le code est copié à partir du code échantillon de livre de Dave Astle « Programmation du jeu OpenGL ».