PSP dev lesson 04

先我假设你已经安装了cygwin(也可以不要),并且安装了DevkitPro,知道怎样生成eboot.pbp并且放入psp中运行,那就往下看。否则重新阅读前面的教程。也许你还要再修炼一下C或者C++。
在正式进行工作前,我们先要安装一些SVN的新库文件。也许你要问SVN是什么,它是一个版本管理程序,适合许多人开发一个项目。http://subversion.tigris.org/下载并安装它。我们需要使用zlib和libpng这两个
库。

运行cygwin,在窗口下键入
svn checkout svn://svn.pspdev.org/psp/trunk/zlib
得到如下结果:


这时在cygwin\home\的用户名目录中就会得到zlib文件夹
键入:
cd zlib
make
make install
得到如下结果:


继续:
cd ..
svn checkout svn://svn.pspdev.org/psp/trunk/libpng
cd libpng
make
make install

在cygwin\usr\local\psp\lib目录中就得到了libz.a和libpng.a
rm -Rf zlib
rm -Rf libpng

(其实所有的操作在dos窗口下同样可以,可以不用cygwin)

现在可以开始了,首先下载this,接着往下看:

framebuffer.h framebuffer.c graphics.h graphics.c ourimage.png解压到当前目录
接着新建main.c或者main.cpp(把前面文件后缀也改为cpp)加入以下代码:

/*
My Image Display Program
Author: Brad Dwyer
翻译:Fan;2006,1,1
Date: 12/28/2005

Thanks to Psilocybeing for the base code.
*/
头文件如下:
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <stdio.h>
#include <png.h>
#include "graphics.h"

/* Define the module info section */
PSP_MODULE_INFO("first_psp", 0, 1, 1);

/* Define the main thread's attribute value (optional) */
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

/* Define printf, just to make typing easier */
#define printf pspDebugScreenPrintf

void dump_threadstatus(void);

/* Exit callback */
int exit_callback(void)
{
sceKernelExitGame();
return 0;
}

/* Callback thread */
void CallbackThread(void *arg)
{
int cbid;

// printf("\nCallback Thread Status:\n");
cbid = sceKernelCreateCallback("Exit Callback", (SceKernelCallbackFunction)exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
int thid = 0;

thid = sceKernelCreateThread("update_thread", (SceKernelThreadEntry)CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0)
{
sceKernelStartThread(thid, 0, 0);
}

return thid;
}

以上代码主要实现程序的退出线程

int main(int argc,char *argv[])
{
char path[255];
strcpy(path,argv[0]); //获取路径
*(path+strlen(path)-9)='\0'; //之所以-9是去掉末尾eboot.pbp字符串。

SetupCallbacks();

pspDebugScreenInit();
printf("\npath=%s\n",path); //显示路径。


char buffer[200];
Image* ourImage; //以下代码都封装在graphics.h和png.h中
initGraphics();
sprintf(buffer, "ourImage.png");
ourImage = loadImage(buffer);
printf("\nbuffer=%s\n",buffer);

if (!ourImage) {
//Image load failed
printf("Image load failed!\n");
} else {
int x = 0;
int y = 0;
sceDisplayWaitVblankStart(); //等待屏幕垂直扫描结束,可以去掉它试一下结果。
while (x < 480) {
while (y < 272) {
blitAlphaImageToScreen(0 ,0 ,32 , 32, ourImage, x, y);
y += 32;
}
x += 32;
y = 0;
}
flipScreen(); //翻转屏幕缓冲区,否则无法显示更新的内容
}


sceKernelSleepThread();
return 0;
}
主程序完成。
下面是makefile文件的设置:
TARGET = First_Psp
OBJS = main.o framebuffer.o graphics.o //目标文件

INCDIR =
CFLAGS = -O3 -G0 -Wall -mgp32 -mlong32 -g //对于大的项目可以先使用-O0或者-O1调试。
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LDFLAGS =
LIBS=-lpsppower -lpspgu -lpng -lz -lm //连接库
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = first_game

PSP_EBOOT_ICON = NULL
PSP_EBOOT_ICON1 = NULL
PSP_EBOOT_UNKPNG = NULL


PSP_EBOOT_SFO = PARAM.SFO

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

最后一步,键入:
make
如果没有错误的话,当前项目目录会生成eboot.pbp
将其转换后和ourimage.png放入psp测试。你将得到一个充满全屏幕的网格图案
这个例子显示部分用到了sceGu有关的函数,以后我会专门将它们详细介绍。要想深入psp编程就要对其内核函数熟练运用,显然这个例子不具备这个功能。
原文地址如下:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值