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