2012-03-28 11 views
1

私はC++(SDL/OpenGL)で単純なポンゲームをプログラミングしていますが、私はUbuntuでコンパイルする問題にぶち当たっています。 SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL);のフラグとしてSDL_OPENGLを使用すると浮動小数点例外が発生します。g ++でコンパイルされており、Visual C++(エラーなし)で正常にコンパイルされているようです。ここでSDL/OpenGL浮動小数点例外

が私のコードです:

#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

デバッガで実行してみましたか?どのラインでエラーが発生しますか?それはいつも同じ行ですか?それがクラッシュする表現と値は何ですか? –

+0

浮動小数点例外はあいまいでしたが、エラーが行 'SDL_SetVideoMode(WIDTH、HEIGHT、32、SDL_OPENGL); 'で発生すると判断しました。つまり、g ++コンパイラでSDL_OPENGLフラグが原因でエラーが発生しています。 – Christian

+0

これをコンパイルするフラグは何ですか? '-lSDL -lGL'? –

答えて

0

[SOLVED]

まず第一に、私はmisspoke。私はそれが編集していないと言ったとき、それはあった。プログラムは実際には動作していなかったので、Ubuntu 11.10のターミナルであいまいな "浮動小数点例外"エラーが発生しました。私の友人と何時間も問題を研究した後、無駄に、最後に試してみました。グラフィックドライバを更新しました。うん、それはすべてを修正した。私のAMD(fglrxが)グラフィックドライバを更新するには

は、私は単純に、端末を開いて、で入力:

sudo apt-get install fglrx-updates-dev 

先に行くと、再起動して、独自のグラフィックスドライバをアクティブに!

関連する問題