Pelajaran SDL 2: Pelajaran 2 - Main Non-Karet

Halo semuanya! Ini adalah pelajaran kedua SDL 2. Saya masih mendapatkan informasi dari sini .

Jadi, selamat datang di pelajaran

Utama bukan karet


Dalam pelajaran terakhir, saya mengatur semuanya dengan baik di fungsi Main () , tetapi untuk program besar ini tidak baik. Itulah sebabnya kesempatan untuk menulis fungsi muncul. Sekarang kita akan menggunakannya.

Kami akan mulai menulis kode dengan menghubungkan SDL dan mendeklarasikan beberapa variabel global.

#include <SDL2/SDL.h> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Surface *scr = NULL; SDL_Surface *smile = NULL; 

Di sini, di luar fungsi Main () , kami mendeklarasikan objek jendela ( menang ), permukaan layar ( scr ), dan gambar emotikon ini ( senyum ).

Mari kita menulis fungsi untuk menginisialisasi SDL, membuat jendela dan permukaan untuk menggambar. Ini terlihat seperti ini:

Init ()
 int init() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { return 1; } win = SDL_CreateWindow("Main  ", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { return 1; } scr = SDL_GetWindowSurface(win); return 0; } 

Kode ini seharusnya tidak asing bagi Anda dari pelajaran sebelumnya. Di sini kita menginisialisasi sistem video, menciptakan jendela dengan nama "Utama bukan karet", dengan koordinat yang tidak ditentukan dan dengan dimensi yang ditetapkan sebelumnya, dan juga mendapatkan permukaan jendela, menyimpannya di scr . Pada kesalahan, fungsi ini akan mengembalikan 1, jika tidak 0.

Sekarang Anda dapat menulis fungsi untuk mengunduh file media yang diperlukan. Ini dia:

Memuat ()
 int load() { smile = SDL_LoadBMP("smile.bmp"); if (smile == NULL) { return 1; } return 0; } 

Fungsi ini sangat sederhana. Kami memuat gambar .bmp menggunakan fungsi SDL_LoadBMP . Fungsi ini mengambil path ke file gambar (penuh atau relatif), dan mengembalikan objek dari kelas SDL_Surface . Anda juga harus memeriksa kebenaran eksekusi: jika ada masalah dengan unduhan (file tidak ditemukan, file rusak), maka fungsi SDL_LoadBMP akan mengembalikan NULL .

Kami juga menulis program untuk menyelesaikan aplikasi.

Berhenti ()
 void quit() { SDL_FreeSurface(smile); smile = NULL; SDL_DestroyWindow(win); SDL_Quit(); } 

Fungsi SDL_FreeSurface baru telah muncul di sini , yang hanya membersihkan permukaan. Setelah kita menetapkan variabel smile menjadi NULL . Semua fungsi lain dibahas dalam pelajaran sebelumnya.

Di situlah penulisan fungsi selesai dan kami dapat melanjutkan ke Utama () .

Main ()
 int main (int argc, char ** args) { if (init() == 1) { return 1; } if (load() == 1) { return 1; } SDL_BlitSurface(smile, NULL, scr, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); quit(); return 0; }; 

Di sini pertama-tama kita memanggil fungsi init () , yang ditulis sebelumnya, kemudian fungsi load () , yang juga kita tulis sebelumnya. Selanjutnya, tampilkan senyum dalam scr , menggunakan fungsi SDL_BlitSurface . Fungsi ini menerima permukaan untuk menggambar, persegi panjang yang harus dipotong dari permukaan ini (ini diperlukan untuk animasi), jika tidak ada yang perlu dipotong, NULL ditransmisikan, permukaan tempat persegi panjang itu digambar, yang koordinatnya digunakan untuk menggambar. Jika koordinatnya nol, kami berikan NULL .

Sudah waktunya untuk berbicara tentang koordinat. SDL menggunakan sistem koordinat yang berbeda, bukan yang digunakan semua orang. Di sini titik dengan koordinat (0, 0) ada di sudut kiri atas. Ini penting untuk dipertimbangkan saat menampilkan untuk menghindari situasi yang tidak menyenangkan.

Nah, itu tadi menyenangkan, kami lanjutkan. Selanjutnya, kami memperbarui jendela dengan fungsi yang sudah akrab, membuat program membeku selama 2 detik, memanggil fungsi quit () yang kami tulis, dan mengakhiri program. Pada output, kami memiliki program yang menampilkan senyum dingin selama 2 detik. Seluruh kode terlihat seperti ini:

 #include <SDL2/SDL.h> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Surface *scr = NULL; SDL_Surface *smile = NULL; int init() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { return 1; } win = SDL_CreateWindow("Main  ", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { return 1; } scr = SDL_GetWindowSurface(win); return 0; } int load() { smile = SDL_LoadBMP("smile.bmp"); if (smile == NULL) { return 1; } return 0; } void quit() { SDL_FreeSurface(smile); SDL_DestroyWindow(win); SDL_Quit(); } int main (int argc, char ** args) { if (init() == 1) { return 1; } if (load() == 1) { return 1; } SDL_BlitSurface(smile, NULL, scr, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); quit(); return 0; }; 

Saya harap semuanya jelas. Semoga beruntung untuk semuanya!

<< Pelajaran sebelumnya || Pelajaran selanjutnya >>

Source: https://habr.com/ru/post/id454414/


All Articles