[转]我也玩PSP开发!(2)—— PSPSDK示例 源码

系统 1593 0

放假啊,这叫玩啊,天天不务正业,还玩些可能和未来工作无关的技术!内心充满了罪恶感啊

写HelloWorld太无聊了,转了一圈PSPSDK发现有自带sample,方便快速上手的好东西,位置在开发包/psp/sdk/samples下 面,其中包括声音,控制器,红外,usb,wifi,电源等等。还真不少,先挑简单的看看。恩~~我看controller挺简单!就看这个!


打开controller/base目录,只有一个main.c 和 Makefile。肯定不会很难,先make一个试试,还好很顺利,编译得到四个文件: main.o controller_basic.elf EBOOT.PBP PARAM.SFO。
main.o 不用说肯定是main.c的生成的目标文件。
controller_basic.elf 我知道ELF是linux下的二进制文件格式,可能PSP也是这个格式。
EBOOT.PBP 这个就是最终的执行文件了,这个应该是包装过的,其中包含一些图标文件什么的。
PARAM.SFO 这个我就不知道,有高手可以告诉我,(我怀疑!我猜测!是源码中定义的那些宏有关,是一些信息,最后打包到EBOOT.PBP。不要太相信,只是个思路)。

然后就是插上usb,靠到psp/game下,建个文件夹,叫什么名都可以!然后把EBOOT.PBP(不要改名字!)放进去,运行就可以了。

也看了运行后什么模样了!下面就是分析源码了,分析都写成注释了!

以下是源码:

/**/ /*
*PSPSoftwareDevelopmentKit-
http://www.pspdev.org
*-----------------------------------------------------------------------
*LicensedundertheBSDlicense,seeLICENSEinPSPSDKrootfordetails.
*
*main.c-BasicInputdemo--readsfromcontrolpadandindicatesbutton
*presses.
*
*Copyright(c)2005MarcusR.Brown<mrbrown@ocgnet.org>
*Copyright(c)2005JamesForshaw<tyranid@gmail.com>
*Copyright(c)2005JohnKelley<ps2dev@kelley.ca>
*Copyright(c)2005DonourSizemore<donour@uchicago.edu>
*
*$Id:main.c10952005-09-2721:02:16Zjim$
*/


/**/ /* psp的一些头文件,从文件名应该能看出来时干嘛使得 */
#include
< pspkernel.h >
#include
< pspdebug.h >
#include
< pspctrl.h >

/**/ /* pspsdk中自带标准c库和标准c++库 */
#include
< stdlib.h >
#include
< string .h >


/**/ /* 定义模块信息包括版本 */
/**/ /* Definethemoduleinfosection */
PSP_MODULE_INFO(
" CONTROLTEST " , 0 , 1 , 1 );

/**/ /* 定义主线程属性还没具体研究,有时间再改上 */
/**/ /* Definethemainthread'sattributevalue(optional) */
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER
| THREAD_ATTR_VFPU);


/**/ /* 这个纯属为了方便pspDebugScreenPrintf的用法和c库中的printf用法完全一样,不过pspDebugScreenPrintf只能用在初始化了DebugScreen以后 */
/**/ /* Defineprintf,justtomaketypingeasier */
#define printfpspDebugScreenPrintf

void dump_threadstatus( void );

/**/ /* 下面的代码会看见,这是控制主循环推出的条件变量 */
int done = 0 ;

/**/ /* 当用户按下home键退出时的回调函数 */
/**/ /* Exitcallback */
int exit_callback( int arg1, int arg2, void * common)
... {
/**/ /* 让主循环推出 */
done
= 1 ;
return 0 ;
}


