教程sdl2初级教程_第1页
教程sdl2初级教程_第2页
教程sdl2初级教程_第3页
教程sdl2初级教程_第4页
教程sdl2初级教程_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主贴吧:C4droid吧Copyright(c)2014 >All 本向的对象为SDL2初学者或正在使用C4droid练习c/c++语音的中学生高中生等。台C4droid用g++编译器编译通过。当然我希望源代码在你的任何问题,不到的可以上C4droid吧发帖提 第二 显示..................................................................... 我们要学的内容是创建窗口,首先要包含SDL2的头文件:#include#include函数必须这样申明intmain(intargc,char*argv[]);intintmain(intargc,char{嘿嘿。我经常忘掉参数名这东西吐槽一句,我刚刚用:intmain()也成功运行个SDL_Window*结构体,注意有个*号捏,还要在申明时初始化为NULL:在使用指针前初始化为NULL是一个很好的习惯,话说在申明变量是初始化也SDL_RendererSDL_Rendererwinwin= oWorld",0,0,480,800,renderer=SDL_CreateRenderer(win,-1,是窗口的大小,在C4droid上它总是全屏的。所以在C4droid上,设不设置关SDL_TextureSDL_Texture oTex=小哦!靠!1:11了,睡觉,明天继续写。与画板配对的当然是画纸SDL_SurfaceSDL_Surface*Surface=SurfaceSurface= 上面的代码是在画纸上作画和把画纸贴在画板oTex上。注意画纸(Surface)的加载函数,这里用到的是LoadBMP()也就是说只支持加载bmp格式的文件,这很重要,不然没发加载。。。。还有路径:"/mnt/sdcard/o.bmp",在SDL2下的文件都是要用绝对路径的,如果使用相对路径,则不能加载。 oTex,NULL,这里有两个NULL参数,第一个是截取画板上的区域,一个是截取墙上的区域,关于使用它,我会在第三课为大家介绍,还会介绍它的孪生兄弟给你哦!要像2秒(2000毫秒/*/*销毁绘画表面*/ /*销毁渲染器*/return0;}第二 显示经过昨天的第一课,相信大家对SDL2的绘图方式有了一定的了解了吧?这是我的理解:SDL_Surface*->SDL_Texture*->SDL_Renderer*->SDL_Window*今天我们要学习的是显示,,呃呃,其实昨天就显示了一张了,,今天我们要说的是显示非bmp格式的。SDL.h内没有定义其他的加载函#include#include这个头文件扩展了加载函数,可以加载多种如等格式的typedeftypedef{IMG_INIT_JPG=0xIMG_INIT_PNG=0xIMG_INIT_TIF=0x},,,externDECLSPECintSDLCALLIMG_Init(intexternexternDECLSPECvoidSDLCALLexternexternDECLSPECSDL_Surface*SDLCALLIMG_Load(constcharSurfaceSurface= SurfaceSurface=的

