Selasa, 25 Januari 2011

Pong (part 4) AI

Sedikit nambahin buat program Pong yang sudah kita buat. Kita sudah membuat game pong yang dapat dimainkan oleh 2 orang, dengan kontrol Keyboard dan Mouse.
Nah, disini aku pingin sedikit latihan memodifikasi pong kita, agar kita bisa bermain melawan komputer. Untuk itu, kita akan membuat komputer seolah-olah bisa berfikir, atau mempunyai kecerdasan buatan (AI).

Kecerdasan buatan yang akan kita buat, sangat-sangat sederhana. Logikanya adalah, gerak bet komputer selalu mengikuti gerak/posisi bola. Jadi, cukup mengisi nilai koordinat y bet dengan koordinat y bola, akan membuat komputer bisa bermain melawan kita :)

Ok, untuk koding, kita update pada prosuder Update.
Ubah koding berikut
if (kb.IsKeyDown(Keys.Up)) betLoc[1] -= (float)gameTime.ElapsedGameTime.Milliseconds * 0.5f;
if (kb.IsKeyDown(Keys.Down)) betLoc[1] += (float)gameTime.ElapsedGameTime.Milliseconds * 0.5f;
yang merupakan kontrol bet menggunakan keyboard, dengan koding sbb:
betLoc[1] = ballLoc.Y;
Coba test dengan F5.
Dengan AI yang telah sematkan tersebut, komputer menjadi lawan yang tangguh, dan ga mungkin kalah..hehe.
Anda bisa bereksperiment dengan menggunakan random, atau yang lainnya, agar sesekali komputer tidak bisa menangkap bola.

Senin, 17 Januari 2011

Pong (part 3) Bola dan Algoritma pergerakannya

Ok friends, kita lanjutkan latihannya yak..
Sebelumnya kita telah berlatih untuk menampilkan dan menggerakan bet dengan menggunakan mouse dan keyboad. Sekarang mari kita lanjutkan latihannya dengan gerakan bolanya. Tidak seperti gerakan bet yang hanya bergerak pada sumbu y, gerakan bola bisa kesemua arah. Baik di sumbu x maupun y.

Ok, kita mulai dengan menambahkan variable terlebih dahulu
Vector2 ballLoc = new Vector2(400.0f, 240.0f);
Vector2 ballTraj = new Vector2();
bool playing = false;
Variable ballLoc kita gunakan untuk menyimpan lokasi/posisi bola. Kita menggunakan Vector2  karena kita akan menyimpan koordinat bola yang terdiri dari komponen x dan y. Lokasi bola kita inisiasi di tengah-tengah layar, yaitu koordinat (400,240).

Variable ballTraj akan kita gunakan untuk menyimpan nilai trajectory/lintasan bola. Nilai dari variable ini akan kita gunakan untuk mengubah/mengupdate posisi bola dengan cara menambah atau mengurangi nilai x dan y.

Terakhir, variable playing akan gunakan untuk menentukan status bola. Apabila playing=true, berarti bola sedang dimainkan, dan posisi bola akan kita update. Apabila playing=false, bola dalam keadaan diam.

Btw, kita akan mendefinisikan dulu hal2 yang menyangkut pergerakan bola.
  1. Bola diupdate berdasarkan nilai variable ballTraj.
  2. Jika bola membentur batas atas/bawah, maka bola akan memantul. 
  3. Jika bola membentur bet, maka bola akan memantul.
  4. Jika bola melewati batas kanan dan kiri layar, maka status playing=false. Kalo mau, kita bisa menghitung skor disini.
Oh ya, sebelumnya, kita akan menggunakan tombol Spasi untuk mulai permainan.
Kita tambahkan koding berikut pada prosedur Update
if (!playing)
{
    if (kb.IsKeyDown(Keys.Space))
    {
        playing = true;
        ballLoc = new Vector2(400.0f, 240.0f);
        ballTraj = new Vector2(0.25f, -0.25f);
    }
}

