Mengenal GDI+ untuk Menggambar pada Windows Form part 3
Jika sebelumnya kita telah mengenal cara membuat animasi untuk bola yang bergerak memantul-mantul, maka kali ini kita akan menggunakan GDI+ untuk membuat animasi dari sprites.
Berikut adalah contoh sprites yang akan
kita pergunakan dalam artikel kali ini. Download dan simpan gambar Tarma
Metal Slug yang diambil dari GSArchive berikut :
Download Resource File
Seperti yang terlihat dari gambar di atas, sprite adalah serangkaian gambar dengan ukuran tertentu yang akan dimainkan frame demi frame hingga memunculkan ilusi gerakan. Lebar tiap frame dalam gambar tersebut adalah 48px dengan 10 frame dalam gerakannya.
Object yang akan dipakai dalam
artikel ini adalah karakter Tarma dari MetalSlug. Tarma dalam program
yang akan Anda buat hanya akan bergerak mondar-mandir dari kiri ke kanan layar. Tentunya dia akan memiliki animasi sehingga benar-benar tampak hidup.
Animasi Tarma
Untuk dapat mewujudkan itu, yang perlu kita lakukan adalah memanipulasi parameter sourceRectangle dan destinationRectangle seperti yang dijelaskan pada artikel lalu. SourceRectangle akan mengambil gambar atau frame dari sprite yang kita punya dan posisi dari SourceRectangle akan terus bergeser setiap interval waktu tertentu yang tentunya cukup kecil sehingga sourceRectangle akan bergeser cukup cepat. Akibatnya gambar yang tampil pada destinationRectangle tampak bergerak.
Membuat Animasi dari Sprite
- Buat project windows form baru (C#)
- Tekan F5 sehingga akan muncul dialog untuk menyimpan project Anda dan folder Debug di dalamnya. Save gambar sprite Tarma di atas (dengan nama tarma.png pada kasus ini) dan simpan ke dalam folder Debug/Bin pada folder project yang Anda simpan.
SImpan Project dalam Folder Debug
- Masukkan sebuah pictureBox dan timer, caranya sama dengan artikel sebelumnya, penulis sangat menyarankan jika Anda tidak mengerti bagian ini untuk kembali ke artikel sebelumnya.
- Sekarang buat pictureBox yang kita masukkan mengikuti besar layar, untuk itu ubah properties Dock dari pictureBox menjadi fill.
Ubah Properties Dock menjadi Fill
- Untuk menambah warna pada aplikasi, Anda dapat menggunakan gambar background seperti ini (kagekia.devianart.com) download dan simpan juga gambar ini:
- Ubah beberapa property dari pictureBox untuk dapat menampilkan gambar di atas, pertama cari property BackgroundImage dan klik tombol kecil dengan lambang titik (…) . Akan terbuka sebuah window Select Resource, pilih import pada bagian Local Resource dan carilah file gambar yang Anda download di atas. Berikutnya, ubah juga property BackgroundImageLayout menjadi Stretch.
Ubah Property PictureBoxPilih Gambar yang DiinginkanTampilan dari Windows Form - Masukklah dalam file form1.cs dan seperti biasanya, pada konstruktor class Form1 berikan intansiasi dari Graphics class dan enable Timer1:
12345678910111213141516171819202122232425
publicpartialclassForm1:Form{Graphics g;Karakter karakter;public Form1(){InitializeComponent();pictureBox1.Image=newBitmap(pictureBox1.Width,pictureBox1.Height);g=Graphics.FromImage(pictureBox1.Image);timer1.Enabled=true;}} - Klik dua kali timer1 object di bagian bawah pada designer dan ubah kode yang di generateoleh C# menjadi seperti berikut :
123456789
privatevoid timer1_Tick(object sender,EventArgs e){g.Clear(Color.Transparent);pictureBox1.Invalidate();} - Setelah selesai mempersiapkan segala sesuatunya, sekarang, kita akan
membuat sebuah class untuk mengatur animasi yang hendak ditampilkan.
Class ini bernama Karakter dan sama seperti kelas Bola pada artikel
sebelumnya memiliki method untuk melakukan updateposisi
dan gambar. Selain itu juga menyimpan berbagai variabel yang diperlukan
dalam penggambaran. Kali ini pembuatan kelas dilakukan dalam file
Form1.cs. Untuk itu tepat di bawah penutup kelas Form1 tambahkan baris
sebagai berikut :
12345678910111213141516171819
publicpartialclassForm1:Form{public Form1(){InitializeComponent();}}publicclassKarakter{} - Berikutnya masukkan ke dalam class Karakter berbagai field yang diperlukan sebagai berikut :
1234567891011121314151617181920212223242526272829303132333435363738394041
publicclassKarakter{//menyimpan gambar spriteCharacterprivateImage spriteCharacter;//menyimpan lokasi dan besar dari gambar,serta area yang dapat//dilalui karakter//untuk penjelasan destinationRect dan SourceRect dpat dilihat pada//artikel sebelumnyaprivateRectangle destinationRect,sourceRect,displayArea;//spriteNum adalah banyaknya gambar dalam satu deret sprite//spriteWidth menentukan lebar masing-masing gambarprivateint spriteNum,spriteWidth;//interval menentukan interval waktu antar proses penggambaran//dipanggil//timeElapsed menyimpan banyaknya waktu yang berlalu semenjak//pemanggilan proses//penggambaran yang terkahir kaliprivateint interval,timeElapsed;//speed menentukan kecepatan karakter dalam berjalanprivateint speed=5;} - Dan berikan konstruktor ke dalam class Karakter :
123456789101112131415161718192021222324252627282930313233343536373839404142434445
///<summary>///Konstruktor kelas Karakter///</summary>///<paramname="sprite">gambar sprite yang dipergunakan</param>///<paramname="destination">kotak tujuan di mana gambar akan di gambar</param>///<paramname="area">layar di mana karakter diperkenankan digambar</param>///<paramname="spriteWidth">lebar tiap frame/gambar dalam sprite</param>///<paramname="spriteNum">jumlah gambar dalam sebuah sprite</param>///<paramname="interval">interval waktu penggambaran</param>public Karakter(Image sprite,Rectangle destination,Rectangle area,int spriteWidth,int spriteNum,int interval){this.spriteCharacter=sprite;this.displayArea=area;this.destinationRect=destination;this.spriteNum=spriteNum;this.spriteWidth=spriteWidth;//sourceRect adalah kotak yang membatasi area di mana//darifilegambar asli yang diambil untuk digambar//memungkinkan tidak semua gambar diambilthis.sourceRect=newRectangle(0,0,spriteWidth,sprite.Height);this.interval=interval;} - Sama seperti bola pada artikel yang lalu tambahkan juga method Update() yang akan dipanggil setiap kali timer1 ‘berdetik’. Tambahkan method Update()di bawah konstruktor di dalam class :
a. Hal pertama yang harus dilakukan adalah menghitung waktu karena kita tak mau object bergerak berdasarkan kecepatan timer ( kecepatan timer1 telah di set 1 milidetik, jika Anda tidak melakukan ini, object akan berjalan luar biasa cepat ). Untuk ini lah kita menggunakan variabel TimeInterval. Tambahkan baris berikut ke dalam method Update() :1
publicvoid Update(Graphics g){}
b. Setiap kali timeElapsed melebihi interval yang ditentukan maka ubahlah bagian update() sehingga setiap kali pemanggilan dapat melakukan:1234567891011//setiap kali Update dipanggil//waktu bertambahtimeElapsed++;//jika waktu telah melebihi interval yang ditentukan atau//samaif(timeElapsed>=interval){}
– Posisi gambar harus digeser pada layar sesuai dengan kecepatan.
– timeElapsed harus dikembalikan menjadi nol.
– Gambar karakter kita harus diganti dengan frame selanjutnya pada sprite.
c. Kemudian Anda harus menambahkan rutin untuk mengubah gambar dan arah gerak dari gambar karakter saat ia menyentuh bagian kiri atau kanan layar. Maka dari itu tambahkan kode berikut di dalam method Update() tepat di bawah if di atas :123456789101112131415161718192021//jika waktu telah melebihi interval yang ditentukan atau samaif(timeElapsed>=interval){//gambar di layar di majukan tergantung speeddestinationRect.X+=speed;//frame di gantisourceRect.X+=sourceRect.Width;sourceRect.X %=spriteCharacter.Width;//kembalikan timeElapsed menjadi0timeElapsed=0;}
1234567891011121314151617//jika karakter mencapai ujung dari layarif(destinationRect.X<0|| destinationRect.X>displayArea.Width-spriteWidth){//balik kecepatannyaspeed=-speed;//flip gambarnya(dari kanan menjadi kiri)spriteCharacter.RotateFlip(RotateFlipType.Rotate180FlipY);} - Untuk bagian terakhir pada Update() tambahkan sebaris kode untuk penggambaran pada pada method Update() di bawah if pada point c di atas :
12345
//gambarkan karakter pada layar,lihat artikel sebelumnya tentang//operasi penggambaran Imageg.DrawImage(spriteCharacter,destinationRect,sourceRect,GraphicsUnit.Pixel); - Sekarang yang perlu Anda lakukan adalah mempergunakan class
tersebut. Kembali pada bagian class Form1. Tambahkan beberapa baris
sebagai berikut :
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
publicpartialclassForm1:Form{Image sprite=Image.FromFile("tarma.png");Graphics g;Karakter karakter;int lebarPerSprite=48;int banyakSprite=10;int interval=5;public Form1(){InitializeComponent();Rectangle posisiKarakter=newRectangle(0,360,80,90);Rectangle area=newRectangle(0,0,this.Width,this.Height);karakter=newKarakter(sprite,posisiKarakter,area,lebarPerSprite,banyakSprite,interval);pictureBox1.Image=newBitmap(pictureBox1.Width,pictureBox1.Height);g=Graphics.FromImage(pictureBox1.Image);timer1.Enabled=true;}privatevoid timer1_Tick(object sender,EventArgs e){g.Clear(Color.Transparent);karakter.Update(g);pictureBox1.Invalidate();}} - Kemudian tekan F5 dan jika semua berjalan semestinya, Anda akan mendapati tampilan karakter berjalan layaknya manusia sungguhan pada layar. Anda pun dapat mencobanya pada source code yang disertakan.
Kesimpulan
Ini adalah bagian terakhir dari
rangkaian artikel yang membahas tentang GDI+ di C# sebelumnya. Semoga
dapat membantu Anda, berikut juga ada beberapa daftar referensi yang
dapat Anda pergunakan. Happy coding :)

0 komentar:
Posting Komentar