Несмотря на то что 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;
}
#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;
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);
}