Jika status playing=false, kita cek status tombol Spasi. Jika Spasi ditekan, kita rubah status playing=true, dan kita set ulang lokasi bola. Arah awal bola kita rencanakan ke kanan atas, sehingga ballTraj kita inisiasi dengan nilai X positif, dan Y negatif. Oh ya, koordinat (0,0) berada di sudut kiri atas. Nilai positif ke kanan dan ke bawah. Sedikit berbeda dengan koordinat kartesius yang biasa kita kenal, nilai makin gede (positif) ke kanan dan keatas.

Ok, kita mulai dengan point pertama.
Bola diupdate berdasarkan nilai ballTraj. Update ini dilakukan jika status playing=true.
Tambahkan koding berikut pada prosedur Update
if (playing)
{
    ballLoc += ballTraj * (float)gameTime.ElapsedGameTime.Milliseconds;
}
Seperti pada update posisi bet dengan kontrol keyboard, kita juga mengupdate bola dengan melibatkan variable gameTime. Ini ditujukan agar kecepatan gerak bola kita stabil meskipun fps-nya berubah akibat load komputer yang berat/tinggi.

Next, kita coba tambahkan koding untuk menampilkan bola, agar kita bisa melihat hasilnya.
Update prosedur Draw dengan menambahkan koding menampilkan bola, seperti yang sudah kita bahas pada part 2.
spriteBatch.Draw(
    spritesTexture,
    new Rectangle((int)ballLoc.X - 16, (int)ballLoc.Y - 16, 32, 32),
    new Rectangle(64, 0, 64, 64),
    Color.White);
Sekarang kita test program kita dengan pencet F5. Kemudian tekan tombol Spasi untuk mulai menggerakan bola. Tampak bola akan bergerak ke kanan atas, hingga akhrinya menghilang setelah melewati batas layar.

Ok, sekarang kita masuk ke point 2, agar bola bisa memantul jika menabrak batas atas/bawah layar.
Update prosedur Update dengan koding berikut
if (playing)
{
    ballLoc += ballTraj * (float)gameTime.ElapsedGameTime.Milliseconds;

    if (ballLoc.Y < 16 || ballLoc.Y > 464) ballTraj.Y = -ballTraj.Y;
}
Apabila koordinat bola telah mencapai 16 atau 464, itu berarti bola telah mencapai batas atas/bawah. Maka arah bola pada sumbu Y harus kita balik
Pencet F5 untuk melihat perubahannya..

Sekarang kita lihat, bola kita sudah memantul ketika menabrak dinding atas/bawah. Tapi masih menembus bet. Nah, sekarang kita masuk point 3, bola memantul jika menabrak bet.
Kita coba latihan untuk bet 2 dulu ya, biar lebih mudah untuk ditest.
Skenarionya adalah, jika bola memasuki area bola, dan bola bersinggungan dengan bet, maka arah bola pada sumbu x kita balik.
Ok, kita update lagi koding kita pada prosedur update
if (playing)
{
    ballLoc += ballTraj * (float)gameTime.ElapsedGameTime.Milliseconds;
    if (ballLoc.Y < 16 || ballLoc.Y > 464) ballTraj.Y = -ballTraj.Y;
    if (ballLoc.X > 752 && ballTraj.X > 0)
    {
       
if (ballLoc.Y < betLoc[1] + 64 && ballLoc.Y > betLoc[1] - 64)
        {
            ballTraj.X = -ballTraj.X;
        }
    }

}