PP*renderer,constcharSA 这个是直接加载成 Texture 个函数 externexternDECLSPECintSDLCALLIMG_isICO(SDL_RWops 第一节去背景色第二节切割第三节旋转缩放 经过前面两课的讲解,相信大家对于SDL2的使用有了初步的认识,下面我将:::的东西都放在main函数了,我们要学会对程序进行模块化。#include"SDL2/SDL.h"#include"SDL2/SDL.h"SDL_Window*win=SDL_Renderer*renderer=SDL_Texture*pic=NULL;SDL_Surface*picSur=NULL;SDL_TextureSDL_Texture*pic=NULL;SDL_Surface*picSur=NULL;SDL_Texture*background=NULL;std::stringRootFile=;初始化函数intint{/*SDL/*win=",0,0,480,800,rendererSDL_CreateRenderer(win,-1,}释放函数intint{/*销毁绘画表面*//*销毁渲染器*//*/*/*}intintBiltTexture(intx,inty,SDL_Texture*Draw_Texture,SDL_Renderer*Draw_Render){Draw_Render_Rect.x=x;Draw_Render_Rect.y=y;intw=0,h=SDL_QueryTexture(Draw_Texture,NULL,NULL,&w,&h);Draw_Render_Rect.w=w;Draw_Render_Rect.h=}上面用到的intSDL_QueryTexture(SDL_Texture*texture,Uint32*format,int*access,int*w,int*h)是用来查询Texture的信息的。以便在绘制的时候不会造接下来。我们来编写去背景色的函数SDL_SurfaceSDL_Surface*SetColorKey(SDL_Surface*f,intr,intg,int{//(Usignedint32-Uint32colorkey=SDL_MapRGB(f->format,0,0xFF,0xFF);SDL_SetColorKey(f,SDL_TRUE,colorkey);return}其中通过表面,标记(SDL_FALSE,SDL_TRUE),32位无符号色intintLoadSrc(std::string{picSur=IMG_Load((RP+picSur=SetColorKey(picSur,0,0xff,//pic=SDL_CreateTextureFromSurface(renderer,background=IMG_Load((RPif((pic==NULL)||(background==NULL))return-1;return}intintmain(intargc,char{if((Init()!=0)||(LoadSrc(RootFile)!=0))return-1;BiltTexture(0,0,background,renderer);BiltTexture(100,200,pic,renderer);return0;}是不是苗条一些了?这是运行的嗯,可以看到。的浅绿色背景不见了(呃呃,虽然背景是深绿,看得出吧) externexternDECLSPECintSDLCALLSDL_Texture*texture,constSDL_Rect*srcrect,constSDL_Rect*对于这个函数,相信大家都不陌生,面已经用到过多次了,不知大家注意到没有,有个参数是用NULL来对它进行赋值的。也就是源函数申明中的constRect*srcrect,对于这个参数,我们可以从名字知道src表示的是source的意思。rect既rectangle也就是矩形,与之对应的类型是SDL_Rect类那么,这个是干什么用的?仔细想想加上ntt*dstrect这个提示就NULL,是因为我们用的是整张。学了今天过后。一张文件就可以包含很多张小文件了,可以省下跟多东西,比如说内存。在用的时候,只需要知道那些小!intintClipBiltTexture(intx,inty,SDL_Texture*Draw_Texture,SDL_RectClip,SDL_Renderer*Draw_Render);5Clip是我们新添的形参。它用来接受一个了小的位置信息的SDL_Rect类型。看看如何使用它:intintClipBiltTexture(intx,inty,SDL_Texture*Draw_Texture,SDL_RectClip,SDL_Renderer*Draw_Render){Draw_Render_Rect.x=x;Draw_Render_Rect.y=intw=0,h=SDL_QueryTexture(Draw_Texture,NULL,NULL,&w,&h);Draw_Render_Rect.w=Clip.w;Draw_Render_Rect.h=}

Draw_Render_Rect.wDraw_Render_Rect.w=Draw_Render_Rect.h=clip.x=0;clip.y=clip.wclip.w=clip.h=

ClipBiltTexture(0,ClipBiltTexture(0,0,pic,clip,调用了我们新编的函数。接下来,我们看看运行效果:

externexternintintSDL_RenderCopyEx(SDL_Renderer*renderer,SDL_Texture*texture,constSDL_Rect*srcrect,constSDL_Rect*dstrect,constdoubleangle,constSDL_Point*center,SDL_RenderCopy()相比他多了3个参数:angle角度,一个双精度的浮点数。;center中心,一个SDL_Point类型的相信大家都是聪明的孩纸。看上面的函数申明应该参数。用来旋转中心;最后一个是一个标记,他也是用来旋转的,有以下3种模(intx,intSDL_Texture*Draw_Texture,boolzoom=false,floatextent=1.0,doubleangle=0.0,intcx=-1,intcy=-1){先是申明,本次什么我们也包含了一个双精度浮点数angle,对应的是旋转角度,还有整型的cx,cy用来设置其旋转中心,这里被初始化为-1;至于为什么?接下来再说。还有两个参数是缩放用的一个bool类型。用来设置是否对进行缩放,还有一个整型的extent用来设置缩放比例。SDL_RectSDL_RectDraw_Render_Rect.x=x;Draw_Render_Rect.y=intw=0,h=SDL_QueryTexture(Draw_Texture,NULL,NULL,&w,if(extent<if(extent<{extent}始化为1.0既不进行缩放。ifif{Draw_Render_Rect.w=w*extent;Draw_Render_Rect.h=h*extent;}{Draw_Render_Rect.h=h;}这里是使用缩放的部分,由上节可以知道,矩形Draw_Render_Rect的存在,srcrect一样,它是用来描述位置信息的矩形,不过是描述在窗口上的位置。即贴在窗口上的信息,在这里我们可以通过设置其长和宽来实现对进行缩放,第一二课的都是没有设置这个参数。所以都被拉伸至全屏了。ifif((cx!=-1)&&(cy!=-{center.x=cx;center.x=Render,Draw_Texture,}{Draw_Texture,NULL,angle,NULL,}}} 显示文字不是SDL2的一个标准库。而是一个扩展库。让我们把它包含进源代#include#includestringstringFonts=SDL_TextureSDL_Texture*Text(std::stringFonts,intFontSize,SDL_Renderer*std::stringFontsPath,intr=0,intg=0,intb=0,intTTF_Font*font=font=TTF_OpenFont(FontsPath.c_str(),color.r=r;color.g=g;color.b=b;color.a=FF{Uint8e L_Color使用SS*p= UTFrnder,TT_CloseFont(font);if(fonts!=NULL)return} s ed第五课触屏上节我们学习了几个关于游戏的处理,但是游戏是人来玩的,当然少不了人的存在。那么如何获取人的行为呢?SDL2定义的一个SDL_Event用来处理SDL_KeyboardEventkey键盘数SDL_MouseMotionEventmotion鼠标动作数SDL_TouchFingerEventtfinger触屏数据Uint32type类Uint32timestampSDL_TouchIDtouchIdfloatxfloatyfloatdx末位置floatdyfloatpressure按压 while(true)while(true){while{if(event.type=={Tx=Ty=}Tx=event.tfinger.x;Ty=}} 如果你想使用对的动作进行判断,可以使用dx,dy

数据了变是一个戳 用于像Android机这样的使用,此书的所有代码都是在Android平台数我SDL_StartTextInput()由名称可以知道这个函数是用来开始获取文本输入的。所以,当我们使用字母或数字键是它把作为文本输入而不是按键(吐槽一句,SDL2.0的文本输入真的不咋滴),所以使用上下左右来调试Uint32type类型SDL_KEYDOWN按下SDL_KEYUPUint32timestampUint32windowIDUint8stateSDL_PRESSEDSDL_RELEASEDUint8repeatSDL_Keysymkeysym描绘了按下过释放的内SDL_Scancodescancode物理的按键 由于很多,请大家SDL_KeycodesymSDL虚拟的按键 由于很多,请大家whilewhile{{switchif(event.typeswitchif(event.type=={{case{BiltTexture(0,0,Text("SDLK_UP",40,Render,Fonts,}case{BiltTexture(0,0,Text("SDLK_DOWN",40,Render,255,255),}case{BiltTexture(0,0,Text("SDLK_LEFT",40,Render,255),Render);}case{BiltTexture(0,BiltTexture(0,0,Text("SDLK_RIGHT",40,Render,255,255),}case{BiltTexture(0,0,Text("SDLK_1",40,Fonts,255,255),Render);}case{BiltTexture(0,0,Text("SDLK_2",40,Render,Fonts,255),}case{BiltTexture(0,0,Text("SDLK_3",40, Fonts,255),}}在本人上上面的代码出了上下左右可以响应之外,其他代码无法响应,电whilewhile{while{if(event.type=={ }e ets,255,if(T==BiltTexture(0,0,Text("你按下了A键edts,} 一个游戏除了精美的画面效果,还要有与之相对的音效。本节,我们要讲解的是音效和背景音乐的。SDL2本身并没有音频的函数,那么就需要我#include#includeexternexternDECLSPECintSDLCALLMix_OpenAudio(intfrequency,Uint16format,intchannels,intchunksize);

frequency频率常用format格式常用channels通道随意chunksize*Mix_LoadWAV_RW(SDL_RWops*src,Mix_LoadWAV_RW(SDL_RWFromFile(file,"rb"),*Mix_LoadMUS(constcharexternexternDECLSPECvoidSDLCALLChunk(Mix_ChunkexternDECLSPECvoidSDLCALL externDECLSPECintSDLCALLMix_ channel,Mix_Chunk*chunk,intloops,intticks);externDECLSPECintSDLCALL *music,int

loops循环次数以及两个音频的结构ticks-1typedeftypedefstruct{intallocated;Uint8*abuf;Uint32alen;Uint8volume;}typedefstruct_Mix_Music必须在使用所有函数前使用OpenAudio函数;:导致函数失效,在加载函数使用后无法对Mix_Chunk和Mix_Music初始化,即一直为空。不得 函数与加载函数放在同一个函数内,即使里面包含了函数前Android知的为mp3格式的文件。在使用音频的时候最好是使用wavLinuxoggAndroid。内置音频基本为ogg格式。 {Mix_Chunk*Chunk= yChannelTimed(1,Chunk,0,-1);}使用流程Mix_Chunk*。第八课限制帧频关于动画,都是一帧一帧变化形成,这也是为什么我们要用while(true)的原因我们需要不断在窗口上绘图才能够形成动画,科学家曾,当变化为每秒24张的时候,眼睛将无法分辨主次,于是就有了。本节学习控制绘画的速率,说到底就是不让他画的过快。以前我们用的是SDL_Delay()函数来控制,现在我们再加入一个计时器:SDL_GetTicks();externDECLSPECUint32SDLCALLSDL_GetTicks(void);intintintFrame=24;while(true){TimeSt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论