FreeBasic库文件入门 [SJ ZERO原创,沧海冷心翻译]
http://www.freebasic.cn
FreeBasic最大的优势就是可以与标准C的类库无缝结合。在FREEBASIC拥有内置图形库之前,狂热的FB程序员们都在使用SDL来实现图形和声音开发。在现在这种已经囊括了SDL_NET和WINSOCK库的版本出现之前,包括我在内的不少程序员都在使用各种方法引用头文件来实现网络功能支持。现在我来介绍一下这3个高级库:SDL,FMOD和tinyPTC。了解了他们的原理之后,你会觉得原来使用C的类库是如此简单可靠,在FREEBASIC里使用C的类库将更简单!
一、这些类库到底是什么?
这些类库之所以非常的有用,是因为他们可以给游戏编程提供函数。
SDL这个库含有图形、内置输入支持、网络支持、TRUETYPE字体支持以及声音支持。它也可以和OpenGL一起使用,但是我在这里就不阐述了。
TinyPTC是起初的一个图形库,简单有效。
FMOD是一个3D声音和音乐库。虽然它的授权很古怪,但是它可以播放声音并且封装3D声音。
二、引用这些库
首先我们应该把这些库的头文件引用加在你的工程里。比如添加SDL库:
'$INCLUDE: "SDL/SDL.bi"
FMOD库:
'$Include: 'fmod.bi'
TinyPTC库:
'$INCLUDE: 'tinyptc.bi'
很明显你不能光引用完头文件就完了。初始化SDL并把一幅BMP图读入内存:
CONST SCR_WIDTH = 640
CONST SCR_HEIGHT = 480
DIM MenuScreen AS SDL_Surface ptr '我们的BMP
DIM Shared video AS SDL_Surface ptr '我们的屏幕表面
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 '这只是个句柄,所以是INTEGER
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举个例子,比如发送一个IMAGE到屏幕:
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了,它依然是3个类库中最小巧简单的:
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
四、关闭
虽然你不需要管理内存和那些令人厌烦的任务,但是你必须记住在程序退出前释放类库。幸运的是,刚才的3个程序都只需要一行就能释放:
SDL的释放:
SDL_Quit()
FMOD的释放:
FSOUND_Close()
tinyPTC:
PTC_Close()
这样他们就全部被释放了!
就象你所看到的,在FREEBASIC中使用类库并不象在QB里那么麻烦。事实上,因为程序开发者们不需要去管理内存,开发变的简单多了,哪怕在最流行的操作系统平台和硬件上。
freebasic中文论坛
http://www.freebasic.cn