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

学习PSP游戏制作实况记录:双缓冲区和背景卷动

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

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

b+DyL}\N-!]CsH2C=+O%f%cuEx28;2$n<Nj@Ew{5Z,~:=ZXt7-EMULkYd@#!fkM\QK#Nz本文来自:V电G玩S天K空Y

上一篇的背景是由40个64x64的小图组成, 我们每次更新画面都会把整个背景重新画一次, 要是当我们重画背景和角色时(即正在写入VRAM), 正好PSP也在更新画面, 就会有些奇怪的情况发生. 为了避免这样的情况, 我们就要用双缓冲区(Double Buffering)加上换页(Page Flipping)的技巧.

b+DyL}\N-!]CsH2C=+O%f%cuEx28;2$n<Nj@Ew{5Z,~:=ZXt7-EMULkYd@#!fkM\QK#Nz本文来自:V电G玩S天K空Y

 

b+DyL}\N-!]CsH2C=+O%f%cuEx28;2$n<Nj@Ew{5Z,~:=ZXt7-EMULkYd@#!fkM\QK#Nz本文来自:V电G玩S天K空Y

`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 本篇截图:`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 什么是双缓冲区呢? 假设我们有A 和 B 两个缓冲区,  当PSP显示A时, 我们在B作更新, 等到B的更新完成了, 我们就告诉PSP去显示B, 这时当PSP显示B时, 我们就更新A... 如此这类推. 而告诉PSP去显示A或B, 就是换页!`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 PSP有2MB的VRAM, 所以就算是32bit像素, 也可以放下多于两个的缓冲区, 而PSP也提供了sceDisplaySetFrameBuf() 作为换页用, 所以在PSP上应用双缓冲区, 可以说是非常方便!`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
   ...`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
       pBufferPointer[0] = (u32*)(0x04000000+0x40000000); // 设定好两个缓冲区的地址`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
       pBufferPointer[1] = (u32*)(0x04000000+0x40000000+FRAME_BUFFER_SIZE);`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 ...`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              // 换页`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              sceDisplayWaitVblankStart();`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              sceDisplaySetFrameBuf(pVRAM, FRAME_BUFFER_WIDTH, PSP_DISPLAY_PIXEL_FORMAT_8888, 0);`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              // 把现在写入的VRAM地址指到下一个缓冲区`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              currentPage = 1-currentPage;`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              pVRAM = pBufferPointer[currentPage];`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              Render();              // 更新缓冲区内容, 以便一会显示出来
`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 要是大家把本篇执行包放到PSP测试, 会看到一个卷动的背景, 这就是小朱仔仔提到的"...如何将超过1个屏幕大小的2d地图"在画面卷动的基本原理. 主要来说, 我们的背景是以铺地砖的形式拼出来的, 这就是所谓的tilemap:`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
           int i, j, xx, yy;`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
       // 画背景`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
       yy = offset/2;                     // 我们的地砖大小是64x64, 而我们画背景时用一个"错位"来达到移动的效果`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
       for (i=0;i&lt;6;i++)              // 横着画6个`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
       {`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              xx = offset/2;`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              for (j=0;j&lt;9;j++)      // 垂直画9个`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              {`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
                     DrawImage(bg, xx, yy);`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
                     xx += 64;`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              }`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
              yy += 64;`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
       }
`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 我们现在只用了一种地砖, 但要是我们有很多不同的地砖, 而再把在什么位置铺什么地砖用array存起来, 在画背景时, 参照这个列表来画, 结果就是一个可以是很大的, 可供卷动的地图了!`V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 `V}5g{R^,]xn].Q\lUI`NdK^ZODV^f#.s+<Alnppv%H6B<O$}OB]Bn>Rio6=i%^[-!l~NJXQ53Z_Kt:|P7#KMMNn本文来自:V电G玩S天K空Y
 附带的执行包是1.50的 :) 自行编译, 要把m.png, bg.png和 cursor.png 放在记忆棒game04的目录内!

【分类导航】

【热门游戏资讯】

更多

【推荐游戏资讯】

更多

【最新资讯更新】

更多

【赞助商链接】