Это выдержка из статьи, опубликованной в журнале "QBXL, с разрешения автора
SJ Zero.
Самой сильной FreeBASIC является его способность легко интегрироваться с
рядом стандартных библиотек C, сохраняя при этом простоту использования QB.
FB имееет встроенную графическую библиотеку, но многие кодеры используют SDL
для доступа к процедурам вывода графики и звука. Прошлая версия включала
sdl_net и Winsock и ряд кодеров, включая меня, боролся с заголовками, чтобы
получить поддержку сети в FreeBASIC. Сегодня я постараюсь как можно проще
объяснить, как приступить к работе с тремя передовыми библиотеками: SDL,
FMOD и tinyPTC. После понимания основ, вы увидите что библиотеки языка СИ не
труднее использовать в FreeBASIC, чем использование библиотек в QB.
Для чего эти библиотеки?
Эти библиотеки особенно полезны, поскольку они, как правило, обеспечивают
функции для игр.
SDL - библиотека для вывода графики с поддержкой ввода, и целая группа
вспомогательных библиотек для
сети,
поддержки шрифтов TrueType,
и
аудио. Она может использоваться с OpenGL,
но я не буду сегодня об этом говорить.
TinyPTC - это графическая библиотека, самая простая из имеющихся. Она дает
указатель на буфер с графическими данными для рисования.
FMOD является звуковой библиотекой с поддержкой 3D звука. Хотя ее лицензия
ограниченная, она работает приемлемо для воспроизведения звуков и
замечательно отражает 3D звук.
Подключение библиотеки
Первый шаг в подключении любой из этих библиотек, это подключить заголовки к
вашему проекту.
Для SDL, это так
'$INCLUDE: "SDL\SDL.bi"
Для FMOD, так
'$Include: 'fmod.bi'
и для tinyPTC, так
'$INCLUDE: 'tinyptc.bi'
'2. Инициализируем библиотеку, загружаем файл'
После подключения заголовков, нужно инициализировать библиотеку и загрузить
рисунок в память:
CONST SCR_WIDTH = 640
CONST SCR_HEIGHT = 480
DIM MenuScreen AS SDL_Surface ptr 'our bitmap
DIM Shared video AS SDL_Surface ptr 'our screen surface
SDL_Init ( SDL_INIT_VIDEO )
video = SDL_SetVideoMode( SCR_WIDTH, SCR_HEIGHT, 32, 0 ) 'устанавливаем видеорежим для 640x480x32
MenuScreen = SDL_LoadBMP("bitmap.bmp")
Для инициализации FMOD и загрузки звука в память:
DIM sound AS INTEGER 'it's just a handle, so it's an int!
IF FSOUND_GetVersion <= FMOD_VERSION THEN
ErrorQuit "FMOD version " + STR$(FMOD_VERSION) + " or greater required"
End If
If FSOUND_Init(44100, 32, 0) = FALSE Then
ErrorQuit "Can't initialize FMOD"
End If
sound = FSOUND_Sample_Load(FSOUND_FREE,"sound.wav", FSOUND_HW3D, 0, 0)
Наконец, не надо устанавливать никаких лишних форматов данных для загрузки
tinyPTC, но инициализация все таки нужна:
const SCR_WIDTH = 320
const SCR_HEIGHT = 200
const SCR_SIZE = SCR_WIDTH*SCR_HEIGHT
if( ptc_open( "tinyPTC test", SCR_WIDTH, SCR_HEIGHT ) = 0 ) then
end -1
end if
Блитирование, Воспроизведение, или Вычерчивание
Самый важный шаг, это отобразить картинку на экран и воспроизвести звук в
колонках. Эта часть может измениться в дальнейшем, в зависимости от того,
что требуется. Для SDL, отправка изображения на экран выглядит так:
SUB BlitImage(x as integer,y as integer,image as sdl_surface ptr, dest as sdl_surface ptr)
DIM Rectangle as SDL_Rect
DIM Rectangle2 as SDL_Rect
Rectangle.X = 0
Rectangle.Y = 0
rectangle.w = image->w
rectangle.h = image->h
Rectangle2.x = x
Rectangle2.y = y
SDL_BlitSurface image, @rectangle, dest, @rectangle2
END SUB
Для FMOD, воспроизведение звука так же несложно:
FUNCTION fModPlayWave( samp1 as integer ) AS INTEGER
'where samp1 is the number returned by FSOUND_SampleLoad
DIM position(0 to 2)' as FSound_Vector
DIM vel(0 to 2)' FSound_Vector
fModPlayWave = FSOUND_PlaySoundEx(FSOUND_FREE, samp1, NULL, TRUE)
END FUNCTION
TinyPTC не такая высокоуровневая библиотека, как первые две... Все таки
для работы с пикселями можно применить примерно следущее:
SUB putd(BYREF buffer(), BYVAL x AS INTEGER, BYVAL y AS INTEGER, BYVAL colr as INTEGER)
buffer((y * SCR_WIDTH) + x) = colr
ptc_update @buffer(0) 'This is a pageFlip
END SUB
Завершение
Вы должны помнить о закрытии библиотек перед выходом из вашей программы. К
счастью, все три библиотеки делают такое одной строчкой:
SDL: SDL_Quit ()
fmod: FSOUND_Close ()
tinyPTC: PTC_Close ()
Как вы можете видеть, нет ничего сложного в использовании библиотек в
FreeBASIC!