由小白到大大的涅盘,从vgsky.com开始!

PSP开发教程01 [NGE使用教程01]helloworld,第一个sdl+nge程序

Update:2007/10/6,Click:0 本文如有下载 请从下面附件中下载

举手之劳 是您对我们最大的支持 感谢您!

topoc studio                    newcreatd*-6g本文来自:V电G玩S天K空Y
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空Y
psp上效果是一致的,只是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汉字的显示,可以作出很多奇怪的效果来:)

【分类导航】

【热门游戏资讯】

更多

【推荐游戏资讯】

更多

【最新资讯更新】

更多

【赞助商链接】