SDL2笔记
SDL2基本操作
- 頭文件
- 主函數(shù)
- 初始化
- 創(chuàng)建窗口
- 窗口暫停以及事件講解
- 銷毀窗口(釋放指針)并退出
- 加載bmp圖片
- 新加載圖片的方法(使用渲染、紋理)
- 加載其他格式的圖片
頭文件
#include "SDL.h" #include "SDL_image.h"主函數(shù)
int main(int argc,char* argv[]) //一定要寫成這種含參數(shù)形式 { }初始化
使用SDL_Init(參數(shù)),參數(shù)表示整個(gè)游戲可以播放動(dòng)畫和聲音等,可以只填一個(gè),但是一定要有參數(shù)。
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);創(chuàng)建窗口
采用SDL_Window類型的指針來(lái)創(chuàng)建,使用SDL_CreateWindow(const char *title, int x, int y, int w,int h, Uint32 flags)函數(shù)來(lái)創(chuàng)建窗口。
函數(shù)參數(shù)意義依次為:
- 窗口標(biāo)題
- 窗口顯示在屏幕的位置(x,y),x和y可以讓系統(tǒng)來(lái)設(shè)置,可以寫成SDL_WINDOWPOS_UNDEFINED和SDL_WINDOWPOS_UNDEFINED
- 窗口的大小(w,h)
- 以什么樣的方式顯示窗口,如SDL_WINDOW_SHOWN(直接顯示),SDL_WINDOW_FULLSCREEN(全屏顯示)
代碼如下:
SDL_Window* window = SDL_CreateWindow("Asuna",100,100,800,600,SDL_WINDOW_SHOWN);窗口暫停以及事件講解
代碼如下:
//方法1 SDL_Delay(3000); //窗口停留3000秒 //方法2 system("pause");//一直暫停窗口,知道輸入其他鍵才消失 //方法3,使用事件弄一個(gè)循環(huán) SDL_Event event; bool quit=false; while (quit==false) { /*用SDL_PollEvent(&event)來(lái)檢測(cè)是否有事件,用SDL_Event的實(shí)例屬性event.type來(lái)獲取事件。*/while (SDL_PollEvent(&event)) //當(dāng)觸發(fā)事件時(shí)候執(zhí)行該循環(huán),沒(méi)有事件的時(shí)候就暫停,這樣做的目的是可以減少使用更多的內(nèi)存和cpu消耗{if (event.type==SDL_QUIT) //窗口操作的事件,當(dāng)點(diǎn)擊窗口右上角關(guān)閉按鈕的時(shí)候就執(zhí)行if{quit=true;//使用exit(0)是退出程序,這樣有個(gè)缺點(diǎn),就是可能有之前創(chuàng)建的內(nèi)存沒(méi)有釋放}else if (event.type==SDL_MOUSEBUTTONDOWN) //鼠標(biāo)事件,當(dāng)在窗口內(nèi)點(diǎn)擊鼠標(biāo)的時(shí)候觸發(fā)。{if (event.button.button==SDL_BUTTON_LEFT) //點(diǎn)擊鼠標(biāo)左鍵的時(shí)候執(zhí)行該代碼{}else if(event.button.button==SDL_BUTTON_RIGHT) //點(diǎn)擊鼠標(biāo)右鍵的時(shí)候執(zhí)行該代碼{}}else if (event.type == SDL_KEYDOWN) //鍵盤事件,當(dāng)輸入任意鍵時(shí)觸發(fā)。{if (event.key.keysym.sym==SDLK_UP) //如果按下的鍵是上就執(zhí)行代碼,左側(cè)用來(lái)接收用戶按下的鍵{} }} }銷毀窗口(釋放指針)并退出
程序最后需要執(zhí)行的代碼。代碼如下:
SDL_DestroyWindow(window); //銷毀窗口 SDL_Quit(); //以最安全的方式退出加載bmp圖片
加載圖片相當(dāng)于在窗口表面覆蓋上一張貼圖,SDL2默認(rèn)支持加載bmp格式的圖片,注意圖片的大小要比窗口小。步驟如下:
1.使用SDL_Surface類型的指針通過(guò)SDL_GetWindowSurface()函數(shù)獲得到窗口的表面。
2.再創(chuàng)建一個(gè)SDL_Surface類型的指針接收SDL_LoadBMP()函數(shù)加載的圖片。
3.貼圖之前要清除原來(lái)的圖,不然之前的圖還會(huì)呈現(xiàn)在窗口內(nèi)
4.使用SDL_BlitSurface()函數(shù)把圖片貼到窗口表面。
第一個(gè)參數(shù)是圖片。
第二個(gè)參數(shù)是以一個(gè)點(diǎn)切割圖片,取右下角圖片。參數(shù)形式和參數(shù)四一樣(NULL默認(rèn)不切割)
第三個(gè)參數(shù)是窗口。
第四個(gè)參數(shù)表示把圖片貼到窗口的哪個(gè)位置(NULL為貼到左上角),使用結(jié)構(gòu)體SDL_RECT類型,創(chuàng)建一個(gè)實(shí)例,該結(jié)構(gòu)體有兩個(gè)屬性x,y代表貼的位置,然后對(duì)其賦值,再將實(shí)例作為實(shí)參傳給第四個(gè)參數(shù)(需要指針,所以需要加&取地址)。代碼如下:
5.刷新窗口
加載圖片詳細(xì)代碼如下:
當(dāng)程序大或者電腦差的時(shí)候,用這種方法會(huì)發(fā)生鼠標(biāo)指針一閃一閃的問(wèn)題,原因是每次更新屏幕時(shí)都是通過(guò)SDL_FillRect()在屏幕上畫了一個(gè)很大的矩形,然后把原來(lái)的屏幕覆蓋掉了。為了解決這個(gè)問(wèn)題,引入了render(渲染)來(lái)更新屏幕。
新加載圖片的方法(使用渲染、紋理)
1.先對(duì)窗口進(jìn)行渲染(使用renderer),得到rend,以后都用rend代替窗口。
2.再把圖片轉(zhuǎn)換成紋理才能貼到rend上
3.創(chuàng)建一個(gè)矩形,也就是要貼的大小位置等
4.每次貼之前先清空rend
5.把img貼到rend上
6.顯示貼完之后的rend
加載其他格式的圖片
使用來(lái)自SDL_image.h庫(kù)的IMG_Load()函數(shù),其他和加載bmp格式的圖片一樣,改一下獲取圖片的函數(shù)就可以了。
SDL_Surface* image1 = IMG_Load("yui.png");通用模板代碼如下:
#include <iostream> #include "SDL.h" #include "SDL_image.h" using namespace std;int main(int argc, char* argv[]) {SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);SDL_Window* window = SDL_CreateWindow("Asuna", 100, 100, 800, 600, SDL_WINDOW_SHOWN);//渲染之后,用rend來(lái)代表windowSDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);SDL_RenderClear(rend); //清空掉窗口SDL_Surface* image = SDL_LoadBMP("1.bmp");//此處為相對(duì)路徑,也就是放在和代碼同一個(gè)文件夾中//要先把surface轉(zhuǎn)換成紋理(材質(zhì))才能貼到rend上SDL_Texture* img = SDL_CreateTextureFromSurface(rend, image);SDL_Rect rect;rect.x = 100;rect.y = 100;rect.h = image->h;rect.w = image->w;SDL_Event event;bool quit = false;while (quit == false){ /*用SDL_PollEvent(&event)來(lái)檢測(cè)是否有事件,用SDL_Event的實(shí)例屬性event.type來(lái)獲取事件。*/while (SDL_PollEvent(&event)) //當(dāng)觸發(fā)事件時(shí)候執(zhí)行該循環(huán),沒(méi)有事件的時(shí)候就暫停,這樣做的目的是可以減少使用更多的內(nèi)存和cpu消耗{if (event.type == SDL_QUIT) //窗口操作的事件,當(dāng)點(diǎn)擊窗口右上角關(guān)閉按鈕的時(shí)候就執(zhí)行if{quit = true;//使用exit(0)是退出程序,這樣有個(gè)缺點(diǎn),就是可能有之前創(chuàng)建的內(nèi)存沒(méi)有釋放}else if (event.type == SDL_MOUSEMOTION){//每次貼之前先清空rendSDL_RenderClear(rend);//把img貼到rend上SDL_RenderCopy(rend, img, NULL, &rect);}}SDL_Delay(5); //閃屏速度,越低越快。可以降低cpu使用率//顯示貼完之后的rendSDL_RenderPresent(rend);}SDL_DestroyWindow(window); //銷毀窗口SDL_Quit(); //以最安全的方式退出return 0; }總結(jié)
- 上一篇: 联想笔记本电脑如何进入bios如何进入电
- 下一篇: SDL2事件笔记