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;
}
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? –
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
Mit welchen Flaggen kompilieren Sie das? '-lSDL -lGL'? –