/**/ /* 这么看来需要一个专门的线程来监听用户的操作,建立这么一个线程监听用户来调用相应的回调函数 */
/**/ /* Callbackthread */
int CallbackThread(SceSizeargs, void * argp)
... {
int cbid;
/**/ /* 创建一个ExitCallback回调函数返回一个类似handle的东西 */
cbid
= sceKernelCreateCallback( " ExitCallback " ,exit_callback,NULL);
/**/ /* 在把这个回调函数注册商 */
sceKernelRegisterExitCallback(cbid);
/**/ /* 让他睡眠当用户要退出的时候会唤醒 */
sceKernelSleepThreadCB();

return 0 ;
}


/**/ /* 这个纯粹是为了模块化了,把安装回调函数的代码都写着里了 */
/**/ /* Setsupthecallbackthreadandreturnsitsthreadid */
int SetupCallbacks( void )
... {
int thid = 0 ;

/**/ /* 创建那个回调函数线程 */
thid
= sceKernelCreateThread( " update_thread " ,CallbackThread,
0x11 , 0xFA0 , 0 , 0 );
if (thid >= 0 )
... {
/**/ /* 开始执行 */
sceKernelStartThread(thid,
0 , 0 );
}


return thid;
}


int main( void )
... {
SceCtrlDatapad;
/**/ /* 控制器的结构体 */


pspDebugScreenInit();
/**/ /* 初始化DebugScreen这样可以用pspDebugScreenPrintf在上面输出了 */

/**/ /* 那个回调函数线程 */
SetupCallbacks();

/**/ /* 好像是什么取样周期,莫非可以设置游戏时连发的速度,默认是0 */
sceCtrlSetSamplingCycle(
0 );

/**/ /* 控制器的模式有数字(PSP_CTRL_MODE_DIGITAL)和类比(PSP_CTRL_MODE_ANALOG)两个这里用的是类比的 */
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);

/**/ /* done!那个主循环变量 */
while ( ! done) ... {
/**/ /* 设置光标的位置 */
pspDebugScreenSetXY(
0 , 2 );

/**/ /* 读取用户的输入,psp没键盘,就是那些按键了 */
sceCtrlReadBufferPositive(
& pad, 1 );

/**/ /* 类比摇杆的坐标 */
printf(
" AnalogX=%d " ,pad.Lx);
printf(
" AnalogY=%d " ,pad.Ly);
/**/ /* 其他按键的判断,按了哪个就输出相应的文字,用宏都表示出来了,看名字可以看出来 */
if (pad.Buttons != 0 ) ... {
if (pad.Buttons & PSP_CTRL_SQUARE) ... {
printf(
" Squarepressed " );
}

if (pad.Buttons & PSP_CTRL_TRIANGLE) ... {
printf(
" Trianglepressed " );
}

if (pad.Buttons & PSP_CTRL_CIRCLE) ... {
printf(
" Ciclepressed " );
}

if (pad.Buttons & PSP_CTRL_CROSS) ... {
printf(
" Crosspressed " );
}


if (pad.Buttons & PSP_CTRL_UP) ... {
printf(
" Uppressed " );
}

if (pad.Buttons & PSP_CTRL_DOWN) ... {
printf(
" Downpressed " );
}

if (pad.Buttons & PSP_CTRL_LEFT) ... {
printf(
" Leftpressed " );
}

if (pad.Buttons & PSP_CTRL_RIGHT) ... {
printf(
" Rightpressed " );
}


if (pad.Buttons & PSP_CTRL_START) ... {
printf(
" Startpressed " );
}

if (pad.Buttons & PSP_CTRL_SELECT) ... {
printf(
" Selectpressed " );
}

if (pad.Buttons & PSP_CTRL_LTRIGGER) ... {
printf(
" L-triggerpressed " );
}

if (pad.Buttons & PSP_CTRL_RTRIGGER) ... {
printf(
" R-triggerpressed " );
}

}

}


/**/ /* 彻底退出了 */
sceKernelExitGame();
return 0 ;
}

以上就是这个sample了,一点也不难!还算是再玩得程度,不过开发包公布出来的函数还真是少的可怜啊!要想写出更好的东西,那就要看对开源代码库的移植了!

[转]我也玩PSP开发!(2)—— PSPSDK示例 源码分析


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论