Halo semuanya, ini adalah pelajaran keenam di SDL 2 dan hasilnya kecil, tetapi layak untuk dilakukan. Semua pelajaran ada di
sini .
Dalam pelajaran ini kita akan menggambar gambar primitif. Mari kita mulai dan selamat datang di pelajaran
Pertama, mari kita lihat apa itu primitif. Grafik primitif adalah objek geometris paling sederhana yang ditampilkan pada layar tampilan: titik, segmen garis, persegi panjang, busur, lingkaran, dll. Di SDL 2, kita hanya bisa menggambar titik, persegi panjang, dan garis.
Mari kita mulai ke kode
#include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL;
Saya tidak akan menjelaskan deklarasi variabel, mari kita lanjutkan.
bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; } ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; }
Di
Init, inisialisasi SDL 2, buat jendela dan render di sini juga, jangan berlama-lama.
Saya tidak menulis fungsi
Load , karena kita tidak perlu memuat apa pun.
Dalam fungsi
Berhenti , kita cukup menghapus jendela, render, dan inisialisasi SDL 2.
void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; }
Saya akan melewatkan panggilan ke fungsi
Init dan beralih ke bagian yang paling menarik. Untuk menggambar persegi panjang, kita perlu membuat objek bertipe
SDL_Rect . Koordinat dan dimensi diperlukan untuk menggambar.
Sedikit tentang
SDL_Rect : tipe data ini adalah array dari 4 angka:
x ,
y ,
w dan
h - dalam urutan itu. Yaitu, kode ini:
SDL_Rect rect = {1, 1, 1, 1}; - sepenuhnya benar.
Ini melengkapi teori tentang
SDL_Rect, mari kita mulai menulis kode.
SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1);
Di sini kami disuruh membuat cat hitam dan mengisinya dengan seluruh jendela. Setelah itu mereka berkata melukis putih. Selanjutnya, kami membuat persegi panjang dengan koordinat (10; 10) dan dimensi 50x50. Fungsi
SDL_RenderFillRect menggambar persegi panjang.
Menggambar hanya garis persegi panjang tidak jauh berbeda.
SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2);
Kami membuat persegi panjang dan memanggil fungsi
SDL_RenderDrawRect . Dia hanya menggambar garis besar persegi panjang di layar.
Langkah selanjutnya adalah menggambar garis.
SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70);
Persegi panjang tidak diperlukan untuk menggambar garis. Fungsi
SDL_RenderDrawLine menerima nilai render dan empat koordinat. Ini adalah koordinat titik awal dan titik akhir. Saya memutuskan untuk menggambar garis horizontal yang dijorok dari tepi sebesar 10 piksel.
Poin menggambar hampir tidak berbeda dengan menggambar garis. Kami memanggil fungsi
SDL_RenderDrawPoint dan meneruskan render dan koordinat titik. Tapi untuk menggambar suatu titik tidak menarik, mari kita menulis
untuk yang lebih baik, di mana melalui 3 piksel kita akan menarik poin.
for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); }
Kami mendapat garis titik-titik horisontal.
Gambar ini telah berhenti. Tetap hanya memperbarui layar, mengatur waktu jeda, keluar dan kembali
0 .
SDL_RenderPresent(ren); SDL_Delay(5000); quit(); return 0; }
Ini menyimpulkan pelajaran kami, di sini adalah kode lengkap:
#include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; } ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; } void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; } int main (int arhc, char ** argv) { if (!init()) { quit(); system("pause"); return 1; } SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1); SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2); SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70); for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); } SDL_RenderPresent(ren); SDL_Delay(5000); quit(); return 0; }
Dan saya mengucapkan selamat tinggal kepada Anda, selamat tinggal semuanya!
<< Pelajaran sebelumnya || Pelajaran selanjutnya
>>