回 帖 发 新 帖 刷新版面

主题:[qbasic]发两个图象处理的SUB

设置调色板:
首先在主程序中定义数组:
dim shared redcol(255) as integer
dim shared grecol(255) as integer
dim shared blucol(255) as integer

SUB setpalette (r AS INTEGER)
    FOR i = 1 TO 16
        FOR j = 1 TO 16
            x = ((i + 1) \ 2 - 1) * r
            red = x \ r
            IF red = 7 THEN red = 8
            IF x = r * 7 THEN x = r * 8 - 1

            y = ((j - 1) \ 4) * r
            IF i MOD 2 = 0 THEN y = y + r * 4
            gre = y \ r
            IF gre = 7 THEN gre = 8
            IF y = r * 7 THEN y = r * 8 - 1

            z = ((j - 1) MOD 4) * r * 2
            blu = z \ r
            IF blu = 6 THEN blu = 8
            IF z = r * 6 THEN z = r * 8 - 1

            t = i * 16 + j - 17
            redcol(t) = red
            grecol(t) = gre
            blucol(t) = blu

            OUT &H3C8, t: OUT &H3C9, x: OUT &H3C9, y: OUT &H3C9, z
        NEXT j
    NEXT i
END SUB

参数r最小为1,最大为8,与对比度有关.
本调色板保证和BMP的256色一模一样.

向数组中放图片:
DEFLNG A-Z
SUB putimage (seg1 AS INTEGER, ptr1 AS INTEGER, seg2 AS INTEGER, ptr2 AS INTEGER, px AS INTEGER, py AS INTEGER)
    DEF SEG = seg1
    wid = (PEEK(ptr1) + PEEK(ptr1 + 1) * 256) \ 8
    hei = PEEK(ptr1 + 2)
    DEF SEG = seg2
    targetwid = (PEEK(ptr2) + PEEK(ptr2 + 1) * 256) \ 8
    FOR i = 0 TO hei - 1
        ds = ptr1 + i * wid + 4
        dt = ptr2 + (i + py) * targetwid + 4 + px
        FOR j = 0 TO wid - 1
            DEF SEG = seg1
            x = PEEK(ds + j)
            DEF SEG = seg2
            POKE dt + j, x
        NEXT j
    NEXT i
END SUB

seg1 是源图片的SEG.
ptr1 是源图片的PTR.
seg2 是目标图片的SEG.
ptr2 是目标图片的PTR.
px 是源图片在目标图片中的X坐标.
py 是源图片在目标图片中的y坐标.

PS:调用此过程必须保证源图片不会露到目标图片外面. 否则......后果自负!!!


取得SEG和PTR的方法:
dim ss(6) as integer
seg = VARSEG(ss(0))
ptr = VARPTR(ss(0))

在这里顺便讲一下, 源图片和目标图片必须是可以PUT的.
例如:
dim ss(129) as integer
ss(0)=128      '此乃图片宽度*8是也.
ss(1)=16       '此乃图片高度是也.
for i=2 to 129
  ss(i)=1028   '大家改一改就知道了.
next i
SCREEN 13
PUT (0,0),ss, PSET    '除了PSET,还有PRESET, XOR, AND, OR.大家可以试试.

回复列表 (共5个回复)

沙发

从数组中取出图片:(这一回seg1 是目标,seg2是源.)
DEFLNG A-Z
SUB getimage (seg1 AS INTEGER, ptr1 AS INTEGER, seg2 AS INTEGER, ptr2 AS INTEGER, px AS INTEGER, py AS INTEGER, wid AS INTEGER, hei AS INTEGER)
    DEF SEG = seg2
    targetwid = (PEEK(ptr2) + PEEK(ptr2 + 1) * 256) \ 8
    FOR i = 0 TO hei - 1
        ds = ptr1 + i * wid + 4
        dt = ptr2 + (i + py) * targetwid + 4 + px
        FOR j = 0 TO wid - 1
            DEF SEG = seg2
            x = PEEK(dt + j)
            DEF SEG = seg1
            POKE ds + j, x
        NEXT j
    NEXT i
    ds = wid * 8
    ds1 = ds \ 256
    ds2 = ds - ds1 * 256
    DEF SEG = seg1
    POKE ptr1, ds2
    POKE ptr1 + 1, ds1
    POKE ptr1 + 2, hei
END SUB

wid 是要取出的部分的宽.
hei 是要取出的部分的高.

半透明显示:(要先调用刚才设置调色板的过程)
DEFLNG A-Z
SUB transput (seg1 AS INTEGER, ptr1 AS INTEGER, seg2 AS INTEGER, ptr2 AS INTEGER, px AS INTEGER, py AS INTEGER, trans AS INTEGER)
    DEF SEG = seg1
    wid = (PEEK(ptr1) + PEEK(ptr1 + 1) * 256) \ 8
    hei = PEEK(ptr1 + 2)
    DEF SEG = seg2
    targetwid = (PEEK(ptr2) + PEEK(ptr2 + 1) * 256) \ 8
    FOR i = 0 TO hei - 1
        ds& = ptr1 + i * wid + 4
        dt& = ptr2 + (i + py) * targetwid + 4 + px
        FOR j = 0 TO wid - 1
            DEF SEG = seg1
            col1 = PEEK(ds& + j)
            DEF SEG = seg2
            col2 = PEEK(dt& + j)
            rs = redcol(col1) * (100 - trans) + redcol(col2) * trans
            gs = grecol(col1) * (100 - trans) + grecol(col2) * trans
            bs = blucol(col1) * (100 - trans) + blucol(col2) * trans
            rt = (rs + (rs > 700) * 100 + 100) \ 100
            gt = (gs + (gs > 700) * 100 + 100) \ 100
            bt = (bs + (bs > 600) * 100 + 100) \ 200
            colx = rt * 32 + gt * 4 + bt
            POKE dt& + j, colx
        NEXT j
    NEXT i
END SUB

尽管现在大家都用VB,VC++,但QB仍然是王道中的王道!

板凳

不知道能用在哪?如果是原创,我强烈支持

3 楼

比如说: 做RPG的时候,角色在背景上移动,而背景上有许多的石头,花草等东西,那么你如果在屏幕上直接画,那个角色以及背景就会狂闪......所以要把它们先放到一个数组中,再一起显示出来.

另外说一下,那个是原创的.

4 楼

DOS游戏的确需要.....

5 楼

很有意思哦,我现在做RPG,也用到里面的一点东西,比如精灵在冰魔法里要变成蓝色,我就把精灵页面每一个点或0x1f

我来回复

您尚未登录,请登录后再回复。点此登录或注册