2012-03-28 81 views
1

我正在用C++编程一个简单的pong游戏(SDL/OpenGL),但是我遇到了编译Ubuntu的问题。当我使用SDL_OPENGL作为SDL_SetVideoMode(WIDTH, HEIGHT, 32, 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

您是否尝试过在调试器中运行它?你在哪一行发生错误?它总是同一条线吗?它崩溃的表达和值是什么? – 2012-03-28 05:28:28

+0

浮点异常不明显,但我确定错误发生在'SDL_SetVideoMode(WIDTH,HEIGHT,32,SDL_OPENGL)''行。即,SDL_OPENGL标志在g ++编译器中导致错误。 – Christian 2012-03-28 05:32:06

+0

你用什么标志编译它? '-lSDL -lGL'? – 2012-03-28 12:59:16

回答

0

[解决]

首先,我说错。当我说它不是编译时,它是;该程序实际上没有运行,在Ubuntu 11.10的终端中给我一个模糊的“浮点异常”错误。在和我的朋友一起研究了几个小时的问题之后,我无济于事地给了它最后一次尝试,并更新了我的图形驱动程序。是的,这固定了一切。

更新我的AMD(fglrx的)显卡驱动程序,我只是打开了终端键入:

sudo apt-get install fglrx-updates-dev 

来吧,重新启动,并激活专有的图形驱动程序!