探索DirectQB2

来自: 作者:Kasi
 看过探索一的文章了吗,好吧,我们继续我们DirectQB
的旅程。这回我们分析DirectQB自带的Eclogo.bas文件。看
看图片的调用、翻转及缩放。

--------------
下面是EClogo.bas的主程序:
'???表示Kasi不理解的地方。
DEFINT A-Z
'$INCLUDE: 'DIRECTQB.BI'
DECLARE SUB Logo () '声明logo子过程

IF DQBinit(2, 0) THEN DQBclose: PRINT DQBerror$: END
'DQBinit(2, 0)声明VIDEO,1,2三个层

DQBinitVGA
Logo '调用logo子过程
DQBclose
END
其他的语句在《探索一》中已经介绍过了,请查考《探索一》。

--------------
下面是logo子过程:
SUB Logo
'声明变量
DIM Pal AS STRING * 768, LogoPic(32001) AS INTEGER
'Pal AS STRING * 768用于储存屏幕的颜色(详见程序后的解释)
'LogoPic(32001)声明用于储存图片的数组
'32001如何得来?因为下面的图片大小为320x200
'所以,32001=320x200+1(不知为何这样算???)
DIM t AS SINGLE, White AS INTEGER
'White储存颜色代码

IF DQBloadLayer(2, "ECLOGO.PCX", Pal) THEN
PRINT "Error loading ECLOGO.PCX, program aborted": DQBclose: END
'DQBloadLayer命令在第2层中调入ECLOGO.PCX
'DQBloadLayer只能调用BMP、PCX及QB中用BSAVE存的格式
'关于BSAVE请看《QB活动图象1、2》
'Pal取得PCX文件的颜色表
DQBget 2, 0, 0, 319, 199, VARSEG(LogoPic(0)), VARPTR(LogoPic(0))
'把上面的图片读如数组中
DQBsetPal Pal
'设置屏幕的颜色表为Pal
White = DQBfindCol(63, 63, 63)
'DQBfindCol(r,g,b)设置颜色,r:red、g:green、b:blue(取值为0-63)
WHILE INKEY$ <> "": WEND
FOR i = 0 TO 50
DQBboxf 1, 0, 0, 319, 199, White
'用DQBboxf把第1层画成全白
DQBrPut 1, 0, 0, VARSEG(LogoPic(0)), VARPTR(LogoPic(0)), (150 - (i * 3)), (500 - (i * 8))
'重点东西,认真看
'DQBrPut在第1层从坐标0,0开始画那张图片
'(150 - (i * 3))设置图片旋转的角度(顺时针,当值为128时转180度)
'(500 - (i * 8))设置图片的缩放(值:100,不变;大于100,放大;小于100,缩小)
'图片以中心来缩放;值为50,图缩小一半;值为200,图放大一倍;其它类推
DQBwait 1
DQBcopyLayer 1, VIDEO
IF INKEY$ <> "" THEN
DQBfadeTo 0, 0, 0
'颜色向0,0,0渐变,0,0,0为RGB,这儿是黑色
EXIT SUB
END IF
NEXT i
DQBcopyLayer 2, VIDEO
t = TIMER
DO
IF INKEY$ <> "" THEN
DQBfadeTo 0, 0, 0
EXIT SUB
END IF
LOOP WHILE TIMER < t + 3
FOR i = 0 TO 99
DQBboxf 1, 0, 0, 319, 199, White
DQBrPut 1, EXP(i / 18), 0, VARSEG(LogoPic(0)), VARPTR(LogoPic(0)), (i * 3), (100 - i)
DQBwait 1
DQBcopyLayer 1, VIDEO
IF INKEY$ <> "" THEN
DQBfadeTo 0, 0, 0
EXIT SUB
END IF
NEXT i
DQBfadeTo 0, 0, 0

END SUB

-------------
颜色表格式:
程序中的Pal是用于储存当前屏幕的颜色表。因为DirectQB
是256色的,所以Pal是STRING*768(768=256*3)。因为储存时使
用RGB格式(Red,Green,Blue),所以每三个字符储存一种颜色。
若要取得颜色表中第45个颜色中green的值,可用下面语句:
green = ASC(MID$(Pal, ((45 * 3) + 2), 1))
| |
| \ 用1,2,3替换这个值,分别
| 表示Red,Green,Blue
\ 用3乘以需要的第n个颜色。

-------------
这回就说到这,若想继续提高,请听下回分解。
由于技术有限,翻译的问题,还请大家多多指导。
By Kasi
2000.8.6