Этот шаблон позволяет быстро создать приложение 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
29 мая, 2020
© 2007-2022 Мочил лажовый запад