(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
我们在上一篇画图时, 并没有理会有没有透明色, 所以这一篇和大家讨论一下关于透明色的处理.(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
我们一直用的, 是32bit, 8888(ABGR)的像素格式, A本是代表透明度, 当值是0, 即代表全透明, 255是代表完全不透明, 而其它值侧代表不同的透明度. 但我们因为是直接把像素放进VRAM, 这个值对我们没有什么意义, 但我们可以利用它, 作为透明色的代表: 0 代表透明, 255 代表不透明.(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
下面就是对DrawImage()的改动:(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
for (i=0;i<height;i++)(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
{(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
pSrc = pImage;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
pDest = pFrameBuffer;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
for (j=0;j<width;j++)(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
{(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
if (*pSrc & 0xFF000000) // 不是透明色才画(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
*pDest = *pSrc;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
pDest++;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
pSrc++;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
}(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
pImage += image->mWidth;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
pFrameBuffer += FRAME_BUFFER_WIDTH;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
} (a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
DrawImageRect()也做了相同的改动.(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
LoadImage()也加入透明色的设定:(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
...(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
int a = (color32 >> 24) & 0xff;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
...(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
case PSP_DISPLAY_PIXEL_FORMAT_8888:(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
color32 = r | (g << 8) | (b << 16) | (a<<24);(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
*(p32+x) = color32;(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
break; (a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
附带的执行包是1.50的 :) 自行编译, 要把m.png, bg.png和 cursor.png 放在记忆棒game03的目录内!(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
(a_/WuyLxytxaZNd-/4FRz7HB$Mk\本文来自:V电G玩S天K空Y
要是大家把本篇程序放到PSP上试, 会发现画面显示有点奇怪, 这是因为我们直接写入VRAM, 而PSP在同一时间更新屏幕所产生的后果. 要解决这个问题, 我们要用double buffering 和 page flipping. 我会在以后和大家讨论一下有关应用 :)


