Using Libraries
 
作者在SJ Zero的许可下,这是QBXL杂志发表的文章摘录。


FreeBASIC最大的优点是能够与许多标准C库无缝集成,同时保持QB的易用性。即使在FB拥有内置的图形库之前,无畏的编码人员正在使用SDL来获取图形和声音例程。在当前版本包括SDL_net和Winsock之前,我自己已经包含了一些编码器,与标题一起进行了FreeBASIC的网络支持。今天,我将介绍如何开始使用三个高级库:SDL,fmod和tinyPTC。了解基础知识后,您将看到使用C库足够简单,除了少数例外,C库不再比QB库使用更难于使用FreeBASIC。



这些图书馆是什么?

这些图书馆特别有用,因为它们往往为游戏提供功能。

SDL是一个内置图形和输入支持的库,还有一些网络TrueType字体支持音频的子库。它可以与OpenGL一起使用,但我今天不会覆盖。

TinyPTC主要是图形库,最简单的图形库。它只是给你一个指向图形里根绘制的指针。

FMod是一个3d声音和音乐库。虽然它的许可证是奇怪的,它可以接受播放声音,它很好地封装3D声音。

包括图书馆

让这些图书馆工作的第一步就是把头文件放在你的项目中。
对于SDL,只是简单
 '$INCLUDE: "SDL\SDL.bi"
对于FMOD,它是
 '$Include: 'fmod.bi'
和tinyPTC,你会想要的
 '$INCLUDE: 'tinyptc.bi'
'2.启动库,加载文件'

显然,如果必须首先做的事情,你不能仅仅包括lib和fire。
要启动SDL并将位图加载到内存中,您必须:
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 ) 'sets the video mode for 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
Blitting,Playing或Plotting

显而易见的最重要的一步就是让屏幕或扬声器得到你想做的任何事情。这部分比较容易,可以进一步封装成包装功能。对于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 ()
这就是退出!
您可以看到,与QuickBASIC相比,在FreeBASIC中使用库的内容本身就更加困难。事实上,由于编码人员不需要跳过环就可以获得内存,所以即使现在的操作系统和硬件也是如此,实际上更容易。