d*-6g本文来自:V电G玩S天K空Y
设置好库之后,就可以开始写代码了.在这里我建议你将你的psp锁起来,因为在接下来的10个教程里,我们都不会用到psp调试程序,而你也不需要用他来看效果.当然,你如果觉得没事干可以编译一份放到psp上看看,你会发现一切都是一样的,和在windows上,包括错误.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
那么我们开始hello world吧.这个helloworld将显示一张图片,这张图片是任意大小的,这里用的480*272,你按不同的键可以使他放大,缩小,旋转或者平移.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
#include "libnge.h"d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
SDL_Joystick* joystick;d*-6g本文来自:V电G玩S天K空Y
SDL_Event event; d*-6g本文来自:V电G玩S天K空Y
IVideoDriver* sys ;d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
首先是包含头文件libnge.h,接着是SDL_Joystick与SDL_Event,熟悉sdl的都知道SDL_Joystick是控制杆(手柄),SDL_Event是一个消息,用于消息队列.IVideoDriver*是显示接口的指针,这个对用户是透明的.由NGE_GetVideoDriver()得到.(实际在windows是返回的ogldriver,在psp是返回gudriver.)d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
接下来是一些变量,主要是为了让旋转有所变化.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
CTexture* bg[2]; //保存图片的指针,这里加载2张图片d*-6g本文来自:V电G玩S天K空Y
int done = 0; //程序是否结束d*-6g本文来自:V电G玩S天K空Y
int id = 0; // 图片idd*-6g本文来自:V电G玩S天K空Y
float scale = 1.0; //放大缩小比率1.0就是原大小,2.0就是2倍 0.5 就是缩小一倍d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
float angel = 0.0; //旋转角度d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
接下来是2个输入处理函数,其中一个是处理键盘,一个处理手柄.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
void ButtonPressedProc(SDL_JoyButtonEvent * jbutton)d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
switch(jbutton -> button)d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
case 8: d*-6g本文来自:V电G玩S天K空Y
angel=90;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 6: d*-6g本文来自:V电G玩S天K空Y
angel =180;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 7: d*-6g本文来自:V电G玩S天K空Y
angel = 270;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 9: d*-6g本文来自:V电G玩S天K空Y
angel = 360;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 0:d*-6g本文来自:V电G玩S天K空Y
scale-=0.05;d*-6g本文来自:V电G玩S天K空Y
if(scale<=0)d*-6g本文来自:V电G玩S天K空Y
scale = 0.05; d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 1: d*-6g本文来自:V电G玩S天K空Y
scale+=0.05;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 2:d*-6g本文来自:V电G玩S天K空Y
angel-=1.0;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 3:d*-6g本文来自:V电G玩S天K空Y
angel+=1.0;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case 11:d*-6g本文来自:V电G玩S天K空Y
id++;d*-6g本文来自:V电G玩S天K空Y
id=id%2;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
} d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
void KeyPressedProc(SDL_keysym * keysym)d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
switch(keysym -> sym)d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
case SDLK_UP: d*-6g本文来自:V电G玩S天K空Y
angel=90;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDLK_DOWN: d*-6g本文来自:V电G玩S天K空Y
angel =180;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDLK_LEFT: d*-6g本文来自:V电G玩S天K空Y
angel =270;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDLK_RIGHT: d*-6g本文来自:V电G玩S天K空Y
angel =360;d*-6g本文来自:V电G玩S天K空Y
break; d*-6g本文来自:V电G玩S天K空Y
case SDLK_w:d*-6g本文来自:V电G玩S天K空Y
scale-=0.05;d*-6g本文来自:V电G玩S天K空Y
if(scale<=0)d*-6g本文来自:V电G玩S天K空Y
scale = 0.05; d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDLK_d:d*-6g本文来自:V电G玩S天K空Y
scale+=0.05;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDLK_s:d*-6g本文来自:V电G玩S天K空Y
angel-=1.0;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDLK_a:d*-6g本文来自:V电G玩S天K空Y
angel+=1.0;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDLK_m: d*-6g本文来自:V电G玩S天K空Y
id++;d*-6g本文来自:V电G玩S天K空Y
id=id%2;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
} d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
然后是sdl处理消息的函数,来了键盘消息就调用键盘处理函数,来了手柄消息就调用手柄处理函数.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
void InputProc()d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
while( SDL_PollEvent( &event ) )d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
switch(event.type)d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
case SDL_QUIT:d*-6g本文来自:V电G玩S天K空Y
done = 1;d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDL_KEYDOWN:d*-6g本文来自:V电G玩S天K空Y
KeyPressedProc(&event.key.keysym);d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
case SDL_JOYBUTTONDOWN:d*-6g本文来自:V电G玩S天K空Y
ButtonPressedProc(&event.jbutton);d*-6g本文来自:V电G玩S天K空Y
break;d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
接着是画图的函数:d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
int DrawScene()d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
sys->BeginScene();d*-6g本文来自:V电G玩S天K空Y
sys->RenderQuad(bg[id],0,0,0,0,0,0,scale,scale,angel,0xffffffff);d*-6g本文来自:V电G玩S天K空Y
sys->EndScene();d*-6g本文来自:V电G玩S天K空Y
return( TRUE );d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
RenderQuad是处于BeginScene()和EndScene()之间的,其中BeginScene()作的清屏等工作,EndScene()作的交换缓冲的工作,gu是双缓冲模式工作的,所以效率有所保证.(ps:debug版的交换缓冲区在ShowFps()里作的,所以程序需要调用ShowFps().)d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
RenderQuad各个参数的意义如下:d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
/**d*-6g本文来自:V电G玩S天K空Y
* a normal member function taking 11 arguments and non-returning.d*-6g本文来自:V电G玩S天K空Y
* use for render picture.d*-6g本文来自:V电G玩S天K空Y
* @param texture CTexture pointer, create by LoadTexture().d*-6g本文来自:V电G玩S天K空Y
* @param sx float,x(left) coodinate of texture.d*-6g本文来自:V电G玩S天K空Y
* @param sy float,y(top) coodinate of texture.d*-6g本文来自:V电G玩S天K空Y
* @param sw float,w(right) of texture.d*-6g本文来自:V电G玩S天K空Y
* @param sh float,h(bottom) of texture.d*-6g本文来自:V电G玩S天K空Y
* @param dx float,x coodinate of screen.d*-6g本文来自:V电G玩S天K空Y
* @param dy float,y coodinate of screen.d*-6g本文来自:V电G玩S天K空Y
* @param xscale float,x scale of texture.d*-6g本文来自:V电G玩S天K空Y
* @param yscale float,y scale of texture.d*-6g本文来自:V电G玩S天K空Y
* @param angle float,roting texture,use (rcentrex,rcentrex) in CTexture as rote point.d*-6g本文来自:V电G玩S天K空Y
* @param color int , blend color,the color will blend in texture,using for alpha blend.d*-6g本文来自:V电G玩S天K空Y
* use macro RGBA(r,g,b,a) to make color,if a is 0,the picture is transparent.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
*/d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
主程序:d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
extern "C"d*-6g本文来自:V电G玩S天K空Y
int main(int argc, char* argv[])d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
NGE_InitSDL(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);//初始化sdld*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
if(SDL_NumJoysticks()) {d*-6g本文来自:V电G玩S天K空Y
joystick = SDL_JoystickOpen(0);//初始化手柄d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
sys = NGE_GetVideoDriver();//得到显示接口d*-6g本文来自:V电G玩S天K空Y
bg[0] = LoadTexture("gamebg1.png");//加载图片1到内存d*-6g本文来自:V电G玩S天K空Y
bg[1] = LoadTexture("gamebg2.png");//加载图片2到内存d*-6g本文来自:V电G玩S天K空Y
sys->FpsInit();//初始化fps计数器d*-6g本文来自:V电G玩S天K空Y
while ( !done )d*-6g本文来自:V电G玩S天K空Y
{d*-6g本文来自:V电G玩S天K空Y
InputProc();d*-6g本文来自:V电G玩S天K空Y
DrawScene();d*-6g本文来自:V电G玩S天K空Y
sys->ShowFps();//显示fps,注意debug版都要加这个.d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
FreeTexture(bg[0]);//释放图片1d*-6g本文来自:V电G玩S天K空Y
FreeTexture(bg[1]);//释放图片2d*-6g本文来自:V电G玩S天K空Y
NGE_QuitSDL();//释放sdl分配的资源d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
return 0;d*-6g本文来自:V电G玩S天K空Y
}d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
运行效果d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
windows版的箭头对应psp的上下左右,w/d/s/a对应 △○×□,可以旋转缩放,可以看出由于是硬件加速所以旋转缩放不会有性能损耗,在psp上默认222mhz下能到250-270fps(windows下会因为pc的显卡不同而fps不同,这基本是pc贴图的极限植.瞧我的机器很好吧,hoho)d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Ypsp上效果是一致的,只是fps少点d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y熟悉sdl的都知道这个程序与sdl基本没有差别,这是显示部分不同.所以如果会sdl基本就会用这个了.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
本节代码下载地址:本节代码就在demo文件夹里.d*-6g本文来自:V电G玩S天K空Y
d*-6g本文来自:V电G玩S天K空Y
下一节我们将讨论freetype汉字的显示,可以作出很多奇怪的效果来:)


