Halo semuanya! Saya kembali dengan pelajaran baru untuk Anda! Dan jika Anda tiba-tiba bosan menunggu pelajaran dari saya, Anda selalu dapat menemukan pelajaran ini dalam bahasa Inggris di
sini .
Baiklah, mari kita mulai pelajaran ke 7 dengan judulnya
Viewport diterjemahkan dari bahasa Inggris sebagai tempat menonton, atau dalam kasus kami ini adalah tempat render. Intinya adalah ini: kita mengambil dan membatasi permukaan gambar tidak ke seluruh jendela, tetapi ke beberapa bagian darinya. Ini bisa bermanfaat, misalnya, untuk menggambar sebuah minimap dalam sebuah game.
Menurut teori, saya memiliki segalanya, kita beralih ke latihan.
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; const int SCREEN_SIZE[2] = {640, 480}; SDL_Window *window = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL;
Sebagai permulaan, seperti biasa mendeklarasikan variabel.
Kami akan menggambar bunga ini.
init bool init() { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; return false; } int flags = IMG_INIT_PNG; if (!(IMG_Init(flags)&flags)) { cout << "Can't init IMG: " << IMG_GetError() << endl; return false; } window = SDL_CreateWindow("VIEWPORT", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_SIZE[0], SCREEN_SIZE[1], SDL_WINDOW_SHOWN); if (window == NULL) { cout << "Can't create window: " << SDL_GetError() <<endl; return false; } ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() <<endl; return false; } return true; }
memuat bool load() { SDL_Surface *temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; return false; } flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; SDL_FreeSurface(temp_surf); temp_surf = NULL; return false; } return true; }
berhenti void quit() { SDL_DestroyWindow(window); window = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); }
Saya tidak akan menjelaskan fungsi inisialisasi, pemuatan gambar dan de-inisialisasi, karena mereka hampir identik dengan yang sebelumnya.
Dan sekarang untuk bagian yang menyenangkan:
int main() { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } SDL_Rect top_vp = {0, 0, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2}; SDL_Rect bottom_vp = {0, SCREEN_SIZE[1] / 2, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2};
Di sini kami memasang
SDL , mengunggah gambar, dan membuat dua persegi panjang yang satu di bawah yang lain dan menempati seluruh lebar jendela. Ini adalah
viewport kami.
SDL_RenderSetViewport(ren, &top_vp); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderSetViewport(ren, &bottom_vp); SDL_RenderCopy(ren, flower, NULL, NULL);
Selanjutnya, kita sudah mulai menggambar. Pertama-tama, kita perlu menetapkan tempat menggambar. Ini dilakukan oleh fungsi
SDL_RenderSetViewport , yang mengambil dua parameter: render dan persegi panjang di mana kita ingin menggambar. Setelah mengatur area, gambar bunga kami di dalamnya dengan metode
SDL_RenderCopy yang terkenal. Setelah itu, ulangi hal yang sama untuk persegi panjang kedua.
SDL_RenderPresent(ren); SDL_Delay(2000); quit(); return 0; }
Kemudian kami memperbarui jendela, tunggu 2 detik dan akhiri program.
Setelah mengkompilasi dan menjalankan program ini, kita akan melihat dua bunga pipih. Hanya itu yang ingin saya tunjukkan hari ini.
Nah, ini pelajaran yang sangat kecil, jika Anda memiliki pertanyaan, saya akan dengan senang hati menjelaskan, tetapi saya memiliki segalanya. Sampai jumpa!
<< Pelajaran sebelumnya