Mari pencet F5 untuk testing. Tekan Spasi untuk mulai menggerakan bola, kemudian coba naikkan bet 2 dengan menekan tombol panah atas agar bola mengenai bet 2. Aku menambahkan ballTraj.X > 0 untuk test, apakah bola benar2 sedang bergerak ke kanan.
Sekarang, kita sudah bisa memantulkan bola pada bet. Tapi tunggu dulu. Sebelum kita lanjutkan, aku pingin memodifikasi pantulan bola pada bet, agar lebih seru. Skenarionya adalah, posisi tempat bola memantul pada bet akan mempengaruhi arah bola pada sumbu Y. (Tapi kayaknya pong yang asli jg kayak gitu kali ya ^_^)
Ok, kita update koding kita
if (ballLoc.X > 752 && ballTraj.X > 0)
{
    if (ballLoc.Y < betLoc[1] + 64 && ballLoc.Y > betLoc[1] - 64)
    {
        ballTraj.X = -ballTraj.X;
        ballTraj.Y = (ballLoc.Y - betLoc[1]) * 0.01f;
    }
}
Dengan logika yang sama, kita bisa melakukannya untuk pantulan pada bet 1
if (ballLoc.X < 48 && ballTraj.X < 0)
{
    if (ballLoc.Y < betLoc[0] + 64 && ballLoc.Y > betLoc[1] - 64)
    {
        ballTraj.X = -ballTraj.X;
        ballTraj.Y = (ballLoc.Y - betLoc[0]) * 0.01f;
    }
}
Coba sekarang kita test dengan F5. Nampaknya bola sudah memantul dengan benar. Tapi tunggu dulu! Barusan aq liat, kalo bola membentur bet dari samping, masih bisa memantul kedepan.
Ok, kita tambahkan sedikit modifikasi seperti berikut.
//bola memantul pada bet 1
if (ballLoc.X < 48 && ballTraj.X < 0)
{
    if (ballLoc.Y < betLoc[0] + 64 && ballLoc.Y > betLoc[1] - 64)
    {
        if (ballLoc.X > 40) ballTraj.X = -ballTraj.X;
        ballTraj.Y = (ballLoc.Y - betLoc[0]) * 0.01f;
    }
}

//bola memantul pada bet 2
if (ballLoc.X > 752 && ballTraj.X > 0)
{
    if (ballLoc.Y < betLoc[1] + 64 && ballLoc.Y > betLoc[1] - 64)
    {
        if (ballLoc.X < 760) ballTraj.X = -ballTraj.X;
        ballTraj.Y = (ballLoc.Y - betLoc[1]) * 0.01f;
    }
}
Logikanya, bola hanya akan memantul pada bet jika bola masih dalam batas koordinat Y bet, dan bola masih berada di permukaan bet.

Terakhir, point 4, jika bola melewati batas kanan/kiri, playing=false.
Mudah saja, kita cukup cek apakah koordinat x bola melewati batas max/min layar.
if (ballLoc.X < 0 || ballLoc.X > 800) playing = false;
Done! Gameplay utama pong telah selesai kita buat. Sebenernya masih banyak kekurangan, kamu bisa improve sendiri yak. :)
Oh ya, latihan kita masih panjang kq. Kita belum berlatih menambahkan suara, effek, dll.
Sampai jumpa di latihan berikutnya kawan..

Senin, 10 Januari 2011

Pong (part 2) Menggambar Bet dan Menggerakannya

Pada latihan sebelumnya (Pong part 1) kita telah berlatih membuat objek grafik (sprite) dan menampilkannya. Nah sekarang, mari kita lanjutkan latihan kita dengan mencoba untuk menggerakkannya. Oh ya, sebelum kita menggerakan sprite kita, kita latihan dulu memisahkan sprite kita yang terdiri dari 3 bagian, tapi masih menyatu.

Sebenernya simple aja. Parameter masukan untuk fungsi Draw pada object SpriteBatch tidak hanya texture, posisi, dan warna seperti yang telah kita pakai pada latihan sebelumnya. Tetapi kita juga bisa memasukan parameter source, yang berisi posisi dan dimensi dari gambar yang akan ditampilkan, relatif terhadap sumber gambar (source).

