Лисья Нора

Оглавление


§ Тестовый пример

Несмотря на то что SDL1.2 является устаревшим стандартом, на самом деле, его возможностей вполне хватает для любых целей, связанных с простыми задачами отрисовки на SDL canvas.
#include "sdl1.h"
 
float t = 0;
 
// Обработчик аудио: пример низкочастотного бинаурального биения
void audio_callback(void *data, unsigned char *stream, int len)
{
for (int i = 0; i < len; i += 2) {
 
stream[i] = 128. + 32.*sin(t*1.05);
stream[i+1] = 128. + 32.*sin(t);
 
t += 0.01;
}
}
 
int main(int argc, char** argv)
{
screen();
 
// Тестовая картинка
for (int y = 0; y < 400; y++)
for (int x = 0; x < 640; x++)
pset(x, y, x*y);
 
// Активация аудиоканала
_sdl_audio.callback = audio_callback;
audiost();
 
// Цикл обработки
while (loop()) { }
 
return 0;
}

§ Код sdl1.h

#include "SDL.h"
 
SDL_Event _event;
SDL_Surface* _sdl_screen;
SDL_AudioSpec _sdl_audio = {44100, AUDIO_U8, 2, 0, 2048};
Uint32 _ptick;
Uint32 _width, _height;
int _mx, _my, _kbcode, _kbmod, _mk;
 
// Создать окно
void screen(int width = 640, int height = 400)
{
_width = width;
_height = height;
 
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
SDL_EnableUNICODE(1);
_sdl_screen = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Window SDL 1.2", 0);
SDL_EnableKeyRepeat(500, 30);
_ptick = 0;
}
 
// Установка маленькой точи
void pset(int x, int y, Uint32 color)
{
if (x >= 0 && y >= 0 && x < _width && y < _height) {
((Uint32*)_sdl_screen->pixels)[x + _width*y] = color;
}
}
 
// Главный цикл
int loop(int length = 20)
{
int tmp;
 
// Регистрация событий
while (SDL_PollEvent(&_event)) {
 
switch (_event.type) {
 
case SDL_QUIT: return 0;
 
// Перемещение мыши
case SDL_MOUSEMOTION:
 
_mx = _event.motion.x;
_my = _event.motion.y;
break;
 
// Нажата мышь
case SDL_MOUSEBUTTONDOWN:
 
_mx = _event.motion.x;
_my = _event.motion.y;
tmp = _event.motion.state;
 
if (tmp == SDL_BUTTON_LEFT) _mk |= 1;
else if (tmp == SDL_BUTTON_RIGHT) _mk |= 2;
else if (tmp == SDL_BUTTON_MIDDLE) _mk |= 4;
break;
 
// Мышь отпущена
case SDL_MOUSEBUTTONUP:
 
_mx = _event.motion.x;
_my = _event.motion.y;
tmp = _event.motion.state;
 
if (tmp == SDL_BUTTON_LEFT) _mk &= ~1;
else if (tmp == SDL_BUTTON_RIGHT) _mk &= ~2;
else if (tmp == SDL_BUTTON_MIDDLE) _mk &= ~4;
break;
 
// https://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlkeysym.html
case SDL_KEYDOWN:
 
_kbcode = _event.key.keysym.unicode;
_kbmod = _event.key.keysym.mod;
if (_kbcode == 0) _kbcode = 0x100 + _event.key.keysym.sym;
break;
 
case SDL_KEYUP:
 
_kbcode = _event.key.keysym.unicode;
_kbmod = _event.key.keysym.mod;
if (_kbcode == 0) _kbcode = 0x100 + _event.key.keysym.sym;
break;
}
}
 
// Вычисление разности времени
for (;;) {
 
Uint32 nticks = SDL_GetTicks();
 
if (nticks - _ptick >= length) {
 
SDL_Flip(_sdl_screen);
_ptick = nticks;
return 1;
 
} else {
SDL_Delay(1);
}
}
}
 
// Активировать аудиоканал
void audiost()
{
SDL_OpenAudio(& _sdl_audio, 0);
SDL_PauseAudio(0);
}

§ makefile

all:
g++ `sdl-config --cflags --libs` -O3 app.cc -lSDL -o app && ./app