[轉(zhuǎn)]我也玩PSP開(kāi)發(fā)!(2)—— PSPSDK示例 源碼
系統(tǒng)
1766 0
放假啊,這叫玩啊,天天不務(wù)正業(yè),還玩些可能和未來(lái)工作無(wú)關(guān)的技術(shù)!內(nèi)心充滿(mǎn)了罪惡感啊
寫(xiě)HelloWorld太無(wú)聊了,轉(zhuǎn)了一圈PSPSDK發(fā)現(xiàn)有自帶sample,方便快速上手的好東西,位置在開(kāi)發(fā)包/psp/sdk/samples下 面,其中包括聲音,控制器,紅外,usb,wifi,電源等等。還真不少,先挑簡(jiǎn)單的看看。恩~~我看controller挺簡(jiǎn)單!就看這個(gè)!
打開(kāi)controller/base目錄,只有一個(gè)main.c 和 Makefile。肯定不會(huì)很難,先make一個(gè)試試,還好很順利,編譯得到四個(gè)文件: main.o controller_basic.elf EBOOT.PBP PARAM.SFO。
main.o 不用說(shuō)肯定是main.c的生成的目標(biāo)文件。
controller_basic.elf 我知道ELF是linux下的二進(jìn)制文件格式,可能PSP也是這個(gè)格式。
EBOOT.PBP 這個(gè)就是最終的執(zhí)行文件了,這個(gè)應(yīng)該是包裝過(guò)的,其中包含一些圖標(biāo)文件什么的。
PARAM.SFO 這個(gè)我就不知道,有高手可以告訴我,(我懷疑!我猜測(cè)!是源碼中定義的那些宏有關(guān),是一些信息,最后打包到EBOOT.PBP。不要太相信,只是個(gè)思路)。
然后就是插上usb,靠到psp/game下,建個(gè)文件夾,叫什么名都可以!然后把EBOOT.PBP(不要改名字!)放進(jìn)去,運(yùn)行就可以了。
也看了運(yùn)行后什么模樣了!下面就是分析源碼了,分析都寫(xiě)成注釋了!
以下是源碼:
/**/
/*
*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的一些頭文件,從文件名應(yīng)該能看出來(lái)時(shí)干嘛使得
*/
#include
<
pspkernel.h
>
#include
<
pspdebug.h
>
#include
<
pspctrl.h
>
/**/
/*
pspsdk中自帶標(biāo)準(zhǔn)c庫(kù)和標(biāo)準(zhǔn)c++庫(kù)
*/
#include
<
stdlib.h
>
#include
<
string
.h
>
/**/
/*
定義模塊信息包括版本
*/
/**/
/*
Definethemoduleinfosection
*/
PSP_MODULE_INFO(
"
CONTROLTEST
"
,
0
,
1
,
1
);
/**/
/*
定義主線(xiàn)程屬性還沒(méi)具體研究,有時(shí)間再改上
*/
/**/
/*
Definethemainthread'sattributevalue(optional)
*/
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER
|
THREAD_ATTR_VFPU);
/**/
/*
這個(gè)純屬為了方便pspDebugScreenPrintf的用法和c庫(kù)中的printf用法完全一樣,不過(guò)pspDebugScreenPrintf只能用在初始化了DebugScreen以后
*/
/**/
/*
Defineprintf,justtomaketypingeasier
*/
#define
printfpspDebugScreenPrintf
void
dump_threadstatus(
void
);
/**/
/*
下面的代碼會(huì)看見(jiàn),這是控制主循環(huán)推出的條件變量
*/
int
done
=
0
;
/**/
/*
當(dāng)用戶(hù)按下home鍵退出時(shí)的回調(diào)函數(shù)
*/
/**/
/*
Exitcallback
*/
int
exit_callback(
int
arg1,
int
arg2,
void
*
common)
...
{
/**/
/*
讓主循環(huán)推出
*/
done
=
1
;
return
0
;
}
/**/
/*
這么看來(lái)需要一個(gè)專(zhuān)門(mén)的線(xiàn)程來(lái)監(jiān)聽(tīng)用戶(hù)的操作,建立這么一個(gè)線(xiàn)程監(jiān)聽(tīng)用戶(hù)來(lái)調(diào)用相應(yīng)的回調(diào)函數(shù)
*/
/**/
/*
Callbackthread
*/
int
CallbackThread(SceSizeargs,
void
*
argp)
...
{
int
cbid;
/**/
/*
創(chuàng)建一個(gè)ExitCallback回調(diào)函數(shù)返回一個(gè)類(lèi)似handle的東西
*/
cbid
=
sceKernelCreateCallback(
"
ExitCallback
"
,exit_callback,NULL);
/**/
/*
在把這個(gè)回調(diào)函數(shù)注冊(cè)商
*/
sceKernelRegisterExitCallback(cbid);
/**/
/*
讓他睡眠當(dāng)用戶(hù)要退出的時(shí)候會(huì)喚醒
*/
sceKernelSleepThreadCB();
return
0
;
}
/**/
/*
這個(gè)純粹是為了模塊化了,把安裝回調(diào)函數(shù)的代碼都寫(xiě)著里了
*/
/**/
/*
Setsupthecallbackthreadandreturnsitsthreadid
*/
int
SetupCallbacks(
void
)
...
{
int
thid
=
0
;
/**/
/*
創(chuàng)建那個(gè)回調(diào)函數(shù)線(xiàn)程
*/
thid
=
sceKernelCreateThread(
"
update_thread
"
,CallbackThread,
0x11
,
0xFA0
,
0
,
0
);
if
(thid
>=
0
)
...
{
/**/
/*
開(kāi)始執(zhí)行
*/
sceKernelStartThread(thid,
0
,
0
);
}
return
thid;
}
int
main(
void
)
...
{
SceCtrlDatapad;
/**/
/*
控制器的結(jié)構(gòu)體
*/
pspDebugScreenInit();
/**/
/*
初始化DebugScreen這樣可以用pspDebugScreenPrintf在上面輸出了
*/
/**/
/*
那個(gè)回調(diào)函數(shù)線(xiàn)程
*/
SetupCallbacks();
/**/
/*
好像是什么取樣周期,莫非可以設(shè)置游戲時(shí)連發(fā)的速度,默認(rèn)是0
*/
sceCtrlSetSamplingCycle(
0
);
/**/
/*
控制器的模式有數(shù)字(PSP_CTRL_MODE_DIGITAL)和類(lèi)比(PSP_CTRL_MODE_ANALOG)兩個(gè)這里用的是類(lèi)比的
*/
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
/**/
/*
done!那個(gè)主循環(huán)變量
*/
while
(
!
done)
...
{
/**/
/*
設(shè)置光標(biāo)的位置
*/
pspDebugScreenSetXY(
0
,
2
);
/**/
/*
讀取用戶(hù)的輸入,psp沒(méi)鍵盤(pán),就是那些按鍵了
*/
sceCtrlReadBufferPositive(
&
pad,
1
);
/**/
/*
類(lèi)比搖桿的坐標(biāo)
*/
printf(
"
AnalogX=%d
"
,pad.Lx);
printf(
"
AnalogY=%d
"
,pad.Ly);
/**/
/*
其他按鍵的判斷,按了哪個(gè)就輸出相應(yīng)的文字,用宏都表示出來(lái)了,看名字可以看出來(lái)
*/
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
;
}
以上就是這個(gè)sample了,一點(diǎn)也不難!還算是再玩得程度,不過(guò)開(kāi)發(fā)包公布出來(lái)的函數(shù)還真是少的可憐啊!要想寫(xiě)出更好的東西,那就要看對(duì)開(kāi)源代碼庫(kù)的移植了!
[轉(zhuǎn)]我也玩PSP開(kāi)發(fā)!(2)—— PSPSDK示例 源碼分析
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元