Contohnya aja langsung, biar ga bingung. Misal kita akan menampilkan bet pertama, dimana lokasi bet 1 pada source gambar kita adalah di koordinat (0,0) dengan dimensi 32x128 pixel. Oh ya, untuk mendefinisikan objek yang terdiri dari variable lokasi dan dimensi, kita menggunakan objek Rectangle (x, y, width, height).
Untuk menggambar bet 1, kita akan menggunakan fungsi Draw dengan masukan parameter texture, posisi, source, warna.
spriteBatch.Draw(spritesTexture, new Vector2(0, 0), new Rectangle(0, 0, 32, 128), Color.White);
Coba test pencet F5.
Maka gambar yang tampil hanya bet 1 yang berwarna biru.
Untuk menampilkan bet 2 yang berwarna merah, kita tinggal mengganti parameter source-nya saja. Karena bet 2 ada pada posisi koordinat (32,0) pada source kita, maka untuk menampilkan bet 2 kita bisa menggunakan koding berikut:
spriteBatch.Draw(spritesTexture, new Vector2(0, 0), new Rectangle(32, 0, 32, 128), Color.White);
Begitu pula untuk menggambar bola yang ada pada posisi (0,64), dengan dimensi 64x64 pixel.
spriteBatch.Draw(spritesTexture, new Vector2(0, 0), new Rectangle(64, 0, 64, 64), Color.White);
Sudah jelas kan?
Tapi tunggu dulu. Ukuran bola kita kayaknya terlalu gede deh. Ok, jangan khawatir. Untuk parameter lokasi pada fungsi Draw, biasanya kita menggunakan Vector2. Nah, selain menggunakan vector2, kita juga bisa menggunakan objek Rectangle seperti yang kita gunakan untuk mendefinisikan source.
Kita akan merubah dimensi bola kita menjadi 32x32 pixel saat menampilkannya di layar. So, koding untuk menampilkan bola akan kita ubah seperti berikut:
spriteBatch.Draw(spritesTexture, new Rectangle(0, 0, 32, 32), new Rectangle(0, 0, 64, 64), Color.White);
Coba kita test lagi dengan menekan F5. Maka bola kita akan ditampilkan dengan ukuran setengah dari ukuran semula.

Ok, kita lanjutkan dengan latihan menggerakan gambar. Kita mulai dengan menggerakan pad 1. Aku berencana untuk mengontrol pad 1 dengan mouse, dan pad 2 dengan keyboard.
Sebelumnya, mari kita menambahkan variable untuk menyimpan posisi bet.
float betLoc = 240.0f;
Mungkin ada yang bertanya, knapa kita ga pake Vector2, tapi cuma pake float? Soalnya posisi bet kita hanya bisa digerakkan naik turun, sehingga kita cukup menyimpan nilai koordinat y-nya saja.
Btw, kenapa kita inisialisasi pada posisi koordinat 240? Itu karena secara default, ukuran layar game kita adalah 800x480 pixel. Karena tingginya adalah 480, dan kita ingin menampilkan posisi bet kita tepat ditengah2, maka kita set posisi awalnya 240.
Sebenernya, kita bisa juga mengubah ukuran layar game kita. Tapi untuk sementara ini, kita gunakan saja nilai defaultnya.

Berikutnya, kita akan mengupdate posisi bet kita dengan posisi kursor mouse.
Tambahkan koding berikut pada prosedur Update
MouseState mouse = Mouse.GetState();
betLoc = mouse.Y;
if (betLoc < 64.0f) betLoc = 64.0f;
if (betLoc > 416.0f) betLoc = 416.0f;
Disini kita batasi koordinat Y di rentang 64 s/d 416. Ini disebabkan karena bet kita mempunyai ukuran tinggi 128 pixel, dan kita akan set koordinat 0-nya diposisi tengah. Sehingga untuk menggambar bet pada posisi mentok atas, kita akan menggambar di koordinat y 0+64=64, dan mentok bawah di koordinat y 480-64=416.

Next, kita update pemanggilan fungsi Draw pada prosedur Draw menjadi berikut:
spriteBatch.Draw(spritesTexture, new Vector2(0, betLoc-64), new Rectangle(0, 0, 32, 128), Color.White);
Sekarang coba pencet F5. Gerakan mouse keatas dan kebawah.
Jreng jreng..! Gambar bet akan ikut bergerak naik turun sesuai posisi mouse :)
Gampang kan?

Next, untuk bet 2, kita akan coba mengontrolnya dengan keyboard.
Untuk menghemat variable, kita akan mengubah variable betLoc kita menjadai array, agar bisa menampung posisi bet 1 dan bet 2 sekaligus. Bet 1 ditampung pada index 0, dan bet 2 ditampung pada index 1.
float[] betLoc = new float[] { 240.0f, 240.0f };
Sebelum kita lanjutkan, ubah dulu pemanggilan variable betLoc untuk bet 1 dengan betLoc[0].
Untuk menggunakan kontrol keyboard pada bet 2, kita tambahkan koding berikut pada prosedur Update.
KeyboardState kb = Keyboard.GetState();

if (kb.IsKeyDown(Keys.Up)) betLoc[1]-=8;
if (kb.IsKeyDown(Keys.Down)) betLoc[1]+=8;

