DirectQB探索1

来自: 作者:Kasi
经过几天的试验,果然从DirectQB中发现了不少好东东。
还是让我们一起来看看吧。(由于Kasi水平有限,很多都
是以自己的方式理解,一定存在了不少问题,你发现了
请告诉我)

先把下面的程序拷成一个bas文件,运行看看!不错吧。
(假定你已用了DirectQB的游戏库,并先看过Kasi的
《DirectQB介绍》的文章)

DEFINT A-Z

'$INCLUDE: 'DIRECTQB.BI'

IF DQBinit(1, 0) THEN DQBclose: PRINT DQBerror$: END

dummy& = SETMEM(-66000)

IF DQBcreateBMap THEN DQBclose: PRINT DQBerror$: END

DQBsetBMap 40, 32, 13

size = DQBsize(0, 0, 63, 7)
DIM Sprite(size)

DQBclearLayer 1
DQBprint 1, "DirectQB", 0, 0, 32
DQBprint 1, "Power!", 0, 8, 40

DQBget 1, 0, 0, 63, 7, VARSEG(Sprite(0)), VARPTR(Sprite(0))
DQBget 1, 0, 8, 63, 15, VARSEG(Sprite(0)), (VARPTR(Sprite(0)) + size)

DQBinitVGA

FOR x = -64 TO 320
' Clean our hidden layer
DQBclearLayer 1

' Draws our sprites on layer 1
DQBput 1, x, 96, VARSEG(Sprite(0)), VARPTR(Sprite(0))
DQBbPut 1, (256 - x), 96, VARSEG(Sprite(0)), (VARPTR(Sprite(0)) + size)

' Copies layer 1 on the screen
DQBwait 3
DQBcopyLayer 1, VIDEO
NEXT x

DQBclose
dummy& = SETMEM(66000)

--------------
好了,我们还是一步一步来分析一下:(有???的地方,
表示Kasi还没弄清楚的那是干啥的)

DEFINT A-Z
'在程序开头要放上这个语句,作用还不太清楚,
'好象是声明允许读写内存的语句。???

'$INCLUDE: 'DIRECTQB.BI'
'程序运行时必要的头文件说明
'DIRECTQB.BI文件中告诉程序需调用的库(.OBJ文件)

IF DQBinit(1, 0) THEN DQBclose: PRINT DQBerror$: END
'创建层(Layer),若不成功则关闭程序(DQBclose),并
'输出错误信息(PRINT DQBerror$)

dummy& = SETMEM(-66000)
'为画图(作者称为blender map)分配66K的内存

IF DQBcreateBMap THEN DQBclose: PRINT DQBerror$: END
'试着创建blender map,若失败则关闭程序

DQBsetBMap 40, 32, 13
'设置前景、背景及替换色(作者叫替换色为New Color)
'当使用前景色的图案与使用背景色的图案重合时,
'重合区域即为New Color。
'40 亮红;32 亮蓝;13 亮紫

size = DQBsize(0, 0, 63, 7)
'设置截取图片的数组大小
'DQBsize(x1,y1,x2,y2)可帮你换算在区域(左上角坐标为x1,y1到
'右下角坐标为x2,y2)内的像数点的多少,也就是要声明的数组的
'大小。x1,y1,x2,y2等要是整数
DIM Sprite(size)
'声明用来存放图片的数组

DQBclearLayer 1
'清空-层1-
DQBprint 1, "DirectQB", 0, 0, 32
'在-层1-上坐标为(0,0)的地方用亮蓝(32)写上DirectQB
DQBprint 1, "Power!", 0, 8, 40
'在-层1-上坐标为(0,8)的地方用亮蓝(40)写上Power!

'取得我们上面写的两行字,并写入内存(作者用Sprite精灵来表示)
DQBget 1, 0, 0, 63, 7, VARSEG(Sprite(0)), VARPTR(Sprite(0))
'把-层1-中的一块区域写到内存中(区域左上角坐标为0,0,
'即:字符DirectQB 右下角坐标为63,7)
'VARSEG(Sprite(0))打开内存地址???
'VARPTR(Sprite(0))设置写入的起始位置???
DQBget 1, 0, 8, 63, 15, VARSEG(Sprite(0)), (VARPTR(Sprite(0)) + size)
'同上(区域左上角坐标为0,8,右下脚坐标为63,15)
'因为size为所取区域大小,VARPTR(Sprite(0))+size就
'可把字符Power!紧更在字符DirectQB后写如内存

DQBinitVGA
'初始化屏幕,显示前必需的语句

'字符的移动开始
FOR x = -64 TO 320

DQBclearLayer 1

DQBput 1, x, 96, VARSEG(Sprite(0)), VARPTR(Sprite(0))
'在-层1-坐标为(x,96)的地方画上字符DirectQB
DQBbPut 1, (256 - x), 96, VARSEG(Sprite(0)), (VARPTR(Sprite(0)) + size)
'在-层1-坐标为(256-x,96)的地方画上字符Power!
'DQBput用于画前景图,DQBbPut用于画背景图

DQBwait 3
'等待3毫秒(好象是毫秒吧)???
DQBcopyLayer 1, VIDEO
'将-层1-整个复制到-VIDEO-(就是我们可看见的屏幕,或叫-层0-)
NEXT x

DQBclose
'关闭程序,DQBclose只用于关闭DirectQB的声明DQBinit(?,?)
dummy& = SETMEM(66000)
'释放前面声明的内存
--------------
还蛮简单的吧,可Kasi翻译时,E文看得我头都大了。
有什么经验或不懂的地方。一定要和我交流一下哟。
E-Mail:kasicass@netease.com
这里只介绍了DirectQB中的一小部分,其它内容
Kasi正在努力翻译当中,等好消息吧。
By Kasi
2000.8.3