日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SDL2笔记

發(fā)布時(shí)間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SDL2笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)(需要指針,所以需要加&取地址)。代碼如下:

SDL_Rect rect;rect.x = 100;rect.y = 100;

5.刷新窗口
加載圖片詳細(xì)代碼如下:

SDL_Surface* surface = SDL_GetWindowSurface(window);//記住最后需要釋放,使用SDL_FreeSurface()函數(shù)。SDL_Surface* image = SDL_LoadBMP("1.bmp");//此處為相對(duì)路徑,也就是放在和代碼同一個(gè)文件夾中SDL_FillRect(surface, NULL, 0);//清除原來(lái)的圖,但是程序大的話鼠標(biāo)會(huì)閃屏,第一個(gè)參數(shù)表示在哪畫一個(gè)矩形(NULL表示整個(gè)屏幕),第二個(gè)參數(shù)表示要填充的地方,第三個(gè)參數(shù)表示顏色SDL_BlitSurface(image,NULL,surface,&rect);//貼完之后刷新窗口SDL_UpdateWindowSurface(window)

當(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

SDL_Window* window = SDL_CreateWindow("Asuna", 100, 100, 800, 600, SDL_WINDOW_SHOWN); //1.渲染,以后用rend來(lái)代表window SDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_Surface* image = SDL_LoadBMP("1.bmp"); //2.要先把surface轉(zhuǎn)換成紋理(材質(zhì))才能貼到rend上 SDL_Texture* img = SDL_CreateTextureFromSurface(rend, image); //3.創(chuàng)建矩形 SDL_Rect rect; rect.x = 100; rect.y = 100; rect.h = image->h; rect.w = image->w; //4.每次貼之前先清空rend SDL_RenderClear(rend); //5.把img貼到rend上 SDL_RenderCopy(rend, img, NULL, &rect);//第三個(gè)參數(shù)同樣是對(duì)圖片進(jìn)行分割 //6.顯示貼完之后的rend SDL_RenderPresent(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é)

以上是生活随笔為你收集整理的SDL2笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。