if (betLoc[1] < 64.0f) betLoc[1] = 64.0f;
if (betLoc[1] > 416.0f) betLoc[1] = 416.0f;
Kalau kita lihat, tidak beda jauh dengan teknik menggunakan kontrol mouse. Hanya bedanya, disini update posisi bet menggunakan penambahan dan pengurangan variable, sedangkan pada kontrol mouse, kita langsung mengambil nilai koordinat Y dari posisi mouse.

Next, tambahan untuk prosedur Draw.
spriteBatch.Draw(spritesTexture, new Vector2(768, betLoc[1] - 64), new Rectangle(32, 0, 32, 128), Color.White);
Disini, posisi x dari bet 2 kita set di posisi 768, yang didapat dari 800-32 = 768.
Sekarang kita coba lagi pencet F5.
Gerakan mouse dan panah atas/bawah keyboard. Kamu bisa liat sendiri hasilnya :)


Sampai disini dulu yak latihan kita hari ini..kita lanjutin lagi di part 3, untuk membahas cara menggerakan bola-nya. Source code seutuhnya akan saya masukan di comment.

----
Update 13/1/2010

Btw, masih ada sedikit kekurangan dalam algoritma kontrol bet menggunakan keyboard.
Disini, kita mengupdate posisi bet dengan menambah/mengurangi dengan nilai 8 tiap kali.
Update itu terjadi tiap 1/60 detik sekali, karena secara default, fps kita diset 60 fps.
Nah masalahnya adalah, apabila kita menjalankan program pada komputer dengan spek yang kurang mendukung, sehingga tidak bisa mencapai 60 fps, maka kecepatan update posisi bet kita menjadi tidak stabil. Sehingga kita perlu mengalikannya dengan variable gameTime, agar kecepatan gerakan objek kita bisa tetap konstan.
Menurut buku yang aq baca sih gitu..:)
So, kita akan mengubah koding update posisi bet 2 menjadi :
if (kb.IsKeyDown(Keys.Up)) betLoc[1] -= (float)gameTime.ElapsedGameTime.Milliseconds * 0.5f;
if (kb.IsKeyDown(Keys.Down)) betLoc[1] += (float)gameTime.ElapsedGameTime.Milliseconds * 0.5f;
Sebenernya aq sendiri blm pernah nyoba di komputer yang lemot. Jadi belum tau effeknya. he.

Minggu, 09 Januari 2011

Pong (part 1) Persiapan

Habis baca thread di kaskus, katanya kalau mau belajar game programming, jangan langsung memasang target yang tinggi2, seperti 3D ala Doom, Quake, dkk. Tapi mulailah dengan project yang sederhana dulu. Cukup yang 2D saja.

Okelah kalo begitu.
Untuk latihan kedua kita, saya putuskan untuk membuat game Pong!
Salah satu game tertua di dunia game komputer. Pong dibuat oleh Allan Alcorn, enginer di Atari, sebagai latihan pada tahun 1972.

Pong adalah game 2D yang mensimulasikan tenis meja. Pemain harus menjaga bola agar tidak keluar dengan sebuah paddle (bat tenis) yang bisa digerakkan naik turun untuk memukul balik bola ke lawan.

Ok, segitu aja sedikit intronya tentang pong.
Kita mulai saja latihan kedua kita dengan membuat project baru, beri nama Pong, atau sesuai selera anda.

Sebelum kita lanjutkan, kita buat dulu entitas / content grafik yang akan kita pakai. Untuk membuat game pong, kita butuh dua buah bet/paddle dan sebuah bola. Berikut aku buatkan layout untuk objek-objek yang kita butuhkan.

Kita akan membuat dua buah paddle dengan ukuran masing 32 x 128 pixel, dan sebuah bola dengan ukuran 64 x 64 pixel. Kamu boleh saja membuat dengan ukuran yang lain, akan tetapi, koding programnya menyesuaikan ukuran gambar yang anda buat tentunya..:)
Berikut contoh gambar yang telah aku buat (sederhana banget yak!) :


Kamu tentu boleh berkreasi dengan gambar yang lain tentunya. Silahkan gunakan program pengolah gambar kesukaan kamu seperti Photoshop dan kawan2. Aku sendiri memakai program Paint.NET yang gratisan..he. Paint.NET bisa di download di www.getpaint.net

