2012-03-28 2 views
1

Ich programmiere ein einfaches Pong-Spiel in C++ (SDL/OpenGL), aber ich habe ein Problem beim Kompilieren auf Ubuntu. Ich bekomme eine Gleitkommaausnahme, wenn ich SDL_OPENGL als das Flag für SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL); benutze Es wird mit g ++ kompiliert und scheint mit Visual C++ (keine Fehler) gut zu kompilieren.SDL/OpenGL Gleitkomma Ausnahme

Hier ist mein Code:

#include <SDL/SDL.h> 
#include <gl/GL.h> 
#include <SDL/SDL_opengl.h> 

const int WIDTH = 640; 
const int HEIGHT = 480; 

struct Paddle 
{ 
    float x, y, w, h; 
    Paddle(float a, float b) 
    { 
     x = a; 
     y = b; 
     w = 10; 
     h = 80; 
    } 
}; 

struct Ball 
{ 
    float x, y, r; 
    float velx, vely; 
    Ball(float a, float b) 
    { 
     x = a; 
     y = b; 
     r = 7; 
     velx = (float)0.2; 
     vely = (float)0.2; 
    } 
}; 

bool testCollision(Ball b, Paddle p) 
{ 
    if (b.x + b.r < p.x) return false; 
    if (b.x > p.x + p.w) return false; 
    if (b.y + b.r < p.y) return false; 
    if (b.y > p.y + p.h) return false; 
    return true; 
} 

void init() 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    SDL_WM_SetCaption("Pong~~", NULL); 
    SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL); 
    glClearColor(0, 0, 0, 1); 
    //glViewport(0, 0, WIDTH, HEIGHT); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glDisable(GL_DEPTH_TEST); 
    glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); 
    SDL_GL_SwapBuffers(); 
    //glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char *argv[]) 
{ 
    init(); 

    Paddle p1(10.0, 80.0); 
    Paddle p2(620.0, 80.0); 
    Ball b(50, 50); 

    bool press[4] = {false, false, false, false}; 

    SDL_Event event; 
    bool running = true; 
    while (running) 
    { 
     while (SDL_PollEvent(&event)) 
     { 
      if (event.type == SDL_KEYDOWN) 
      { 
       switch (event.key.keysym.sym) 
       { 
       case SDLK_ESCAPE: 
        running = false; 
        break; 

       case SDLK_w: 
        press[0] = true; 
        break; 

       case SDLK_s: 
        press[1] = true; 
        break; 

       case SDLK_UP: 
        press[2] = true; 
        break; 

       case SDLK_DOWN: 
        press[3] = true; 
        break; 
       } 
      } 

      else if (event.type == SDL_KEYUP) 
      { 
       switch (event.key.keysym.sym) 
       { 
       case SDLK_w: 
        press[0] = false; 
        break; 

       case SDLK_s: 
        press[1] = false; 
        break; 

       case SDLK_UP: 
        press[2] = false; 
        break; 

       case SDLK_DOWN: 
        press[3] = false; 
        break; 
       } 
      } 
     } 

     //Logic 
     if (press[0] == true) p1.y -= (float)0.2; 
     if (press[1] == true) p1.y += (float)0.2; 
     if (press[2] == true) p2.y -= (float)0.2; 
     if (press[3] == true) p2.y += (float)0.2; 

     if (p1.y < 0) p1.y = 0; 
     else if (p1.y + p1.h > HEIGHT) p1.y = HEIGHT - p1.h; 
     if (p2.y < 0) p2.y = 0; 
     else if (p2.y + p2.h > HEIGHT) p2.y = HEIGHT - p2.h; 

     b.x += b.velx; 
     b.y += b.vely; 

     if (b.x < 0) b.velx = -b.velx; 
     else if (b.x + b.r > WIDTH) b.velx = -b.velx; 
     if (b.y < 0) b.vely = -b.vely; 
     else if (b.y + b.r > HEIGHT) b.vely = -b.vely; 

     if (testCollision(b, p1) == true) b.velx = -b.velx; 
     else if (testCollision(b, p2) == true) b.velx = -b.velx; 
     glClear(GL_COLOR_BUFFER_BIT); 
     glPushMatrix(); 

     //Draw ball 
     glBegin(GL_QUADS); 
      glColor4ub(255, 5, 255, 255); 
      glVertex2f(b.x, b.y); 
      glVertex2f(b.x + b.r, b.y); 
      glVertex2f(b.x + b.r, b.y + b.r); 
      glVertex2f(b.x, b.y + b.r); 
     glEnd(); 

     //Draw paddles 
     glBegin(GL_QUADS); 
      glColor4ub(255, 5, 5, 255); 
      glVertex2f(p1.x, p1.y); 
      glVertex2f(p1.x + p1.w, p1.y); 
      glVertex2f(p1.x + p1.w, p1.y + p1.h); 
      glVertex2f(p1.x, p1.y + p1.h); 

      glVertex2f(p2.x, p2.y); 
      glVertex2f(p2.x + p2.w, p2.y); 
      glVertex2f(p2.x + p2.w, p2.y + p2.h); 
      glVertex2f(p2.x, p2.y + p2.h); 
     glEnd(); 

     glPopMatrix(); 
     SDL_GL_SwapBuffers(); 
    } 
    return 0; 
} 
+0

Haben Sie versucht, es in einem Debugger auszuführen? In welcher Zeile ist der Fehler aufgetreten? Ist es immer die gleiche Linie? Was sind die Ausdrücke und Werte, auf die es stürzt? –

+0

Die Gleitkommaausnahme war unklar, aber ich habe festgestellt, dass der Fehler in der Zeile 'SDL_SetVideoMode (WIDTH, HEIGHT, 32, SDL_OPENGL) auftritt;'. Das SDL_OPENGL-Flag verursacht nämlich den Fehler im g ++ - Compiler. – Christian

+0

Mit welchen Flaggen kompilieren Sie das? '-lSDL -lGL'? –

Antwort

0

[gelöst]

Zunächst einmal, ich misspoke. Als ich sagte, dass es nicht kompiliert wurde, war es; Das Programm lief nicht und gab mir einen mehrdeutigen "Gleitkommaausnahme" -Fehler im Terminal auf Ubuntu 11.10. Nachdem ich das Problem stundenlang mit meinem Freund recherchiert hatte, gab ich ihm einen letzten Versuch und aktualisierte meinen Grafiktreiber. Yup, das hat alles repariert.

Zu meinem AMD (fglrx) Grafiktreiber zu aktualisieren, habe ich einfach Terminal geöffnet und tippte:

sudo apt-get install fglrx-updates-dev 

Gehen Sie weiter und Neustart, und aktivieren Sie die proprietären Grafiktreiber!