|
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 |
|