Этот шаблон позволяет быстро создать приложение SDL1.2 (то есть окно) в операционной системе Linux.
§ main.cc
#include <stdio.h> #include <sdlapp.cc> class MainApp : public SDLApp { public: // Унаследовать конструктор MainApp(int w, int h, const char* caption) : SDLApp(w, h, caption) { } // Перехват события от SDL int Event(SDL_Event e) { return 1; }; }; int main(int argc, char* argv[]) { MainApp* app = new MainApp(1024, 768, "Caption"); app->main(); return 0; }
§ sdlapp.cc
#include "SDL.h" // Обработчик кадра uint DisplayTimer(uint interval, void *param) { SDL_Event event; SDL_UserEvent userevent; // Создать новый Event userevent.type = SDL_USEREVENT; userevent.code = 0; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(& event); return (interval); } class SDLApp { protected: int width, height; SDL_Event event; SDL_Surface* sdl_screen; // Нарисовать точку void pset(int x, int y, uint color) { if (x >= 0 && y >= 0 && x < width && y < height) { ( (Uint32*)sdl_screen->pixels )[ x + width*y ] = color; } } // Обменять буфер void flip() { SDL_Flip(sdl_screen); } // Получение ссылки на структуру с данными о нажатой клавише int get_key(SDL_Event event) { SDL_KeyboardEvent * eventkey = & event.key; return eventkey->keysym.scancode; } public: virtual int Event(SDL_Event) = 0; SDLApp(int w, int h, const char* caption) { width = w; height = h; SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); SDL_EnableUNICODE(1); sdl_screen = SDL_SetVideoMode(w, h, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_WM_SetCaption(caption, 0); // 50 кадров в секунду SDL_AddTimer(20, DisplayTimer, NULL); } // Бесконечный цикл void main() { while (1) { while (SDL_PollEvent(& event)) { // Обработка SDL Event switch (event.type) { // Если нажата на крестик, то приложение будет закрыто case SDL_QUIT: return; default: Event(event); } } SDL_Delay(1); } } };
§ makefile
CC=g++ SDL=`sdl-config --cflags --libs` LIBS=-lSDL WARN=-Wall CFLAGS=-I. $(SDL) -O3 $(WARN) OBJ=main.o all: $(OBJ) $(CC) $(CFLAGS) $(OBJ) $(LIBS) -o main ./main %.o: %.cc $(CC) $(CFLAGS) $(LIBS) $< -c -o $@ clean: rm *.o