校花的贴身高手压缩包教教,如何把PSP里压缩包的ZIP...

后使用快捷导航没有帐号?
查看: 4764|回复: 23
新人欢迎积分0 阅读权限50积分1979精华0UID9336677帖子金钱1649 威望0
电吉他手(最强电击姬) ...
Lv.5, 积分 1979, 距离下一级还需 521 积分
UID9336677帖子威望0 多玩草10 草信仰力0
想加入的朋友请进传送门
&第0篇: 由零?始!
&第1篇: ?入和?示PNG?
&第2篇: 用家操控和??
&第3篇: 透明色的?理
&第4篇: ????和背景??
&第5篇: 制造噪音
??大大小小的&波折&才?好了PSPSDK, ?在, 我?於可以?始干我本?想干的事了: ??PSP??.
?於它的???然很少, 所以一切差不多是?零?始, 忽?奇想, 何不把整????程??在案, 借此, 可以跟有?趣自制PSP??的朋友互相交流??, 有?或不妥?的地方, 也可望能得到高手?的指?.
也不?太多的?面?了, ?始第一篇:
?我知道PSP可以直接??VRAM(VIDEO RAM), 我心中不由一喜, 要知道可以直接??VRAM, 以???程的角度??, 可是拿到了一把&屠??刀&, 只要我?有相?的知?, 2D/3D/特效等等都可以弄出?.
?然, ?分???, 要是只靠??VRAM, ??能不能?到到?滑?快的感?, 是很依?PSP?理器和VRAM的速度和?程功力了. ?好, PSP?有3D加速晶片和OPENGL ES可供??.
但我???先?爬再?跑, 所以我??最基本?始, ?一篇, 我??一下在?幕上??和?四方形, 下面是本篇程式的截?:
[attach]5473619[/attach]
大家看到本篇的原始?, 就?知道它只是由HELLO WORLD改成, 所以我只是著重?明一下在?幕上??和?四方形的部份.
#define SCREEN_WIDTH 480
#define SCREEN_HEIGHT 272
#define SCAN_LINE_SIZE 512 // 512 units (either 16bits or 32bits per scanline
#define ARGB(a, r, g, b) (a&&24|b&&16|g&&8|r)
先看一下?始?候的一些DEFINES, PSP的?幕大小是480X272, 大家可能都已知道了. 至於??SCAN_LINE_SIZE?是?明了, ?然?幕的?度是480, 到??上, 每一??, 是512??位, 就是?每??的右面, 有32??位是?有用到的, 或是有些其他用?.
??幕?定?32bit一?像素?, ?色的排列是ABGR, 即透明度, ?, ?, ?. 和我?平?用的ARGB有?不同, 所以用??ARGB MACRO方便一下.
// VRAM actually starts from 0x but need to OR with 0x to prevent
// unpredictable behaviours due to caching
u32* pVRAM = (u32*)(0xx);
pVRAM 就是VRAM的地址了, 它本身??是0x4000000, 但根?
pspdev wiki 所言, 一定要OR 0x才可直接?用, 要不然?有意想不到的後果!
有了VRAM地址, 我?就可以??了:
// Plot a single pixel on screen
void Plot(int x, int y, u32 color)
u32* p = pVRAM + y * SCAN_LINE_SIZE +
很是方便呢! 注意:上面已提到, 每一??是512??位, 所以我?在?算每??的地址?, 是乘以512而不是480!
明白了??, ?四方形也就很容易了:
// Fill a rectangular area with a specific color
void FillRect(int x, int y, int width, int height, u32 color)
// ?算第一?像素地址
u32* p = pVRAM + y * SCAN_LINE_SIZE +
for (j=0;j&j++)
for (i=0;i&i++) // ?一??
p += SCAN_LINE_SIZE; // 把地址移到下一行
要是大家有注意, ?看到程式的主LOOP最後, 有?:
sceDisplayWaitVblankStart();
根?一些?上?料所?, 要是我?的主LOOP是一直的走, 而中??有一丁?停?, ?用家按下&HOME&想把程式中止, PSP的KERNEL也?接收不到?息, 除非我?另有&出口&, 不然用家可要拔?池了!
本篇到此也?完?了, 但忽然想到用作示?的?, 有?方便的截?功能?比?好, 於是加了?QJ FORUM 找到的截?功能.
// Taken from:
// Original programmer: Yeldarb
void WriteByte(int fd, unsigned char data)
sceIoWrite(fd, &data, 1);
void ScreenShot()
const char tgaHeader[] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
const int width = SCREEN_WIDTH;
const int lineWidth = SCAN_LINE_SIZE;
const int height = SCREEN_HEIGHT;
unsigned char lineBuffer[width*4];
u32* vram = pVRAM;
int fd = sceIoOpen(&ms0:/screenshot.tga&, PSP_O_CREAT | PSP_O_TRUNC | PSP_O_WRONLY, 0777);
sceIoWrite(fd, tgaHeader, sizeof(tgaHeader));
WriteByte(fd, width & 0xff);
WriteByte(fd, width && ;
WriteByte(fd, height & 0xff);
WriteByte(fd, height && ;
WriteByte(fd, 24);
WriteByte(fd, 0);
for (y = height - 1; y &= 0; y--) {
for (x = 0; x & x++) {
u32 color = vram[y * lineWidth + x];
unsigned char red = color & 0
unsigned char green = (color &&&&& 0
unsigned char blue = (color && 16) & 0
lineBuffer[3*x] =
lineBuffer[3*x+1] =
lineBuffer[3*x+2] =
sceIoWrite(fd, lineBuffer, width * 3);
sceIoClose(fd);
?用?按&HOME&中止, 本篇程式就?在MEMORY STICK 的根目?, ?入一?叫&screenshot.tga&的??.
要是大家不想每次都浪????入???, 可以把以下的句子?掉:
ScreenShot();
(2.18 KB, 下载次数: 13)
21:35:09 上传
下载次数: 13
下载积分: 金钱 -5
(左键点击下载)
?意中??了??PNG的代?, 大喜?望, ?上&??己用&&&
PNG??的原代???考:
PNG Sample
先?大家看一下截?:
[attach]5473620[/attach]
背景?自QJ Forum
我把showimage 改成 LoadImage, 而自定了一?Image 的 struct 把像素?料存在???, 留作後用:
typedef struct
LoadImage基本上和本?的showimage差不多, 只是?在把相?的?料?????而不是VRAM:
Image* image = (Image*) malloc(sizeof(Image));
if (image)
image-&mBits = (u32*) malloc(width * height * sizeof(u32));
if (image-&mBits)
image-&mWidth =
image-&mHeight =
p32 = image-&mB
p16 = (u16*) p32;
for (y = 0; y & y++)
png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
for (x = 0; x & x++)
u32 color32 = line[x];
u16 color16;
int r = color32 & 0
int g = (color32 &&&&& 0
int b = (color32 && 16) & 0
// 本文的程式只用了32bit像素模式, 但本函数是支持psp所有像素格式的
// ?考下面, 就可以看出不同像素格式的?色?排
switch (pixelformat) {
case PSP_DISPLAY_PIXEL_FORMAT_565:
color16 = (r && 3) | ((g && 2) && 5) | ((b && 3) && 11);
*(p16+x) = color16;
case PSP_DISPLAY_PIXEL_FORMAT_5551:
color16 = (r && 3) | ((g && 3) && 5) | ((b && 3) && 10);
*(p16+x) = color16;
case PSP_DISPLAY_PIXEL_FORMAT_4444:
color16 = (r && 4) | ((g && 4) && 4) | ((b && 4) && ;
*(p16+x) = color16;
case PSP_DISPLAY_PIXEL_FORMAT_8888:
color32 = r | (g &&&&| (b && 16);
*(p32+x) = color32;
free(image);
image = NULL;
我把上一篇和?篇所弄出?的有??像functions都放到另一??立??, 一?方便整理和查看, 二??可能?去c++做???. ?在的代?包?有以下的?案:
好了, 到了要介?本篇主角的?候了! 我?把?像存在??, 接著要做的, ?然是把它?示在?幕, ?就是新函数DrawImage 的功能, 因?不想任意??VRAM以外的地方, 我也加了些避免?出界的????:
void DrawImage(Image* image, int x, int y)
int xImage = 0;
int yImage = 0;
int width = image-&mW
int height = image-&mH
if (x & 0) // 把??限制在?幕??
xImage = 0-x;
width -= xI
if (y & 0)
yImage = 0-y;
height -= yI
if (width&=0 || height&=0) // 要是?在?幕外, 干脆不用?
if (x+width&SCREEN_WIDTH)
width = SCREEN_WIDTH-x;
if (y+height&SCREEN_HEIGHT)
height = SCREEN_HEIGHT-y;
// ?算第一?像素的位置
u32* pFrameBuffer = pVRAM + y * FRAME_BUFFER_WIDTH +
u32* pImage = image-&mBits + yImage * image-&mWidth + xI
for (i=0;i&i++)
pDest = pFrameB
for (j=0;j&j++)
*pDest++ = *pSrc++;
pImage += image-&mW
pFrameBuffer += FRAME_BUFFER_WIDTH; // 到下一行
用devkitPro 或用PSPSDK而?有libpng和zlib的朋友, ?把附件libpng_zlib.zip的*.h放在&.../pspdev/psp/include&?和把*.a放在&.../pspdev/psp/lib&?, 我在devkitPro ???, ??可以?利??.
?於用cygwin安?libpng的?充, ?看23?
本篇到此?止了, 和上一篇一?, ?程式?束?, ?把一??面截?放在根目?, 不同的是, 今次用的是PNG?. 相同的情?, 要是大家不想截?, ?把有?命令?代?里拿掉.
ScreenShot(&ms0:/screenshot.png&);
(85.31 KB, 下载次数: 22)
21:35:09 上传
下载次数: 22
下载积分: 金钱 -5
(左键点击下载)
到?在??能?出一???, ?始心急了... 其?是??玩笑:) 在下?得, ???最主要的不是技?, 而是耐性! 技?不?, ?可以找到?人的借用(像在下, 嘿嘿...), 但?有耐性, 就很?可以把一????完. 在??界, ?常的?法是: 制作??的最後20%是?了整??程的80%, 有些人甚至?是10% ? 90% 之比.
好了, ??少?, ?入主?&&在?篇, 新加了?入用家控制和把大?部份?到?幕的功能, ?有就是??的??, 有了?些新功能, 大家基本上可以制作一???的??了&&
在psp上?入用家操控, 非常容易, 只要初始了控制器, 就可以直接?入相??料:
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
sceCtrlReadBufferPositive(&pad, 1); // read control pad
我?在?里用pad 存著控制器的相??料, pad.Lx 和 pad.Ly 分?是模?控制的x, y 值, ?察所得, 它?的?值是0-255, 我?把它?joystick ?用, 再配合Plot, 就可以弄???的&小?家&, 看附?:
[img border=1]/pspchina/game02/screenshot3.png[/img]
不?大家不要??, 用PSP的模?控制只可?出那些?七八糟的?, 那?可?的老鼠, 不是在PSP上?出?的, 是我的好友Anjou兄的大作, 在此先要跟他??多?! (Anjou的Blog)
int x = SCREEN_WIDTH/2;
int y = SCREEN_HEIGHT/2;
// pad.Lx 和 pad.Ly 的?值是 0-255
// 但我?只想要知道它是向左右, ?是上下
if (pad.Lx&64)
if (x&0) x--;
else if (pad.Lx&196)
if (x&SCREEN_WIDTH-1)
if (pad.Ly&64)
if (y&0) y--;
else if (pad.Ly&196)
if (y&SCREEN_HEIGHT-1)
Plot(x, y, colors[currentColor]);
至於pad.Buttons ?是所有按?的bit mask, Buttons 里每一?位元, 代表了一?按?, ???的位元是1, 即表示?按?被按下了, 0 ?相反.
所以例如?句: &if (pad.Buttons&PSP_CTRL_TRIANGLE)& 就是??三角按?有?有被按下.
注意: 本文程式, 用三角按?????的?色, 用?按?截?到??棒的根目?!
至於新加的函?DrawImageRect(), 把大?部份?到?幕, 功能主要是用作??. 一???要是?有??是很??的, 所以我?要?快加入??功能:) 看下面的截?:
[attach]5473621[/attach]
?於??, 我?可以把??的每一格?分?存?一??的?案, 但制作???常的做法, 是把同一???甚至????的?都放在同一???, 如下?:
[attach]5473622[/attach]
??, 我?就要?大?中, ?出需要的部份, ?到?幕, 根???, ?不同的分格, ?到??的效果!
int frame = 0;
int timer = 0;
int xMan = 10; // 老鼠的初始位置
int yMan = 100;
bool mirrored = // 向左就不用反??
while (!done)
int timeNow = Sys_Milliseconds();
int delta = timeNow-lastT // ?算自?上次行??里到?在,
lastTime = timeN // ?了多少??
if (timer&100) // 每0.1秒?到下一格??
timer = 0;
if (frame&=3)
frame = 0;
// 把?在的??格?到?幕
DrawImageRect(rat, xMan, yMan, frame*100, 0, 100, 100, mirrored);
在??函?中, 我也?便加了把?像左右???的功能, ??子, 一???的角色, 就算有向左走同向右走的??, 只要有一?的?, 另一?可以用函????出, 很是方便:
[attach]5473623[/attach]
大家用PSP的左右按?, 可以控制老鼠左右移?!
附?的?行包是1.50的&&自行??, 要把rat.png放在??棒game02的目??!
(45.57 KB, 下载次数: 16)
21:35:09 上传
下载次数: 16
下载积分: 金钱 -5
(左键点击下载)
先看看本篇截?:
[attach]5473624[/attach]
我?在上一篇???, ??有理?有?有透明色, 所以?一篇和大家??一下?於透明色的?理.
我?一直用的, 是32bit, 8888(ABGR)的像素格式, A本是代表透明度, ?值是0, 即代表全透明, 255是代表完全不透明, 而其他值?代表不同的透明度. 但我?因?是直接把像素放?VRAM, ??值?我??有什?意?, 但我?可以利用它, 作?透明色的代表: 0 代表透明, 255 代表不透明.
下面就是?DrawImage()的改?:
for (i=0;i&i++)
pDest = pFrameB
for (j=0;j&j++)
if (*pSrc & 0xFF000000) // 不是透明色才?
*pDest = *pS
pImage += image-&mW
pFrameBuffer += FRAME_BUFFER_WIDTH;
DrawImageRect()也做了相同的改?.
LoadImage()也加入透明色的?定:
int a = (color32 && 24) & 0
case PSP_DISPLAY_PIXEL_FORMAT_8888:
color32 = r | (g &&&&| (b && 16) | (a&&24);
*(p32+x) = color32;
附?的?行包是1.50的&&自行??, 要把m.png, bg.png和 cursor.png 放在??棒game03的目??!
要是大家把本篇程式放到PSP上?, ????面?示有?奇怪, ?是因?我?直接?入VRAM, 而PSP在同一??更新?幕所?生的後果. 要解?????, 我?要用double buffering 和 page flipping. 我?在以後和大家??一下有??用
(18.07 KB, 下载次数: 13)
21:35:09 上传
下载次数: 13
下载积分: 金钱 -5
(左键点击下载)
上一篇的背景是由40?64x64的小??成, 我?每次更新?面都?把整?背景重新?一次, 要是?我?重?背景和角色?(即正在?入VRAM), 正好PSP也在更新?面, 就?有些奇怪的情??生. ?了避免??的情?, 我?就要用????(Double Buffering)加上??(Page Flipping)的技巧.
[attach]5473625[/attach]
什?是????呢? 假?我?有A 和 B ?????, ?PSP?示A?, 我?在B作更新, 等到B的更新完成了, 我?就告?PSP去?示B, ???PSP?示B?, 我?就更新A... 如此??推. 而告?PSP去?示A或B, 就是??!
PSP有2MB的VRAM, 所以就算是32bit像素, 也可以放下多於??的???, 而PSP也提供了sceDisplaySetFrameBuf() 作???用, 所以在PSP上?用????, 可以?是非常方便!
pBufferPointer[0] = (u32*)(0xx); // ?定好?????的地址
pBufferPointer[1] = (u32*)(0xx+FRAME_BUFFER_SIZE);
sceDisplayWaitVblankStart();
sceDisplaySetFrameBuf(pVRAM, FRAME_BUFFER_WIDTH, PSP_DISPLAY_PIXEL_FORMAT_8888, 0);
// 把?在?入的VRAM地址指到下一????
currentPage = 1-currentP
pVRAM = pBufferPointer[currentPage];
Render(); // 更新????容, 以便一??示出?
要是大家把本篇?行包放到PSP??, ?看到一???的背景, ?就是小朱仔仔提到的&...如何?超?1?屏幕大小的2d地?&在?面??的基本原理. 主要??, 我?的背景是以?地?的形式拼出?的, ?就是所?的tilemap:
int i, j, xx,
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);
我??在只用了一?地?, 但要是我?有很多不同的地?, 而再把在什?位置?什?地?用array存起?, 在?背景?, ?照??列表??, ?果就是一?可以是很大的, 可供??的地?了!
??後, 要把m.png, bg.png和 cursor.png 放在??棒game04的目??!
(24.42 KB, 下载次数: 16)
21:35:09 上传
下载次数: 16
下载积分: 金钱 -5
(左键点击下载)
相信大家?欣?默片的?趣都不?很大, ??也一?, 要是?有?音的?助, 效果肯定?大打折扣! 所以?一篇我?研究一下怎?在PSP上弄?噪音&&
?我把跟?PSPSDK的?音?例??一看, 不禁?了一跳, 弄??音, 不用??一大段代?吧? ?好, 前人??, 後人遮?, 在svn.ps2dev.org ??大?藏里, 又找到?藏: mikmodlib, ??一?, 一切就?得容易得多了&&
UNIMOD *music = NULL; // 音?
SAMPLE *sample = NULL; // ?效
// ?效handle
InitMikMod();
music = MikMod_LoadSong(&china.mod&, MAX_CHANNEL);
Player_Start(music); // 播音?
sample = W***_LoadFN(&right.wav&);
if ((pad.Buttons&PSP_CTRL_CIRCLE) && !(oldButtons&PSP_CTRL_CIRCLE))
voice = MikMod_PlaySample(sample, 0, 0); // 播?效
mikmodlib支援的音?/?效格式不算太多, 但足?我?用以?一般的??了, ?效方面支援的是W***, 而音?方面?主要是mod 和一些由mod演?出?的格式, 如.it, .xm 和 .s3m.
W***大家都??耳熟能?了, 至於mod是什?呢? 或者在?里和大家??介?一下: mod 是一?源自Amiga??的音?格式, 它的主要特?是把音?所用的?器的?本??(sample), 也存在?案?, 所以用mod格式, 只要我?用的?本??是高?量的, 播放出?的音?基本上和wav 或 mp3的分?不大, 但它的?案比wav要小很多, 而播放?又不?像mp3般浪?系??源.
用cygwin自行安?mikmodlib的方法大?如下:
- 打?cygwin
- svn export svn://svn.ps2dev.org/psp/trunk/mikmodlib
- cd mikmodlib
- make install
但????有?&&
10月21日新拿到的mikmodlib似乎未有更新至?用最新的pspsdk. 所以我?要打? mikmodlib/playercode/drv_psp.c, 把 PSP_Init(void)中,
pspAudioSetChannelCallback(0, (void *)sound_callback);
pspAudioSetChannelCallback(0, (void *)sound_callback, NULL);
再 &make install& 一次就??行了!
而用devkitPSP r5的朋友, ?可以直接??安?呢&&
?在?我?跟??可?的老鼠一起?歌起舞吧!
[attach]5473626[/attach]
(又?到Anjou 可?的老鼠了)
附?的?行包是1.50的&&自行??, 要把mouse.png, cursor.png, bg.png, china.mod和right.wav放在??棒game05的目??!
(82.76 KB, 下载次数: 22)
21:35:09 上传
下载次数: 22
下载积分: 金钱 -5
(左键点击下载)
[ 本帖最后由 新风纪委员 于
21:58 编辑 ]
总评分:&金钱 + 50&
黑の魔导师
新人欢迎积分1 阅读权限90积分50410精华3UID8733429帖子金钱483756 威望56
如果不是所期望的结局,那么就让一切从零开始吧。
UID8733429帖子威望56 多玩草15501 草信仰力4
好像很有意思哦~
新人欢迎积分0 阅读权限40积分403精华0UID1773381帖子金钱157 威望0
Lv.4, 积分 403, 距离下一级还需 597 积分
UID1773381帖子威望0 多玩草10 草信仰力0
看完了 明白了不到10%的内容 但不知内容有什么用途
新人欢迎积分1 阅读权限70积分8171精华0UID4300598帖子金钱28837 威望0
Lv.7, 积分 8171, 距离下一级还需 1829 积分
UID4300598帖子威望0 多玩草118 草信仰力0
新人欢迎积分1 阅读权限99积分41630精华0UID9008398帖子金钱13057 威望10
Lv.10, 积分 41630, 距离下一级还需 13370 积分
UID9008398帖子威望10 多玩草566 草信仰力0
顶[ali84] 再顶
新人欢迎积分0 阅读权限50积分2185精华1UID4342935帖子金钱4049 威望0
Lv.5, 积分 2185, 距离下一级还需 315 积分
UID4342935帖子威望0 多玩草10 草信仰力0
这个是我要的!~
黑の魔导师
新人欢迎积分1 阅读权限90积分50410精华3UID8733429帖子金钱483756 威望56
如果不是所期望的结局,那么就让一切从零开始吧。
UID8733429帖子威望56 多玩草15501 草信仰力4
原帖由 谭园官 于
07:18 发表
顶[ali84] 再顶
官的表情一项不变啊~嘻嘻
新人欢迎积分0 阅读权限50积分2185精华1UID4342935帖子金钱4049 威望0
Lv.5, 积分 2185, 距离下一级还需 315 积分
UID4342935帖子威望0 多玩草10 草信仰力0
虽然不懂~~
但是结果一定懂~~
新人欢迎积分0 阅读权限40积分482精华0UID3834920帖子金钱377 威望0
Lv.4, 积分 482, 距离下一级还需 518 积分
UID3834920帖子威望0 多玩草10 草信仰力0
编程无力~帮顶……祝你们早日成功
新人欢迎积分0 阅读权限50积分1979精华0UID9336677帖子金钱1649 威望0
电吉他手(最强电击姬) ...
Lv.5, 积分 1979, 距离下一级还需 521 积分
UID9336677帖子威望0 多玩草10 草信仰力0
就让我们一起来把PSP游戏带进另一个领域吧
新人欢迎积分1 阅读权限40积分804精华0UID5109780帖子金钱5082 威望0
Lv.4, 积分 804, 距离下一级还需 196 积分
UID5109780帖子威望0 多玩草30 草信仰力0
不懂的小白飘过!~~~
新人欢迎积分0 阅读权限40积分349精华0UID5391969帖子金钱432 威望0
Lv.4, 积分 349, 距离下一级还需 651 积分
UID5391969帖子威望0 多玩草10 草信仰力0
看完了????????完全不明白???????????
新人欢迎积分0 阅读权限30积分58精华0UID帖子金钱791 威望0
Lv.3, 积分 58, 距离下一级还需 192 积分
UID帖子威望0 多玩草100 草信仰力0
貌似很深奥的说!!懂了一点点!!
新人欢迎积分1 阅读权限60积分3992精华0UID帖子金钱10793 威望8
Lv.6, 积分 3992, 距离下一级还需 1008 积分
UID帖子威望8 多玩草255 草信仰力0
占?慢慢研究
..这是我们应当心存感激的人..
新人欢迎积分1 阅读权限40积分478精华0UID帖子金钱609 威望0
Lv.4, 积分 478, 距离下一级还需 522 积分
UID帖子威望0 多玩草10 草信仰力0
好深奥。。。我弄成TXT小说慢慢看。。。
5153活动勋章
我去5153探探路
甜蜜情侣勋章
甜蜜情侣勋章
马年新春勋章
手机APP马年迎春,马上有钱!
漂浮者勋章
漂浮者勋章
初级灌水标兵
初级灌水标兵
需要金钱:1100
手机盒子客户端点击或扫描下载
Powered by

参考资料

 

随机推荐