Next, mari kita tambahkan content grafik kita dan tampilkan gambarnya.
Pertama kita buat dulu folder gfx pada group Content, agar kita bisa memisahkan antara content grafik dan content suara. Caranya, klik kanan pada Content --> Add --> New Folder. Isi nama folder baru kita dengan gfx.



Kedua, tambahkan gambar yang telah kita buat kedalam project kita, dibawah folder gfx. Caranya, klik kanan folder gfx --> Add --> Existing Item...
Pilih content gambar yang telah kita buat, klik Add.
Agar koding kita seragam, rubah Nama Asset dengan nama 'sprites'. Nama Asset dapat dirubah melalui jendela properties. Jika jendela properties belum muncul, kita bisa memunculkannya dengan mudah dengan cara klik kanan pada salah satu content kita, kemudian klik Properties. Secara default, nama asset adalah sesuai dengan nama filenya. Jika nama file kamu  'sprites.png', maka otomatis nama asset-nya adalah 'sprites'


Btw, kalau kita lihat terjemahan dari kata 'sprite' lewat google translate, artinya adalah bidadari. Tapi bukan itu yang kita maksud tentunya. Dalam dunia game programming, sprite adalah objek grafik 2D yang akan kita pakai dalam scene kita. Sebagai contoh dalam game yang sedang kita buat, sprite-nya adalah gambar bet dan bola.

Ok, lanjut deh.
Sekarang kita coba tampilkan content grafik yang sudah kita tambahkan tadi.
Kita awali dengan membuat variable untuk content grafik kita. Kita tambahkan coding berikut pada area pendeklarasian variable
Texture2D spritesTexture;
Karena objek kita adalah 2D, maka kita menggunakan Texture2D.
Selanjutnya, load content kita dengan menambahkan coding berikut pada prosedur LoadContent
spritesTexture = Content.Load<Texture2D>(@"gfx/sprites");
Berikutnya, kita coba test tampilkan content grafik kita, apakah sudah bisa diload dengan benar, dengan menambahkan koding berikut pada prosedur Draw
spriteBatch.Begin();
spriteBatch.Draw(spritesTexture, new Vector2(0, 0), Color.White);
spriteBatch.End();
Disini kita menggunakan fungsi Draw untuk menampilkan content kita, dengan parameter masukan texture (gambar), lokasi, warna.  Sebenarnya, masih banyak parameter lain yang dapat kita gunakan untuk masukan fungsi Draw ini. Tapi sementara kita pake parameter yang paling sederhana dahulu.

Coba kita pencet F5 untuk test program kita.
Jika hasilnya adalah seperti berikut, berarti content kita telah berhasil diload dan ditampilkan dengan benar.


Btw, aku pingin background-nya item aja. Biar tampak sangar dan kuno..hehe..
Rubah koding berikut pada prosedur Draw
GraphicsDevice.Clear(Color.CornflowerBlue);
menjadi
GraphicsDevice.Clear(Color.Black);
Sekarang coba tekan F5 lagi. Jadi item kan bg-nya? :)
Btw lagi, kalo ada yang bingung dimana posisi nulis kodingnya, bisa lihat pada latihan sebelumnya (Hello World), karena disana lebih dijelaskan dimana posisi koding yang kita tambahkan.

Ok, sampai disini dulu latihan kita kali ini. Ntar kita lanjutin di part 2. Udah capek nih..hehe
Oh ya, kalo ada komentar, pertanyaan, usul, atau kritik, silahkan tulis aja di comment yak..

Rabu, 05 Januari 2011

Hello world (part 2)

Ok, kita lanjutkan latihannya..

Untuk bisa menampilkan text dilayar, kita harus menambahkan content font ke dalam project kita.
Langkahnya adalah
  1. Klik kanan pada Hello WorldContent (Content) pada Solution Explorer
  2. Pilih Add --> New Item
  3. Pilih Sprite Font dan beri nama 'myFont.spritefont'
  4. Klik Add
 Tunggu bentar dan viola..coding dengan format xml akan ditampilkan di project kita. Tapi jangan pusing dulu liatnya. Kalo kita baca dengan seksama, mudah dimengerti koq. Kita bisa atur nama font, size, style, dll. Tinggal edit aja sesuka hati :)

