由小白到大大的涅盘,从vgsky.com开始!

学习PSP游戏制作实况记录:透明色的处理

Update:2007/10/6,Click:0 本文如有下载 请从下面附件中下载

举手之劳 是您对我们最大的支持 感谢您!

先看看本篇截图:(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
 (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. 我会在以后和大家讨论一下有关应用 :)

【分类导航】

【热门游戏资讯】

更多

【推荐游戏资讯】

更多

【最新资讯更新】

更多

【赞助商链接】