#include #include #include #ifdef main #undef main #endif class WRS_SDL { bool running; public: WRS_SDL(); ~WRS_SDL(); void init(int w, int h, const char *title); }; WRS_SDL::WRS_SDL() { running = false; } WRS_SDL::~WRS_SDL() { if(running) { SDL_Quit(); } } void WRS_SDL::init(int w, int h, const char *title) { running = true; if(SDL_Init( SDL_INIT_VIDEO ) < 0) throw __LINE__; int rgb_size[3] = {5, 5, 5}; // for 16 bit video. try also 8,8,8 for 24/32 bit video SDL_GL_SetAttribute( SDL_GL_RED_SIZE, rgb_size[0] ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, rgb_size[1] ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, rgb_size[2] ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 ); const SDL_VideoInfo *info = SDL_GetVideoInfo(); if ( SDL_SetVideoMode( w, h, info->vfmt->BitsPerPixel, SDL_OPENGL | SDL_SWSURFACE) == NULL ) // why SDL_SWSURFACE? throw __LINE__; SDL_WM_SetCaption(title, title); glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, 0, h, -1.0, 1.0); // -1.0, +1.0 ??? glClearColor(0.0,0.0,0.0,0.0); SDL_ShowCursor(0); } class Bat { int width, height; int bat_w, bat_h; int bat_x, bat_y; int speed; public: Bat(int w, int h); void top(); void bottom(); void draw(); void update(); void move(char direction, bool keydown); }; Bat::Bat(int w, int h) { width = w; height = h; bat_w = 100; bat_h = 10; speed = 0; } void Bat::top() { bat_x = width / 2 - bat_w / 2; bat_y = height - bat_h; } void Bat::bottom() { bat_x = width / 2 - bat_w / 2; bat_y = 0; } void Bat::draw() { glBegin(GL_POLYGON); glColor3f(1.0, 1.0, 1.0); glVertex2i(bat_x, bat_y + bat_h - 1); glVertex2i(bat_x + bat_w - 1, bat_y + bat_h - 1); glVertex2i(bat_x + bat_w - 1, bat_y); glVertex2i(bat_x, bat_y); glEnd(); } void Bat::update() { int old_bat = bat_x; bat_x += speed; if(bat_x < 0 || bat_x + bat_w >= width) { speed = 0; bat_x = old_bat; } } void Bat::move(char direction, bool keydown) { if(keydown) { speed = 1; if(direction == 'L') speed = -speed; } else { speed = 0; } } #include using namespace std; int main(int argc, char **argv) { try { WRS_SDL sdl; const int width = 800, height = 600; sdl.init(width, height, argv[0]); Bat ubat(width, height); Bat cbat(width, height); ubat.bottom(); cbat.top(); bool done = false; while(!done) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ubat.draw(); cbat.draw(); SDL_GL_SwapBuffers(); //SDL_Delay(20); ubat.update(); cbat.update(); SDL_Event event; while( SDL_PollEvent( &event ) ) { switch(event.type) { case SDL_KEYDOWN: case SDL_KEYUP: switch(event.key.keysym.sym) { case SDLK_ESCAPE: if(event.type == SDL_KEYDOWN) done = true; break; case SDLK_LEFT: ubat.move('L', event.type == SDL_KEYDOWN); break; case SDLK_RIGHT: ubat.move('R', event.type == SDL_KEYDOWN); break; } break; case SDL_QUIT: done = true; break; } } } } catch(int line) { cout << "Error, line " << line << endl; } return 0; }