掌叔
2009-02-10 09:36:43
摘自:[url]http://bbs.khors.com[/url]
作者:Dr.Watson
先看看本篇截图:
[attach]754[/attach]
我们在上一篇画图时, 并没有理会有没有透明色, 所以这一篇和大家讨论一下关于透明色的处理.
我们一直用的, 是32bit, 8888(ABGR)的像素格式, A本是代表透明度, 当值是0, 即代表全透明, 255是代表完全不透明, 而其他值侧代表不同的透明度. 但我们因为是直接把像素放进VRAM, 这个值对我们没有什麽意义, 但我们可以利用它, 作为透明色的代表: 0 代表透明, 255 代表不透明.
下面就是对DrawImage()的改动:
[code=c]for (i=0;i
pSrc = pImage;
pDest = pFrameBuffer;
for (j=0;j
if (*pSrc & 0xFF000000) // 不是透明色才画
*pDest = *pSrc;
pDest++;
pSrc++;
}
pImage += image->mWidth;
pFrameBuffer += FRAME_BUFFER_WIDTH;
}[/code]
DrawImageRect()也做了相同的改动.
LoadImage()也加入透明色的设定:
[code=c]...
int a = (color32 >> 24) & 0xff;
...
case PSP_DISPLAY_PIXEL_FORMAT_8888:
color32 = r | (g << 8) | (b << 16) | (a<<24);
*(p32+x) = color32;
break;[/code]
附带的执行包是1.50的 :) 自行编译, 要把m.png, bg.png和 cursor.png 放在记忆棒game03的目录内!
要是大家把本篇程式放到PSP上试, 会发现画面显示有点奇怪, 这是因为我们直接写入VRAM, 而PSP在同一时间更新萤幕所产生的后果. 要解决这个问题, 我们要用double buffering 和 page flipping. 我会在以后和大家讨论一下有关应用 :)
TW241
2009-08-07 21:51:21
我支持你