[轉]我也玩PSP開發!(2)—— PSPSDK示例 源碼
系統
1613 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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元