版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
主貼吧:C4droid吧Copyright(c)2014 >All 本向的對象為SDL2初學(xué)者或正在使用C4droid練習(xí)c/c++語音的中學(xué)生高中生等。臺C4droid用g++編譯器編譯通過。當(dāng)然我希望源代碼在你的任何問題,不到的可以上C4droid吧發(fā)帖提 第二 顯示..................................................................... 我們要學(xué)的內(nèi)容是創(chuàng)建窗口,首先要包含SDL2的頭文件:#include#include函數(shù)必須這樣申明intmain(intargc,char*argv[]);intintmain(intargc,char{嘿嘿。我經(jīng)常忘掉參數(shù)名這東西吐槽一句,我剛剛用:intmain()也成功運行個SDL_Window*結(jié)構(gòu)體,注意有個*號捏,還要在申明時初始化為NULL:在使用指針前初始化為NULL是一個很好的習(xí)慣,話說在申明變量是初始化也SDL_RendererSDL_Rendererwinwin= oWorld",0,0,480,800,renderer=SDL_CreateRenderer(win,-1,是窗口的大小,在C4droid上它總是全屏的。所以在C4droid上,設(shè)不設(shè)置關(guān)SDL_TextureSDL_Texture oTex=小哦!靠!1:11了,睡覺,明天繼續(xù)寫。與畫板配對的當(dāng)然是畫紙SDL_SurfaceSDL_Surface*Surface=SurfaceSurface= 上面的代碼是在畫紙上作畫和把畫紙貼在畫板oTex上。注意畫紙(Surface)的加載函數(shù),這里用到的是LoadBMP()也就是說只支持加載bmp格式的文件,這很重要,不然沒發(fā)加載。。。。還有路徑:"/mnt/sdcard/o.bmp",在SDL2下的文件都是要用絕對路徑的,如果使用相對路徑,則不能加載。 oTex,NULL,這里有兩個NULL參數(shù),第一個是截取畫板上的區(qū)域,一個是截取墻上的區(qū)域,關(guān)于使用它,我會在第三課為大家介紹,還會介紹它的孿生兄弟給你哦!要像2秒(2000毫秒/*/*銷毀繪畫表面*/ /*銷毀渲染器*/return0;}第二 顯示經(jīng)過昨天的第一課,相信大家對SDL2的繪圖方式有了一定的了解了吧?這是我的理解:SDL_Surface*->SDL_Texture*->SDL_Renderer*->SDL_Window*今天我們要學(xué)習(xí)的是顯示,,呃呃,其實昨天就顯示了一張了,,今天我們要說的是顯示非bmp格式的。SDL.h內(nèi)沒有定義其他的加載函#include#include這個頭文件擴展了加載函數(shù),可以加載多種如等格式的typedeftypedef{IMG_INIT_JPG=0xIMG_INIT_PNG=0xIMG_INIT_TIF=0x},,,externDECLSPECintSDLCALLIMG_Init(intexternexternDECLSPECvoidSDLCALLexternexternDECLSPECSDL_Surface*SDLCALLIMG_Load(constcharSurfaceSurface= SurfaceSurface=的
PP*renderer,constcharSA 這個是直接加載成 Texture 個函數(shù) externexternDECLSPECintSDLCALLIMG_isICO(SDL_RWops 第一節(jié)去背景色第二節(jié)切割第三節(jié)旋轉(zhuǎn)縮放 經(jīng)過前面兩課的講解,相信大家對于SDL2的使用有了初步的認(rèn)識,下面我將:::的東西都放在main函數(shù)了,我們要學(xué)會對程序進(jìn)行模塊化。#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=;初始化函數(shù)intint{/*SDL/*win=",0,0,480,800,rendererSDL_CreateRenderer(win,-1,}釋放函數(shù)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的信息的。以便在繪制的時候不會造接下來。我們來編寫去背景色的函數(shù)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}其中通過表面,標(biāo)記(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*對于這個函數(shù),相信大家都不陌生,面已經(jīng)用到過多次了,不知大家注意到?jīng)]有,有個參數(shù)是用NULL來對它進(jìn)行賦值的。也就是源函數(shù)申明中的constRect*srcrect,對于這個參數(shù),我們可以從名字知道src表示的是source的意思。rect既rectangle也就是矩形,與之對應(yīng)的類型是SDL_Rect類那么,這個是干什么用的?仔細(xì)想想加上ntt*dstrect這個提示就NULL,是因為我們用的是整張。學(xué)了今天過后。一張文件就可以包含很多張小文件了,可以省下跟多東西,比如說內(nèi)存。在用的時候,只需要知道那些?。ntintClipBiltTexture(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,調(diào)用了我們新編的函數(shù)。接下來,我們看看運行效果:
externexternintintSDL_RenderCopyEx(SDL_Renderer*renderer,SDL_Texture*texture,constSDL_Rect*srcrect,constSDL_Rect*dstrect,constdoubleangle,constSDL_Point*center,SDL_RenderCopy()相比他多了3個參數(shù):angle角度,一個雙精度的浮點數(shù)。;center中心,一個SDL_Point類型的相信大家都是聰明的孩紙??瓷厦娴暮瘮?shù)申明應(yīng)該參數(shù)。用來旋轉(zhuǎn)中心;最后一個是一個標(biāo)記,他也是用來旋轉(zhuǎn)的,有以下3種模(intx,intSDL_Texture*Draw_Texture,boolzoom=false,floatextent=1.0,doubleangle=0.0,intcx=-1,intcy=-1){先是申明,本次什么我們也包含了一個雙精度浮點數(shù)angle,對應(yīng)的是旋轉(zhuǎn)角度,還有整型的cx,cy用來設(shè)置其旋轉(zhuǎn)中心,這里被初始化為-1;至于為什么?接下來再說。還有兩個參數(shù)是縮放用的一個bool類型。用來設(shè)置是否對進(jìn)行縮放,還有一個整型的extent用來設(shè)置縮放比例。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既不進(jìn)行縮放。ifif{Draw_Render_Rect.w=w*extent;Draw_Render_Rect.h=h*extent;}{Draw_Render_Rect.h=h;}這里是使用縮放的部分,由上節(jié)可以知道,矩形Draw_Render_Rect的存在,srcrect一樣,它是用來描述位置信息的矩形,不過是描述在窗口上的位置。即貼在窗口上的信息,在這里我們可以通過設(shè)置其長和寬來實現(xiàn)對進(jìn)行縮放,第一二課的都是沒有設(shè)置這個參數(shù)。所以都被拉伸至全屏了。ifif((cx!=-1)&&(cy!=-{center.x=cx;center.x=Render,Draw_Texture,}{Draw_Texture,NULL,angle,NULL,}}} 顯示文字不是SDL2的一個標(biāo)準(zhǔn)庫。而是一個擴展庫。讓我們把它包含進(jìn)源代#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第五課觸屏上節(jié)我們學(xué)習(xí)了幾個關(guān)于游戲的處理,但是游戲是人來玩的,當(dāng)然少不了人的存在。那么如何獲取人的行為呢?SDL2定義的一個SDL_Event用來處理SDL_KeyboardEventkey鍵盤數(shù)SDL_MouseMotionEventmotion鼠標(biāo)動作數(shù)SDL_TouchFingerEventtfinger觸屏數(shù)據(jù)Uint32type類Uint32timestampSDL_TouchIDtouchIdfloatxfloatyfloatdx末位置floatdyfloatpressure按壓 while(true)while(true){while{if(event.type=={Tx=Ty=}Tx=event.tfinger.x;Ty=}} 如果你想使用對的動作進(jìn)行判斷,可以使用dx,dy
數(shù)據(jù)了變是一個戳 用于像Android機這樣的使用,此書的所有代碼都是在Android平臺數(shù)我SDL_StartTextInput()由名稱可以知道這個函數(shù)是用來開始獲取文本輸入的。所以,當(dāng)我們使用字母或數(shù)字鍵是它把作為文本輸入而不是按鍵(吐槽一句,SDL2.0的文本輸入真的不咋滴),所以使用上下左右來調(diào)試Uint32type類型SDL_KEYDOWN按下SDL_KEYUPUint32timestampUint32windowIDUint8stateSDL_PRESSEDSDL_RELEASEDUint8repeatSDL_Keysymkeysym描繪了按下過釋放的內(nèi)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),}}在本人上上面的代碼出了上下左右可以響應(yīng)之外,其他代碼無法響應(yīng),電whilewhile{while{if(event.type=={ }e ets,255,if(T==BiltTexture(0,0,Text("你按下了A鍵edts,} 一個游戲除了精美的畫面效果,還要有與之相對的音效。本節(jié),我們要講解的是音效和背景音樂的。SDL2本身并沒有音頻的函數(shù),那么就需要我#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循環(huán)次數(shù)以及兩個音頻的結(jié)構(gòu)ticks-1typedeftypedefstruct{intallocated;Uint8*abuf;Uint32alen;Uint8volume;}typedefstruct_Mix_Music必須在使用所有函數(shù)前使用OpenAudio函數(shù);:導(dǎo)致函數(shù)失效,在加載函數(shù)使用后無法對Mix_Chunk和Mix_Music初始化,即一直為空。不得 函數(shù)與加載函數(shù)放在同一個函數(shù)內(nèi),即使里面包含了函數(shù)前Android知的為mp3格式的文件。在使用音頻的時候最好是使用wavLinuxoggAndroid。內(nèi)置音頻基本為ogg格式。 {Mix_Chunk*Chunk= yChannelTimed(1,Chunk,0,-1);}使用流程Mix_Chunk*。第八課限制幀頻關(guān)于動畫,都是一幀一幀變化形成,這也是為什么我們要用while(true)的原因我們需要不斷在窗口上繪圖才能夠形成動畫,科學(xué)家曾,當(dāng)變化為每秒24張的時候,眼睛將無法分辨主次,于是就有了。本節(jié)學(xué)習(xí)控制繪畫的速率,說到底就是不讓他畫的過快。以前我們用的是SDL_Delay()函數(shù)來控制,現(xiàn)在我們再加入一個計時器:SDL_GetTicks();externDECLSPECUint32SDLCALLSDL_GetTicks(void);intintintFrame=24;while(true){TimeSt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 資金管理與優(yōu)化實踐總結(jié)
- 廣西河池市環(huán)江縣2022-2023學(xué)年六年級上學(xué)期英語期末試卷
- 《演講中的自我介紹》課件
- 2025年山西省、陜西省、寧夏、青海省八省聯(lián)考高考地理模擬試卷
- 2023年廣西壯族自治區(qū)柳州市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2024年山西省朔州市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 《全身麻醉》課件
- 機電部的口號和目標(biāo)
- 遼寧省本溪市(2024年-2025年小學(xué)六年級語文)統(tǒng)編版綜合練習(xí)((上下)學(xué)期)試卷及答案
- 《慢阻肺健康大課堂》課件
- 廣西壯族自治區(qū)欽州市浦北縣2022-2023學(xué)年七年級上學(xué)期期末英語試題
- 動力學(xué)全套課件
- 廣東省深圳市2022-2023學(xué)年六年級上學(xué)期語文期末試卷(含答案)6
- 2022-2023學(xué)年北京市海淀區(qū)高一(上)期末生物試卷(附答案詳解)
- 河南省出版物經(jīng)營許可證申請登記表
- 細(xì)集料篩分試驗檢測記錄表模板
- (完整word版)聘書模板紅色
- 廣西柳州市名校2024屆數(shù)學(xué)高一上期末統(tǒng)考試題含解析
- 高考浙江卷:2023年6月《政治》考試真題與參考答案
- 第三章海洋民俗生活與海洋信仰
- 神經(jīng)網(wǎng)絡(luò)-BP算法-課件
評論
0/150
提交評論