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



掌叔
2009-03-02 16:32:24

摘自:[url]http://blog.csdn.net/lee576/[/url]

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

写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(不要改名字!)放进去,运行就可以了。

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

以下是源码 :[code=c]/*
* PSP Software Development Kit - [url]http://www.pspdev.org[/url]
* -----------------------------------------------------------------------
* Licensed under the BSD license, see LICENSE in PSPSDK root for details.
*
* main.c - Basic Input demo -- reads from control pad and indicates button
* presses.
*
* Copyright (c) 2005 Marcus R. Brown <[email]mrbrown@ocgnet.org[/email]>
* Copyright (c) 2005 James Forshaw <[email]tyranid@gmail.com[/email]>
* Copyright (c) 2005 John Kelley <[email]ps2dev@kelley.ca[/email]>
* Copyright (c) 2005 Donour Sizemore <[email]donour@uchicago.edu[/email]>
*
* : main.c 1095 2005-09-27 21:02:16Z jim $
*/

/**//* psp的一些头文件,从文件名应该能看出来时干嘛使得 */
#include
#include
#include

/**//* psp sdk中自带标准c库和标准c++库 */
#include
#include


/**//* 定义模块信息 包括版本 */
/**//* Define the module info section */
PSP_MODULE_INFO("CONTROLTEST", 0, 1, 1);

/**//* 定义主线程属性 还没具体研究,有时间再改上*/
/**//* Define the main thread's attribute value (optional) */
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);


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

void dump_threadstatus(void);

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

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

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

return 0;
}

/**//* 这个纯粹是为了模块化了,把安装回调函数的代码都写着里了 */
/**//* Sets up the callback thread and returns its thread id */
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)
...{
SceCtrlData pad; /**//*控制器的结构体*/


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("Analog X = %d ", pad.Lx);
printf("Analog Y = %d ", pad.Ly);
/**//* 其他按键的判断,按了哪个就输出相应的文字,用宏都表示出来了,看名字可以看出来*/
if (pad.Buttons != 0)...{
if (pad.Buttons & PSP_CTRL_SQUARE)...{
printf("Square pressed ");
}
if (pad.Buttons & PSP_CTRL_TRIANGLE)...{
printf("Triangle pressed ");
}
if (pad.Buttons & PSP_CTRL_CIRCLE)...{
printf("Cicle pressed ");
}
if (pad.Buttons & PSP_CTRL_CROSS)...{
printf("Cross pressed ");
}

if (pad.Buttons & PSP_CTRL_UP)...{
printf("Up pressed ");
}
if (pad.Buttons & PSP_CTRL_DOWN)...{
printf("Down pressed ");
}
if (pad.Buttons & PSP_CTRL_LEFT)...{
printf("Left pressed ");
}
if (pad.Buttons & PSP_CTRL_RIGHT)...{
printf("Right pressed ");
}

if (pad.Buttons & PSP_CTRL_START)...{
printf("Start pressed ");
}
if (pad.Buttons & PSP_CTRL_SELECT)...{
printf("Select pressed ");
}
if (pad.Buttons & PSP_CTRL_LTRIGGER)...{
printf("L-trigger pressed ");
}
if (pad.Buttons & PSP_CTRL_RTRIGGER)...{
printf("R-trigger pressed ");
}
}
}

/**//* 彻底退出了*/
sceKernelExitGame();
return 0;
}[/code]以上就是这个sample了,一点也不难!还算是再玩得程度,不过开发包公布出来的函数还真是少的可怜啊!要想写出更好的东西,那就要看对开源代码库的移植了!


flashtao613
2009-09-10 17:42:36

不赖,顶一个!!!!!!!!!


fuyuan007
2009-09-27 21:26:47

学习了!!!


凹凸曼
2010-07-20 18:55:12

简单。。。 没一步是看的懂得


andrew601
2010-07-22 22:33:27

这是什么语言》》??dos吗?好像少了些引导词!!。。。。。。。版主看不懂!!本人能力低!!


andrew601
2010-07-22 22:34:33

如果只看英语就有些明白!!好像自己在做翻译!


andrew601
2010-07-22 22:37:22

如果是dos语言的话!在开始加个CLEAR,保证程序不受之前条件影响!


reekin
2010-07-23 15:32:50

应该是C的一个分类语言,具体不清楚。至少没有像JAVA一样把MAIN函数包在类里,应该是C系的,应该...


sadwind
2011-07-21 00:55:26

是C,不过你要是用VS2005,用一些C++语句也是可以调的通的。
具体我也不是很明白。楼主如果能NGE2很了解的话,我想问一个问题,关于操作目录的。
1,如何遍历目录
2,确某一指定的路径(从上遍历中得到)
我的邮箱:sadwind@qq.com
博客:http://www.sadwind.org