Next, kembali ke Game1.cs, tambahkan object SpriteFont. <-- untuk menghandle Font
Tambahkan coding berikut sesudah baris  SpriteBatch spriteBatch;
SpriteFont font;
Berikutnya, load font kita.
Tambahkan coding berikut dalam prosedur LoadContent, sesudah baris  // TODO: use...
font = Content.Load<SpriteFont>("myFont");
Langkah terakhir, gambar content kita ke layar..
Tambahkan coding berikut dalam prosedur Draw, sebelum baris base.Draw(gameTime);
spriteBatch.Begin();
spriteBatch.DrawString(font, "Hello World", new Vector2(20, 45), Color.White);
spriteBatch.End();
Done!
Disini kita menggunakan fungsi DrawString untuk menggambar/mencetak tulisan kita dilayar, dengan parameter masukan font, string, lokasi, warna.

Coba sekarang pencet F5..jreng jreng jreng...!


Akhirnya, Hello World kita tampil juga dilayar..:)

Btw, mungkin ada yang penasaran, apa sih SpriteBatch? Kenapa kita menggunakan spriteBatch untuk menggambat text? Berikut aku coba copas dari salah satu buku tutorial XNA (Building XNA 2.0 Game)

For 2D development, SpriteBatch is one of the most useful classes in the XNA Framework.
When you draw anything on modern graphics hardware, it is done in 3D. Essentially, SpriteBatch
takes some 2D drawing calls you give it, converts them into optimized, complicated calls that
the 3D-geared hardware likes, and sends them along. For all things 2D, this is a huge time-saver.

Ok, sampai disini latihan pertama kita. Silahkan coba2 sendiri mengubah font, lokasi, warna, dll.
Untuk project latihan berikutnya, rencana kita akan membuat game yang paling sederhana. Pong!
Katanya sih, Pong itu Hello World-nya game development :)

Hello world (part 1)

Untuk latihan pertama kita, mari kita membuat program yang paling terkenal sejagat raya.

'Hello World'

Semua orang yang pernah belajar pemrograman komputer, pasti tau program ini. Yup, program yang menampilkan tulisan 'Hello World' dilayar komputer kita. Terdengar simple kan?

OK, kita mulai latihan nya.

Pertama, kita mulai dengan membuka program Visual C# ya..
Buat project baru dengan template Windows Game (4.0)
Isi judulnya dengan Hello World, atau terserah kamu saja.




Klik OK, tunggu sebentar hingga project baru selesai dibuat.

Kalo sudah muncul coding dengan judul Game1.cs, berarti project baru telah berhasil dibuat. Sekarang tekan F5 untuk mencoba program kita.
Dada..kalo muncul window baru berwarna biru dengan judul Hello World, itu artinya program game pertama sukses dibuat dan bisa berjalan dengan baik dan benar..selamat deh  :)


Terus mana nih tulisan Hello Worldnya??? Tuh, di title bar-nya..! hehe..
Ok, bukan ini program yang akan kita buat. Tapi kita akan menampilkan tulisan Hello world pada layar yang berwarna biru.

Tunggu dulu..sebelum kita lanjutkan, apakah ada yang menmui error seperti ini?


Jangan panik! Ikuti perintah saya!
Klik Project --> Hello World Properties...
Pindahkan Game Profile ke Use Reach (semula Use HiDef)


Ok, sekarang coba tekan lagi F5. Kalo masih ga bisa juga, lem kuning aja tuh komputer. Pasti komputer jadul deh..hehe..

Ok, back to topick!
Sebelum kita melanjutkan latihan kita menambahkan tulisan Hello World, ada baiknya kita coba pelajari dulu struktur pemrograman game di XNA.

