Bergerak Sprite Dengan SDL
Setelah saya SDL tutorial pertama, Anda harus memiliki ide yang cukup baik tentang bagaimana untuk mengatur SDL dan menampilkan sebuah gambar pada layar. Langkah logis selanjutnya adalah untuk membaca dari keyboard dan membuat sesuatu bergerak di layar.
Program ini dibangun di atas contoh dari tutorial 1 di beberapa tempat, jadi jika Anda belum membacanya belum, atau jika Anda tidak jelas tentang dasar-dasar SDL, sekarang adalah saat yang tepat untuk pergi check it out.
Program ini dibangun di atas contoh dari tutorial 1 di beberapa tempat, jadi jika Anda belum membacanya belum, atau jika Anda tidak jelas tentang dasar-dasar SDL, sekarang adalah saat yang tepat untuk pergi check it out.
The Moving Sprite Program
Berikut adalah rincian dari apa yang terjadi di contoh program ini.
1. Program ini dimulai dari seperti contoh pertama, SDL diinisialisasi, jendela dibuat, dll
2. Perbedaan pertama sedang loading sprite, kita tidak hanya mengkonversi sprite ke format tampilan, kami juga menetapkan kunci warna. Ini berarti bahwa apa pun di gambar yang ungu (255, 0, 255), akan diperlakukan sebagai transparan.
3. Program ini kemudian berlanjut seperti sebelumnya. Latar belakang dimuat, dan kita memasuki loop utama.
4. Setelah kita cek untuk acara, kita mendapatkan keadaan saat keyboard dengan SDL_GetKeyState (). Fungsi ini mengembalikan pointer ke array data yang menggambarkan masing-masing tombol pada keyboard. Jika tombol ditekan, array akan berisi 1, jika tidak maka akan berisi 0.
5. Array keystate kemudian diuji untuk masing-masing tombol panah. Jika salah satu tombol panah ditekan, kita akan bergerak sprite arah itu.
6. Sekarang hal-hal yang bergerak, kita harus menguji untuk melihat apakah kita sudah pindah dari tepi layar. Jika demikian, sprite tersebut akan dipindahkan kembali.
7. Berikutnya untuk loop blits ubin latar belakang seluruh layar.
8. Kemudian sprite digambar di atas latar belakang.
9. Program ini berakhir seperti sebelumnya, kita membebaskan memori untuk permukaan dengan SDL_FreeSurface, dan pembersihan SDL dengan SDL_Quit ().
Simpan file ini sebagai sdlmove.cpp, atau sdlmove.c jika Anda ingin menggunakan lurus C bukan C ++. Anda juga akan membutuhkan file bitmap yang pergi dengan program ini. Mereka tersedia untuk di-download dengan kode sumber di bagian bawah halaman ini.
#include "SDL.h" #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define SPRITE_SIZE 32 int main ( int argc, char *argv[] ) { SDL_Surface *screen, *temp, *sprite, *grass; SDL_Rect rcSprite, rcGrass; SDL_Event event; Uint8 *keystate; int colorkey, gameover; /* initialize SDL */ SDL_Init(SDL_INIT_VIDEO); /* set the title bar */ SDL_WM_SetCaption("SDL Move", "SDL Move"); /* create window */ screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); /* load sprite */ temp = SDL_LoadBMP("sprite.bmp"); sprite = SDL_DisplayFormat(temp); SDL_FreeSurface(temp); /* setup sprite colorkey and turn on RLE */ colorkey = SDL_MapRGB(screen->format, 255, 0, 255); SDL_SetColorKey(sprite, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey); /* load grass */ temp = SDL_LoadBMP("grass.bmp"); grass = SDL_DisplayFormat(temp); SDL_FreeSurface(temp); /* set sprite position */ rcSprite.x = 0; rcSprite.y = 0; gameover = 0; /* message pump */ while (!gameover) { /* look for an event */ if (SDL_PollEvent(&event)) { /* an event was found */ switch (event.type) { /* close button clicked */ case SDL_QUIT: gameover = 1; break; /* handle the keyboard */ case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_q: gameover = 1; break; } break; } } /* handle sprite movement */ keystate = SDL_GetKeyState(NULL); if (keystate[SDLK_LEFT] ) { rcSprite.x -= 2; } if (keystate[SDLK_RIGHT] ) { rcSprite.x += 2; } if (keystate[SDLK_UP] ) { rcSprite.y -= 2; } if (keystate[SDLK_DOWN] ) { rcSprite.y += 2; } /* collide with edges of screen */ if ( rcSprite.x < 0 ) { rcSprite.x = 0; } else if ( rcSprite.x > SCREEN_WIDTH-SPRITE_SIZE ) { rcSprite.x = SCREEN_WIDTH-SPRITE_SIZE; } if ( rcSprite.y < 0 ) { rcSprite.y = 0; } else if ( rcSprite.y > SCREEN_HEIGHT-SPRITE_SIZE ) { rcSprite.y = SCREEN_HEIGHT-SPRITE_SIZE; } /* draw the grass */ for (int x = 0; x < SCREEN_WIDTH / SPRITE_SIZE; x++) { for (int y = 0; y < SCREEN_HEIGHT / SPRITE_SIZE; y++) { rcGrass.x = x * SPRITE_SIZE; rcGrass.y = y * SPRITE_SIZE; SDL_BlitSurface(grass, NULL, screen, &rcGrass); } } /* draw the sprite */ SDL_BlitSurface(sprite, NULL, screen, &rcSprite); /* update the screen */ SDL_UpdateRect(screen, 0, 0, 0, 0); } /* clean up */ SDL_FreeSurface(sprite); SDL_FreeSurface(grass); SDL_Quit(); return 0; }
Catatan, tidak ada memeriksa dalam program ini kesalahan. Jika sesuatu gagal, akan sulit untuk melacak. Aku ditinggalkan kesalahan memeriksa hanya untuk membuat program yang lebih pendek dan lebih mudah untuk mengikuti. Dalam program nyata Anda harus memeriksa kembali nilai-nilai dari semua fungsi panggilan SDL.
Compiling
Di Linux Anda dapat mengkompilasi program ini dengan mengetikkan perintah ini:
g++ sdlmove.cpp `sdl-config --cflags --libs` -o sdlmove
lalu jalankan programmnya
./sdlmove
Jika semuanya bekerja dengan benar, window 640x480 harus membuka dengan bidang rumput dan sprite kecil yang Anda dapat bergerak dengan keyboard .
dalam Visual C++ anda harus mengikuti steps berikut :
1.buat sebuah empty folder Windows Application Project .
2.Tambahkan "sdltest.cpp" file untuk project anda.
3. Pada menu klik Project, kemudian Properties.
4. Double-klik "Konfigurasi Properties".
5. Double-klik "C / C ++".
6. Klik "Kode Generation".
7. Ganti "Runtime Library" untuk "multi-threaded DLL".
8. Klik-ganda "Linker".
9. Klik "Input".
10. Selain "Dependensi Tambahan", ketik "sdl.lib sdlmain.lib".
Anda harus dapat menekan F7 untuk membangun program.
Sebelum kita dapat menjalankan program, Anda harus menempatkan "SDL.dll" file mana Windows dapat menemukannya. Menyalin file dari "C: \ Program Files \ SDL-1.2.9" untuk Visual C ++ folder proyek baru Anda. Jika program anda dikompilasi tanpa kesalahan, Anda sekarang dapat menekan F5 untuk menjalankan program.
0 komentar: