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

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

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

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

    以下是源码 :

 

/*
 * PSP Software Development Kit - 
http://www.pspdev.org
 * -----------------------------------------------------------------------
 * 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 <mrbrown@ocgnet.org>
 * Copyright (c) 2005 James Forshaw <tyranid@gmail.com>
 * Copyright (c) 2005 John Kelley <ps2dev@kelley.ca>
 * Copyright (c) 2005 Donour Sizemore <donour@uchicago.edu>
 *
 * $Id: main.c 1095 2005-09-27 21:02:16Z jim $
 
*/


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

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


/* 定义模块信息  包括版本 */
/* 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,
                     
0x110xFA000);
    
if(thid >= 0)
    
{
                                          
/* 开始执行 */
        sceKernelStartThread(thid, 
00);
    }


    
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(
02);

                                           
/* 读取用户的输入,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;
}

 

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

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值