Berikut sedikit copas dari blog tetangga untuk membantuk pemahaman kita tentang alur program xna.
(http://dodollipret.wordpress.com/2008/05/06/asset-dan-input-di-xna/)

Perhatikan jendela code editor, disana sudah disediakan 5 buah method yaitu : Initialize(), LoadContent(), UnloadContent(), Update() dan Draw().
  • Initialize() sebagai tempat untuk mengeset nilai awal variable-variable.
  • LoadContent() sebagai tempat untuk memanggil content (gambar, font, suara, map, dll).
  • Update() sebagai tempat untuk meng-update variable variable.
  • Draw() sebaga tempat untuk memanggil fungsi untuk menggambar ke layar.
  • UnloadContent() kebalikan dari LoadContent() tentunya..hehe. yaitu tempat untuk bersih2 content

Hal yang perlu di catat adalah bahwa method Update() dan Draw() selalu dipanggil secara bergantian. Disanalah kita harus menulis core dari program game kita. 

Update() biasanya diisi dengan kode program untuk meng-update nilai dari variable posisi player, posisi musuh, posisi peluru, check tumbukan (collision) dll. Artinya disanalah inti dari engine game kita ditulis.

Sedangkan Draw() adalah tempat untuk memanggil fungsi-fungsi drawing. Disini kita harus menggambar satu-per-satu texture kita (player, enemy, bullet, explotion, dll) sesuai dengan posisinya masing-masing.

Nah kombinasi kedua method inilah (update-draw) yang mengakibatkan terjadinya pergerakan gambar-gambar di layar monitor. Tiap pemanggilan Draw() bisa diasosiasikan dengan dengan sebuah Frame (dalam flash, atau video). Sehingga banyaknya pemanggilan Draw() dalam 1 detik bisa disebut sebagai Frame Per Second (FPS). Semakin tinggi FPS-nya semakin halus pergerakan gambar-gambar di monitor kita.

Karena Update() dan Draw() saling dipanggil bergantian, maka apabila method Update() dipanggil terlalu lama (perhitungan yang dilakukan didalamnya terlalu rumit) maka jumlah pemanggilan Draw() per-second-nya akan semakin kecil. Kalau terlalu kecil (dibawah 30 FPS) maka akan terasa ada efek patah-patah dalam gameplay game kita.

Huff..baru setengah jala, tulisannya dah banyak..
Sambung ke part 2 aja yak..

Selasa, 04 Januari 2011

Preambule


Test..

Test posting dulu ah..coba copas pengertian XNA dari blog tetangga..^,^

Apa sih XNA? XNA adalah sebuah framework dari Microsoft untuk memudahkan developer membangun game untuk PC dan XBOX, dan Zune. Gampangnya, semua buatan Microsoft. XNA juga adalah singkatan dari ‘XNA’s Not Acronymed’

Hmm...puyeng liat kepanjangan dari XNA. Jadi inget pelajaran rekursive waktu kuliah..he.

Ok, kita mulai dengan ngumpulin bahan-bahannya

1. Microsoft Visual C# Express 2010
Kalo punya yang versi yang bukan Express bisa juga dipakai. Tapi harus yang versi 2010. Soalnya kita mo pake versi XNA terbaru. Tapi kalo pingin gratisan, ya pake ini aja. Ga perlu lisensi :)
Bisa diambil disini secara gratis:
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express

2. Microsoft XNA Game Studio 4.0
Ini dia, bahan utama kita. XNA! Langsung sedot aja di alamat:
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9AC86ECA-206F-4274-97F2-EF6C8B1F478F
Ini merupakan versi terbaru waktu aku nulis postingan ini.

3. Komputer
Bukanya bercanda, tapi kalo ga ada komputer, gimana mau latihan. Dijamin puyeng deh kalo cuma baca doang ;)
Boleh desktop, laptop juga ok. Yang penting dah lumayan kenceng..Dual core cukup lah..
Terus harus terpasang VGA dengan minimal yang sudah suport shader model 1.1

Hmm...apaan tuh shader model 1.1????
Coba baca sendiri aja ya di wikipedia..he..
Yang jelas, vga yang yang sudah suport DirectX 8.0
Kalo vga kita produk nvidia, minimal GeForce 3, kalo ATI, minimal Radeon 7500

Saya pake laptop yang VGA-nya intel gimana bro??? Jangan khawatir. Minimal Intel GMA 900 aja udah suport Shader Model 2.0 koq

Oh ya, satu lagi, OS-nya harus mikocok punya. Minimal WinXP.

Ok, next step..INSTALL

Install aja secara berurutan, Visual C# kemudian XNA..
Gampang kan??