掌叔
2009-02-10 09:41:00
摘自:[url]http://bbs.khors.com[/url]
作者:Dr.Watson
上一篇的背景是由40个64x64的小图组成, 我们每次更新画面都会把整个背景重新画一次, 要是当我们重画背景和角色时(即正在写入VRAM), 正好PSP也在更新画面, 就会有些奇怪的情况发生. 为了避免这样的情况, 我们就要用双缓冲区(Double Buffering)加上换页(Page Flipping)的技巧.
本篇截图:
[attach]756[/attach]
什麽是双缓冲区呢? 假设我们有A 和 B 两个缓冲区, 当PSP显示A时, 我们在B作更新, 等到B的更新完成了, 我们就告诉PSP去显示B, 这时当PSP显示B时, 我们就更新A... 如此这类推. 而告诉PSP去显示A或B, 就是换页!
PSP有2MB的VRAM, 所以就算是32bit像素, 也可以放下多于两个的缓冲区, 而PSP也提供了sceDisplaySetFrameBuf() 作为换页用, 所以在PSP上应用双缓冲区, 可以说是非常方便!
[code=c]...
pBufferPointer[0] = (u32*)(0x04000000+0x40000000); // 设定好两个缓冲区的地址
pBufferPointer[1] = (u32*)(0x04000000+0x40000000+FRAME_BUFFER_SIZE);
...
// 换页
sceDisplayWaitVblankStart();
sceDisplaySetFrameBuf(pVRAM, FRAME_BUFFER_WIDTH, PSP_DISPLAY_PIXEL_FORMAT_8888, 0);
// 把现在写入的VRAM地址指到下一个缓冲区
currentPage = 1-currentPage;
pVRAM = pBufferPointer[currentPage];
Render(); // 更新缓冲区内容, 以便一会显示出来[/code]
要是大家把本篇执行包放到PSP测试, 会看到一个捲动的背景, 这就是小朱仔仔提到的"...如何将超过1个屏幕大小的2d地图"在画面捲动的基本原理. 主要来说, 我们的背景是以舖地砖的形式拼出来的, 这就是所谓的tilemap:
[code=c]int i, j, xx, yy;
// 画背景
yy = offset/2; // 我们的地砖大小是64x64, 而我们画背景时用一个"错位"来达到移动的效果
for (i=0;i<6;i++) // 横着画6个
{
xx = offset/2;
for (j=0;j<9;j++) // 垂直画9个
{
DrawImage(bg, xx, yy);
xx += 64;
}
yy += 64;
}[/code]
我们现在只用了一种地砖, 但要是我们有很多不同的地砖, 而再把在什麽位置舖什麽地砖用array存起来, 在画背景时, 参照这个列表来画, 结果就是一个可以是很大的, 可供捲动的地图了!
编译后, 要把m.png, bg.png和 cursor.png 放在记忆棒game04的目录内!
TW241
2009-08-07 21:53:33
欣赏你 好好东东
824102727
2009-08-07 22:02:42
非非常常好好
huijuan520
2010-10-22 07:19:32
好强大呀,学习中
灵潭
2010-10-25 00:28:18
能和我联系吗?有些东西要请教您~QQ:1132259027