Animasi 2D dengan Direct3D Bagian 3 |
Tutorial bagaimana membuat animasi 2D dengan Direct3D. Disini akan dibahas bagaimana membuat animasi background scrolling.PrasyaratArtikel ini adalah sambungan Animasi 2D dengan Direct3D Bagian 1 dan Animasi 2D dengan Direct3D Bagian 2. Saya sarankan anda membaca artikel tersebut terlebih dahulu.PendahuluanOK... kita lanjutkan dengan topic berikutnya, masih mengenai animasi 2D tentunya. Pada contoh aplikasi yang kita buat sebelumnya, karakter selalu digambar pada background polos. Pada game, background seperti ini tentunya sangat membosankan. Game 2D biasanya memiliki background yang discroll otomatis mengikuti pergerakan karakter dalam game. Pertanyaannya sekarang, bagaimana menampilkan background yang dapat discroll tersebut?Sebelum menjawab partanyaan tersebut, kita perlu sedikit mengulas beberapa isu yang sedikit banyak akan mempengaruhi bagaimana desain background scroller yang akan kita buat. Memory, barang mewah yang tidak selalu kita punya.Background pada sebuah game terutama game-game bertipe petualangan, biasanya selalu lebih besar dari area layar, guna memberikan pemain kebebasan untuk mengekplorasi suatu level game. Jika seluruh background yang besar tersebut kita, simpan dalam sebuah blok memori yang besar (baik itu system RAM atau video RAM), ada kemungkinan memori bebas yang tersedia tidak cukup besar untuk menampung data seluruh background tersebut.Kita akan memisah background menjadi keping-keping background yang lebih kecil yang nantinya akan kita tampilkan secara tiled. Dengan menggunakan keping-keping yang lebih kecil, peluang tersedianya memori menjadi lebih terbuka. Keterbatasan Ukuran TextureBeberapa VGA card hanya mampu menampilkan texture dengan ukuran dua pangkat n dan juga harus sama sisi, sehingga ukuran tekstur yang diijinkan biasanya 1x1, 2x2, 4x4, 8x8, 16x16, 32x32 dan seterusnya. VGA card lama semacam voodoo, memiliki keterbatasan maksmum ukuran teksture 256x256, sedangkan VGA card terbaru biasanya sanggup menyimpan teksture berukuran maksimum 1024x1024.Pada aplikasi yang kita buat sebelumnya, kita menciptakan teksture menggunakan fungsi D3DXCreateTextureFromFileEx, fungsi ini (seperti juga fungsi D3DXCreateTexture*** lainnya) menciptakan tekstur dengan melakukan pengecekan terhadap ukuran teskture yang diijinkan oleh VGA card. Ukuran tekstur yang kita inginkan biasanya akan dibulatkan ke atas menjadi bilangan dua pangkat n terdekat, sehingga misalnya kita menciptakan texture dari gambar berukuran 120x60, maka tekstur yang kita buat sangat besar kemungkinannya akan dibulatkan menjadi tekstur berukuran 128x128, dimana selain data gambar sebesar 120x60, sisanya akan diisi 0. Tentunya hal ini sangat membuang-buang memori. Jika kita beruntung, pemain mungkin memiliki VGA card yang mendukung tekstur dengan ukuran sembarang, sehingga tidak ada space memori terbuang sia-sia, namun tentunya kita sebagai developer aplikasi harus siap dengan kemungkinan terburuk. Oleh karena itu untuk meminimalkan memori yang terbuang percuma. Kita akan mememecah-mecah keping background menjadi berukuran nxn dimana n adalah bilangan dua pangkat n. Untuk background scroller yang kita buat, sengaja dipilih ukuran 64x64, Ukuran ini tidak terlalu besar dan didukung oleh semua VGA card. Jika anda punya preference lain, bisa saja menggantinya. Desain Background ScrollerSebuah background akan dienkapsulasi dalam sebuah kelas bernama TBackground yang diturunkan dari T3DObject. Kita perlu meng-override metode Draw, dengan kode untuk manggambar keeping-keping background.Karena background terdiri atas keping-keping kecil, kita membutuhkan instance TSpriteCollection dan juga TTextureCollection untuk menyimpan keping dan tekstur masing-masing keping. Untuk metode public selain metode Draw dan Init yang dioverride dari T3DObject,TBackground akan memiliki constructor Create dan destructor Destroy, yang akan kita isi dengan kode untuk alokasi dan dealokasi instance TSpriteCollection dan TTextureCollection. Terakhir TBackground akan kita lengkapi dengan metode LoadFromFile untuk membaca file gambar background dengan format yang didukung sesuai format yang disupport D3DX. LoadFromFile akan otomatis memecah-mecah file gambar menjadi keping-keping tekstur. TBackground akan kita lengkapi dengan property Translation, X, dan Y yang akan kita pergunakan untuk mengubah posisi background. Untuk dapat mengakses Sprite collection dan Texture kita tambahkan property SpriteCollection dan TextureCollection. Desain Background CollectionPada beberapa game 2D, background yang digunakan tidak cuma satu, dimana background-bakground ini ditumpuk dan digerakkan dengan kecepatan yang berbeda-beda untuk menghasilkan efek kedalaman pada game 2D.Kita juga akan mengimplementasikan fitur tersebut. Agar kita dapat mengatur background-background ini dengan mudah, background akan kita simpan dalam sebuah instance collection yang kita beri nama TBackgroundCollection. Kelas ini akan diturunkan dari T3DCollection, karena kita membutuhkan property Engine milik T3DCollection.Ok kita buat implementasi TBackground. Disini hanya akan dijelaskan dua fitur utama TBackground yakni loading file gambar dan memecahnya menjadi keping-keping tekstur serta menggambar keping-keping tersebut. Loading Gambar dan Memecah Gambar menjadi Tekstur-teksturSebenarnya proses ini akan lebih mudah bila gambar background sudah dipecah-pecah menjadi potongan gambar-gambar kecil menggunakan tool editing gambar semacam Adobe Photoshop. Namun kecepatan loading file kecil-kecil yang banyak lebih lambat dibandingkan dengan loading sebuah file besar, selain itu adakalanya kita tidak bisa atau malas mengedit gambar tersebut. Metode LoadFromFile ditujukan untuk mengatasi hal ini. LoadFromFile otomatis akan memecah-mecah background yang besar menjadi kepingan tektur-tekstur yang lebih kecil.secara umum, langkahnya adalah sebagai berikut:
Untuk menciptakan surface kita menggunakan IDirect3DDevice8.CreateImageSurface
Untuk loading file gambar ke surface kita menggunakan fungsi D3DXLoadSurfaceFromFile(),
Parameter:
Langkah 1 akan dienkapsulasi dalam fungsi bernama GetImgInfo. Fungsi ini sebenarnya tergolong quick hack guna mendapatkan informasi gambar. Caranya adalah kita buat surface bohong-bohongan dengan ukuran 2x2 pixel (ukurannya bebas tidak harus 2x2), lalu memanggil D3DXLoadSurfaceFromFile, untuk membaca gambar ke surface. D3DXLoadSurfaceFromFile mengembalikan informasi gambar di pSrcInfo, parameter inilah yang kita pergunakan. Berikut ini adalah implementasi langkah untuk mendapatkan informasi gambar.
Setelah kita mendapatkan informasi gambar, kita buat temporary surface yang kita pergunakan menampung gambar.
Langkah-langkah yang dijalankan pada fungsi diatas adalah mendpatkan
image info dengan memanggil fungsi GetImgInfo. setelah itu jumlah keping
yang diperlukan dihitung. Berdasarkan lebar dan tinggi image kita buat
surface yang berukuran sama. Tidak seperti tekstur, surface tidak
memiliki batasan dalam hal ukuran lebar dan tinggi. Format surface kita
tetapkan bertipe 32 bit (A=8 bit,R=8 bit B=8 bit, G=8 bit), jika anda
punya preference lain, bisa saja menggantinya.Jika surface berhasil dibuat, maka kita panggil D3DXLoadSurfaceFromFile unttuk membaca gambar ke surface. Langkah ke-3 akan kita enkapsulasi menjadi sebuah metode LoadFromSurface. Karena LoadFromSurface ini fungsinya mengkopi surface ke tekstur tentunya sangat tepat bila diletakkan pada kelas TTexture.
Pemanggilan D3DXCreateTexture digunakan untuk menciptakan sebuah
tekstur kosong, Selanjutnya kita ambil surface yang ada pada mip level
0.Catatan:Tekstur tidak selalu terdiri atas satu gambar saja, seringkali teksture terdiri atas satu atau lebih gambar dengan resolusi yang berbeda-beda (mipmap). Level 0 adalah gambar dengan detail paling jelas. selanjutnya Surface sumber kita copy ke texSurface, dengan area yang kita copy ditentukan oleh srcRect. OK berikut ini adalah implementasi lengkap metode LoadFromFile. Untuk tiap-tiap keping background, kita susun source rectangle yang bersesuaian dengan posisi keping. Jika keping adalah keping terakhir pada baris atau kolom, kita cek apakah lebar/tingginya merupakan kelipatan BGRSIZE, jika tidak, maka lebar/tinggi sisa yang ada pada FWidthExt atau FHeightExt kita pergunakan untuk menyusun rectangle sumber, jika kelipatan BGRSIZE, lebar/tinggi keping kita set sama dengan BGRSIZE (BGRSIZE=64)
Menampilkan BackgroundBackground kita tampilkan menggunakan prosedur Draw yang kita override. Proses
|
Tidak ada komentar:
Posting Komentar