Wednesday, May 1, 2013

Perkenalan Konsep Rendering dengan Ray Tracing

Tulisan kali ini diambil dari makalah yang saya buat tahun 2007 lalu sebagai persyaratan untuk mendaftar jadi asisten asisten Lab GaIB (Grafik dan Intelejensi Buatan). Topiknya tentang Ray Tracing, salah satu jenis rendering. Membuat tulisan ini memberi pelajaran yang sangat banyak untuk saya, terutama tentang bagaimana proses rendering bekerja. Dan sejak saat itu saya tidak bisa melihat film atau gambar 3D hasil computer graphic dengan sama lagi :) Karena selalu terpikir teknik apa saja yang digunakan untuk mencapai kualitas seperti itu.

Silahkan menikmati :D

 

Gambaran Umum Ray Tracing

Ray tracing adalah suatu metode untuk menghasilkan gambar yang dibuat dalam lingkungan komputer 3D. Cara kerjanya adalah dengan mengikuti jejak (tracing) suatu sinar (ray) dari suatu mata imajiner yang melalui sebuah pixel di layar virtual dan mengakumulasi kontribusi setiap sinar dalam scene di pixel tersebut. Setiap sinar yang berasal dari mata tersebut diperiksa apakah berpotongan/bertabrakan dengan objek-objek di dalam scene. Scene adalah kumpulan objek-objek dan sumber cahaya yang akan dilihat oleh pengamat. Setiap terjadi tabrakan antara sinar dan objek, warna pixel di-update, lalu tergantung dari jenis material objek dan algoritma yang dipakai, sinar tersebut dapat diteruskan atau dihilangkan.

Dengan metode ray tracing ini, kita dapat membuat berbagai efek yang sulit atau bahkan tidak mungkin dengan metode lain. Diantara efek-efek tersebut adalah pemantulan, tembus cahaya, dan bayangan.

 


Gambar 1. Contoh ray tracing sederhana

Dalam menggunakan ray tracing, umumnya dibuat suatu batasan agar lebih mangkus. Contohnya, pixel akan di-update jika sinar telah memantul n kali atau telah bergerak sejauh m tanpa berpotongan dengan apapun. n dan m adalah nilai pembatas. Intensitas cahaya dan warna dari pixel yang bersangkutan dihitung berdasarkan sejumlah algoritma, baik dengan algoritma klasik atau dengan teknik radiosity.

Salah satu metode turunan dari ray tracing adalah photon mapping. Pada photon mapping ini, sinar dibuat dari sumber cahaya dan dari mata pengamat secara independen. Sinar yang dibuat akan terus bergerak dalam scene sampai habis diserap oleh sebuah permukaan, bergerak ke arah yang tidak akan terjadi perpotongan, atau jaraknya terlalu jauh dari pengamat. Inti dari photon mapping adalah melakukan simulasi pencahayaan, namun hal ini jauh lebih lambat daripada ray tracing biasa.

Konsep Ray Tracing

Ada dua konsep yang menjadi dasar teori untuk ray tracing, yaitu :

1.   Kita dapat melihat sebuah benda karena benda tersebut memantulkan cahaya. Cahaya yang dipantulkan tersebut lalu akan ditangkap oleh retina mata dan diterjemahkan oleh otak menjadi apa yang kita lihat.

2.   Dalam perjalanan sebuah sinar, jika sinar tersebut menabrak suatu permukaan, dapat terjadi tiga hal tergantung pada jenis permukaan yang ditabrak, yaitu penyerapan, pemantulan, dan pembiasan. Sebuah permukaan dapat memantulkan semua atau sebagian dari sinar, baik ke satu atau banyak arah. Permukaan tersebut juga dapat menyerap sebagian dari sinar, mengurangi intensitas sinar yang terpantul atau terbias. Jika permukaan tersebut mamiliki sifat tembus cahaya (transparency/translucent) maka permukaan itu akan membiaskan sebagian sinar  dan menyerap sebagian atau semua spektrum sinar, sehingga dapat mengubah warna sinar.

Namun perlu diperhatikan bahwa ada perbedaan mendasar antara konsep diatas dengan ray tracing. Pada ray tracing, umumnya sinar berasal dari mata pengamat, sedangkan pada kenyataannya sinar selalu berasal dari sumber cahaya. Karena itu ada dua jenis ray tracing, eye-based dan light-based. Eye-based adalah ray tracing dimana sinar berasal dari mata pengamat, sedangkan pada light-based ray tracing, sinar berasal dari sumber cahaya.

Algoritma Ray Tracing

Sebelum membahas algoritma ray tracing, ada beberapa hal penting yang harus kita perhatikan :

1.   Tiga efek umum dalam ray tracing adalah pemantulan, tembus cahaya, dan bayangan.

2.   Ray tracing adalah fungsi rekursif.

            Setiap sebuah sinar berpotongan dengan sebuah permukaan (disebut juga tabrakan), terjadi rekursi. Dari titik perpotongan tersebut, satu atau lebih sinar dibuat untuk menentukan objek apa yang terpantul di titik itu (jika memantulkan cahaya), objek apa yang terlihat melalui titik itu (jika tembus cahaya), sumber cahaya mana saja yang dapat terlihat dari titik itu (untuk menentukan bayangan), dan lain-lain.

            Basis dari fungsi ray tracing ini adalah batasan dimana sinar berhenti bergerak. Basis-basis yang umum digunakan diantaranya :

      a. Jika tidak berpotongan dengan objek maka warna yang dihasilkan adalah warna latar belakang

      b. Jika objek yang berpotongan terdekat adalah sumber cahaya maka warna yang dihasilkan sesuai warna cahaya

      c. Jika jumlah pantulan melewati batas pemantulan maka sinar berhenti bergerak

      d. Jika jarak sinar dari layar melewati jarak maksimum maka sinar berhenti bergerak

 3.   Sinar

            Sinar yang digunakan dalam ray tracing adalah sebuah vektor. Persamaan sebuah sinar dapat ditulis sebagai :

            S + tD                                                 S = titik sumber sinar (x,y,z)

                                                                        t = panjang sinar

                                                                        D = arah sinar (dalam vektor satuan)

 4.   Fungsi Perpotongan

            Untuk menentukan apakah sebuah sinar berpotongan dengan objek, diperlukan sebuah fungsi perpotongan. Fungsi ini dibuat spesifik untuk setiap jenis objek, misalnya bola atau poligon. Sebagai contoh, kita akan membuat fungsi perpotongan dengan bola.

            Persamaan bola pada ruang 3D :

                  (x-a)2 + (y-b)2 + (z-c)2 = r2                 (x,y,z) adalah titik pada bola

                                                                                    (a,b,c) adalah pusat bola

            Substitusi x,y, dan z pada persamaan bola dengan persamaan sinar :

                  ((S.x+t(D.x))-a)2 + ((S.y+t(D.y)-b)2 + ((S.z+t(D.z)-c)2 = r2

                Agar lebih mudah membaca rumus diatas maka kita lakukan substitusi :

                  A = (D.x)2 + (D.y)2 + (D.z)2

                  B = 2. ((D.x)(S.x-a) + (D.y)(S.y-b) + (D.z)(S.z-c))

                  C = ((S.x-a)2 + (S.y-b)2 + (S.z-c)2) – r2

                Didapat persamaan kuadrat :

                  At2 + Bt + C=0

t bisa didapat dengan menyelesaikan persamaan kuadrat diatas:

      t = (-B ± sqrt(B2-4AC))/2A

Jika t adalah bilangan real, maka sinar berpotongan dengan bola. Jika tidak, maka sinar tidak berpotongan dengan bola.

 5.   Pemantulan


Gambar 2. Pemantulan pada ray tracing

            Jika permukaan yang ditabrak sinar adalah permukaan yang memantulkan cahaya seperti cermin, ray tracer harus menentukan warna titik perpotongan tersebut dengan memperhitungkan warna permukaan dan warna yang terpantul pada titik tersebut. Hal itu dilakukan dengan menentukan arah sinar pantulan dan membuat sinar baru yang bergerak sesuai arah tersebut.

            Persamaan untuk menentukan arah sinar pantul :

                  P = 2*(N.(-D))*N +D                   N adalah vektor normal permukaan

                                                                        D adalah arah sinar

6.   Tembus cahaya

            Tembus cahaya memiliki sifat yang mirip dengan pemantulan, tapi sinar tidak dipantulkan pada permukaan, melainkan dibiaskan di dalam objek yang bersangkutan. Arah sinar bias ditentukan berdasarkan indeks bias benda tersebut, jumlahnya bisa lebih dari satu atau tidak ada sama sekali. Sinar baru akan dibuat dengan arah sinar bias.


Gambar 3. Pembiasan pada ray tracing

            Persamaan untuk menentukan arah sinar bias :

                  T = ((n1/n2)(N.I) – sqrt(1 - (n1/n2)2 . (1 – (N.I)2) ) ) . N – (n1/n2).I

                  T adalah arah sinar bias

                  n1 adalah indeks bias material awal

                  n2 adalah indeks bias material objek

                  I adalah sinar awal

                  N adalah vektor normal permukaan

 7.   Bayangan


Gambar 4. Pengecekan bayangan pada ray tracing

            Untuk menentukan apakah titik perpotongan dengan permukaan berada dalam suatu wilayah bayangan dilakukan pemeriksaan antara titik tersebut dengan semua sumber cahaya. Hal ini dilakukan dengan membuat sinar-sinar baru dari titik ke sumber cahaya. Jika ada objek diantara titik dan sumber cahaya, maka titik tersebut tidak akan mendapat cahaya dari sumber yang bersangkutan, dengan kata lain, titik tersebut berada dalam bayangan. Contoh dapat dilihat pada gambar 4 diatas, titik pada objek 1 mendapat bayangan dari sumber cahaya 2, dan mendapat cahaya dari sumber cahaya 1.

Dari semua informasi diatas kita dapat membuat sebuah algoritma pseudocode untuk ray tracing :

Ada pertanyaan atau komentar? Silahkan tulis di komentar :D

 

Monday, April 29, 2013

[Game Design] Improving Frogger

Frogger adalah game tentang seekor katak yang ingin menyebrang jalan. Gameplaynya cukup sederhana, si katak bisa bergerak empat arah (kanan, kiri, atas, bawah) lalu ada jalan beberapa jalur yang perlu dilewati si katak untuk menyelesaikan level. Rintangan dalam game cukup sederhana, yaitu berbagai mobil dengan berbagai bentuk dan kecepatan, dan di level-level berikutnya rintangan bertambah bukan hanya jalan dan mobil tapi juga sungai dan bongkahan kayu. Gameplay akan berubah saat di sungai, karena kita bukannya menghindari objek-objek (yang rata-rata berbentuk kotak) yang bergerak tapi justru mengatur waktu untuk lompat ke atasnya, dan jika kita gagal dan mendarat di air, kita harus mengulang level yang bersangkutan.

Frogger

Oke, kita berhenti dulu sejenak, katak jatuh ke air dan game over? Sebenarnya bagian ini kurang masuk akal karena seekor katak akan dengan mudah berenang sampai tepian sungai satunya. Improvement? Mungkin kita buat karakter kataknya menggunakan tuxedo dan bermaksud menghadiri pesta mewah di kota. :)

Frog in a tuxedo

Selain versi klasik di console jadul, Frogger juga muncul di console terbaru seperti 3DS, berjudul Frogger 3D. Pada game ini gameplay Frogger sudah dikembangkan menjadi lebih banyak variasi. Pada video trailernya kita bisa melihat kalau ada bagian permainan di mana si katak sedang berada di atas mobil box dan harus menghindari papan petunjuk arah di jalan raya.

Pengembangan gameplay Frogger ini juga bisa ditemukan di dalam game Mass Effect, yaitu saat akan melakukan hacking. Dapat dilihat pada screenshot gamenya, konsep gameplay Frogger dimana pemain harus 'menyeberangi lalu lintas' untuk mencapai tujuan. 'Jalan' pada minigame ini dibuat melingkar, ini lebih menguntungkan untuk pemain karena pemain dapat melakukan timing dan dapat menebak kapan jalur kosong akan terbentuk. Kelebihan lainnya adalah pemain tidak akan merasa dicurangi algoritma random karena dia dapat melihat semua pergerakan rintangannya, berbeda jika rintangan muncul dari luar layar seperti pada game Frogger yang asli, pemain hanya bisa menebak kira-kira akan muncul rintangan dari mana. Satu kelebihan lain dengan gameplay dengan rintangan melingkar seperti ini adalah pemain lebih condong berstrategi dengan mempertimbangkan gerakan dan kecepatan rintangan daripada bergantung pada reaksi/refleks saat ada rintangan yang bergerak.  

modern frogger

Adakah game lain yang menggunakan konsep Frogger yang kamu tahu? Tulis di komentar ya!

Friday, April 26, 2013

Low Poly vs High Poly 3D Model

Definisi
Low poly dan high poly adalah istilah yang biasa digunakan untuk menggambarkan jumlah poligon (atau triangles) yang membentuk suatu model 3D. Tidak ada patokan baku berapa jumlah poligon yang harus dimiliki suatu model untuk masuk kategori low atau high poly, hanya saja secara umum model low poly memiliki poligon yang jauh lebih kecil daripada model high poly, biasanya di kisaran ribuan atau 4 digit. Sedangkan model high poly bisa mencapai puluhan bahkan ratusan ribu poligon dalam satu model.
Apa bedanya?
Jumlah poligon akan mempengaruhi beberapa hal:
  1. Kualitas model saat dirender in game.
    Jumlah poligon yang lebih banyak akan membuat sebuah model terlihat lebih 'mulus' dibandingkan model dengan jumlah poligon lebih rendah. Contoh paling sederhana bisa kita lihat perbandingan antara karakter beberapa game Final Fantasy  (Cloud FFVII, Squall FFVIII, Tidus FFX, dan Lightning FFXIII).
    Cloud FFVIISquall FFVIIITidur FFXLighting FFXIII

    Rata-rata game console saat ini dapat menangani game dengan jumlah poligon jauh lebih banyak daripada jaman dulu, terutama dengan peningkatan dari prosesor, memory, dan hardware graphic yang bersangkutan.
  2. Performa game saat merender model, terutama untuk jumlah yang banyak.
    Rendering adalah proses menampilkan model 3D ke layar dalam sebuah aplikasi atau game, dengan cara mengolah informasi yang dimiliki model-model 3D dan informasi pendukungnya (sumber cahaya, efek kamera, dll) untuk menghasilkan tampilan 3D yang meyakinkan.  http://en.wikipedia.org/wiki/Rendering_(computer_graphics) Proses rendering ini bukan hanya memproses per model, bahkan pada dasarnya akan dilakukan per permukaan poligon. Karena itu, semakin banyak poligon yang digunakan, proses rendering pun akan semakin lambat.
Pakai model yang mana untuk game 3D saya?
Game umumnya menggunakan teknik real-time rendering, yaitu proses rendering dilakukan tiap frame, atau sekitar 30 kali per detik. Dengan teknik ini, proses rendering akan sangat mempengaruhi performa game kita, walaupun dalam game masih  banyak proses yang perlu dilakukan, misalnya collision detection, game logic, AI, dll. Berbeda dengan animasi untuk film atau cutscene (adegan) in-game yang umumnya menggunakan teknik pre-rendering, yaitu merender ke dalam suatu file terpisah yang nantinya akan ditampilkan ke pengguna dalam bentuk film. Dengan menggunakan pre-rendering, pengguna hanya akan melihat hasil akhir sesuai dengan jumlah waktu adegan yang bersangkutan, tanpa dipengaruhi prosesnya, padahal sebuah film 3D pendek sekitar 5 menit saja bisa membutuhkan waktu pre-rendering selama berjam-jam.
Model high poly akan membutuhkan waktu yang lebih lama untuk dirender, karena jumlah poligonnya lebih banyak, lebih banyak pula waktu yang dibutuhkan untuk memproses semua poligon tersebut. Model seperti ini lebih cocok untuk animasi yang membutuhkan detail dan kualitas yang sangat tinggi. Sedangkan model low poly akan jauh lebih cepat di render, dan untuk pemrosesan seperti collision detection, physics simulation, dan proses-proses lain yang membutuhkan informasi model 3D dalam game, akan membutuhkan waktu yang lebih cepat dibandingkan model high poly, sehingga lebih umum digunakan dalam game.
Raiden 3, contoh game dengan processing model 3D vs peluru yang intensif
Walaupun begitu, tetap perlu kita sesuaikan dengan kebutuhan game kita. Jika tidak terlalu membutuhkan pengolahan informasi model 3D, misalnya game point and click, dimana jika kita menekan sebuah trigger maka akan dijalankan suatu animasi yang sudah ditentukan, maka kita bisa saja menggunakan model high poly. Tapi jika game kita akan mengolah informasi model 3D tersebut sebagai bagian dari gameplay, misalnya game First Person Shooting, dimana tiap peluru akan diperiksa apakah mengenai seorang pemain, dan titik tabrakan model pemain dan peluru akan mempengaruhi jalannya permainan (apakah akan terjadi headshot, mengenai tangan sehingga pemain tidak bisa menggunakan senjata, atau mengenai kaki sehingga pemain menjadi lebih lambat, dst) akan jauh lebih menguntungkan jika kita menggunakan model low poly.

Tapi kalau pakai low poly model artinya kualitas game saya lebih jelek dong?
Ada beberapa hal yang bisa kita lakukan untuk membuat kualitas game kita lebih bagus dari sisi grafis walaupun kita menggunakan model low poly. Beberapa platform (terutama console dan PC, karena memiliki hardware lebih canggih) memiliki fitur-fitur yang dapat kita gunakan:
  1. Bump mapping dan normal mapping
    Bump map dan normal map adalah suatu file gambar yang bisa digunakan sebagai informasi tambahan selain file tekstur dalam merender sebuah model 3D. Dua file ini akan digunakan sebagai informasi kedalaman yang akan diperhitungkan dalam merender bayangan di suatu permukaan objek. Dengan teknik ini, kita bisa membuat efek seperti relief pada tembok batu menggunakan model tembok yang sebenarnya datar.
    <gambar tile bump mapped>
  2. Post processing menggunakan shader
    Shader adalah teknologi yang digunakan dalam proses graphic rendering secara umum, tapi penggunaannya luar biasa banyak (sebenarnya bump mapping dan normal mapping adalah contoh implementasi shader yang sudah dihandle di tingkat rendering library atau bahkan pada tingkat hardware). Kita bisa membuat efek-efek tembahan menggunakan shader, misalnya membuat efek motion blur, bloom, dan masih banyak lagi. Tapi untuk menggunakan shader ini kita harus mempelajari bahasa shader, biasanya HLSL atau GLSL, dan konsepnya cukup berbeda dari bahasa pemrograman biasa.
Ada pertanyaan atau komentar? Tulis saja di bawah :)
 

Thursday, April 18, 2013

5 Tips agar Inbox Email kita menjadi productivity tool

Email adalah media yang sering digunakan untuk berkomunikasi terutama dalam dunia kerja. Keuntungan utama yang bisa didapat dengan menggunakan email dibanding media komunikasi lain seperti voicecall atau chat adalah komunikasi akan terdokumentasi. Walaupun masih ada kekurangan, terutama dari segi waktu, email bukanlah media komunikasi yang real-time, jadi kalau kita butuh respon cepat tidak bisa mengharapkan email. Bahkan kadang email pun bisa saja tidak dibalas dengan alasan : "Oh, maaf, saya nggak liat, tenggelam di inbox he he" :|

Ini ada beberapa tips penggunaan email yang saya terapkan selama ini agar penggunaan email bisa lebih produktif.

  1. Zero Inbox.
    Pastikan inbox kita kosong, hapus atau archive semua email kita dari inbox. Tapi pastikan kita melakukan satu dari tiga hal berikut: follow up semua email yang membutuhkan respon kita, hapus email yang sudah tidak relevan, tandai email yang masih on-progress (misalnya menunggu respon dari orang lain). Dengan Inbox yang kosong, kita bisa memastikan tidak akan ada email yang terlewat, selama kita bisa konsistem melakukan tiga hal tadi.
  2. Gunakan label dengan bijak.
    Untuk setiap email yang penting, pasti akan saya beri label atau tag. Ada dua label utama yang saya gunakan: ACTION untuk email-email yang perlu respon atau follow up dari saya, dan HOLD untuk semua email yang masih menunggu respon dari orang lain (Terutama untuk email yang saya kirim). Pentingnya untuk menggunakan label HOLD ini adalah agar tidak ada komunikasi yang terhambat karena pihak lain.

    Secara tidak langsung dua label itu membuat inbox saya menjadi sebuah to do list. Jika ada email yang sudah berhari-hari tidak direspon rekan saya, saya bisa kirim email reminder atau ingatkan via media komunikasi lain (mungkin yang bersangkutan jarang buka email).
  3. Gunakan multiple inbox
    Multiple Inbox adalah salah satu fitur pada Gmail Labs, menyediakan beberapa inbox yang akan menampilkan email dengan kondisi tertentu, dalam bentuk search. Saya menggunakan multiple inbox untuk menampilkan 3 hal, email dengan label ACTION yang harus saya balas, email dengan label HOLD untuk memastikan semua komunikasi yang saya lakukan ada responnya, dan email yang saya mute, biasanya untuk milis agar kalau orang lain di milis berdiskusi, notifikasi email baru tidak akan masuk ke hitungan inbox saya.
  4. Gunakan filter sebaik mungkin
    Saya menggunakan filter untuk beberapa jenis email, misalnya email dari third party software sebagai reminder, saya buat agar skip inbox dan langsung diberi label ACTION. Atau untuk email dari diri sendiri (biasanya untuk mengirim file dari handphone yang tidak bisa sinkron via Dropbox atau Skydrive).
  5. Unsubscribe dari milis komunitas atau milis iklan. 
    Hal sederhana yang mungkin lupa dilakukan orang, jika memang email milis tidak pernah kita baca atau bahkan tidak pernah buka, lebih baik kita unsubscibe saja daripada memenuhi inbox kita, dan menutupi email-email yang sebenarnya penting.

Itu beberapa tips yang bisa saya bagikan :) Ada hal lain yang kalian lakukan dengan email agar lebih produktif? Tulis di komentar ya :D

Tuesday, April 16, 2013

[Game Design] Improving Minesweeper

Minesweeper adalah salah satu game klasik yang populer karena by default terinstall di beberapa versi Windows. Game ini memiliki gameplay yang khas, dimana pemain harus bisa menemukan bom berdasarkan petunjuk-petunjuk pada area permainan. Tiap petunjuk memberi tahu pemain ada berapa bom di sekitar kotak yang bersangkutan.

Minesweeper klasik

Untuk membuat minesweeper sebenarnya cukup sederhana, karena kita cukup membuat data array yang berisi kode bom atau nilai petunjuk, tapi ada beberapa hal yang menarik yang perlu diperhatikan jika kita ingin membuat ulang game minesweeper ini:

  • Saat mengacak posisi bom, pastikan tidak ada bom yang menumpuk di satu kotak yang sama, karena akan menghasilkan jumlah bom yang berbeda dengan target pada suatu level
  • Untuk menghitung nilai-nilai petunjuk jumlah bom di tiap kotak, daripada kita loop menggunakan nested loop untuk setiap kotak (dan untuk setiap kotak tersebut kita periksa 8 kotak tetangganya), akan jauh lebih cepat jika kita loop berdasarkan jumlah bom lalu tiap kotak tetangga dari bom itu nilai petunjukknya ditambahkan
  • Implementasi untuk fitur combo atau chain reaction yang terjadi saat seorang pemain membuka sebuah kotak kosong perlu dibuat dengan hati-hati, jangan menggunakan rekursif karena beresiko menghabiskan memory pada mobile game. Buatlah dengan menggunakan iterasi terhadap list daftar kotak yang perlu kita buka, setiap 'rekursi', kita cukup menambahkan kotak-kotak yang perlu dibuka ke daftar kotak tersebut. Hal ini juga akan mencegah kita membuka kotak yang sudah terbuka dan menghemat proses dalam algoritma tersebut.

Hal-hal di atas saya pelajari saat mencoba membuat ulang minesweeper dalam suatu event workshop. Moral of the story: Bahkan dalam game klasik seperti Minesweeper tetap ada hal menarik yang bisa kita pelajari :D

Apa yang bisa kita lakukan untuk mengembangkan gameplay minesweeper? Sudah ada beberapa contoh pengembangan minesweeper, dan kurang lebih ada dua kategori besar:

  1. Mengembangkan dari bentuk tile/grid pada minesweeper
    Bentuk dasar tile pada minesweeper adalah kotak, sehingga jumlah maksimum tetangga yang bisa dimiliki adalah 8. Dengan mengubah bentuk tile menjadi bentuk lain, kita bisa mengubah jumlah tetangga yang dimiliki sebuah tile. Contohnya adalah dengan mengubah jadi segitiga dengan jumlah tetangga 3, atau segi enam dengan jumlah tetangga 6 (hanya tetangga yang menempel).
     
  2. Mengembangkan gameplay dengan tema lain
    Contohnya Mamono Sweeper, game ini mengembangkan minesweeper dengan memasukan karakteristik game RPG, dimana kita memiliki karakter yang memulai dari level 1 dan akan meningkat berdasarkan jumlah musuh yang kita kalahkan. Musuh menggantikan peran bom, dan bedanya musuh di sini memiliki level, semakin tinggi level musuh semakin sulit kita kalahkan. Musuh dengan level seperti ini mirip dengan contoh lain dimana dalam satu kotak bisa terdapat lebih dari satu bom.

Pengembangan mana kah yang menurut kalian paling menarik?

 

Wednesday, April 10, 2013

Imagine Cup - Kodu Challenge

Ada berita menarik pagi ini, ternyata tahun ini Imagine Cup punya kategori kompetisi untuk Kodu Game Lab :D Buat saya ini berita bagus karena beberapa waktu yang lalu Microsoft mengumumkan kalau mereka sudah tidak melanjutkan dukungan untuk XNA. :(
Kodu Challenge
Imagine Cup adalah salah satu cerita yang sering saya sampaikan dalam sejarah Agate Studio, para founder Agate Studio pernah lembur satu bulan untuk membuat 3 game (Wish!, Blank!, dan Farewell Night) untuk mengikuti Imagine Cup. Waktu itu yang dipikirkan adalah "Untuk memperbesar peluang menang, kita submit game lebih banyak :D". Walaupun tidak berhasil memenangkan kompetisi itu, proses pembuatan tiga game itu sudah memberi banyak pengalaman berharga untuk founder Agate Studio.
Walau saya sendiri belum pernah membuat satu game penuh menggunakan Kodu Game Lab, tapi Agate Studio pernah mengadakan pelatihan Game Dev untuk anak-anak. Lucunya, yang datang jadi peserta bukan hanya anak-anak, bahkan mahasiswa sampai orang dewasa pun tertarik ikut :D
Kodu Challenge ini dibuka mulai 19 Maret sampai 17 Mei. Salah satu teman saya berkomentar:
"Kayaknya udah telat Pe"
"Kok telat? Kan sampai Mei"
Ternyata yang telat umur kami... :|

Jadi yang punya Adik atau teman game developer cilik silahkan ikutan kompetisi ini! :) Kalau mau tanya-tanya tentang Kodu juga boleh, tulis saja di komentar di bawah.

Tuesday, April 9, 2013

[Game Design] Improving Pipe Dreams

Pipe Dreams adalah game klasik dimana kita harus menghubungkan sumber air dan drainase dengan cara membuat jalur pipa yang menghubungkan kedua tersebut.

Classic Pipe Dreams

Kita akan mendapat point yang lebih besar semakin panjang jalur pipa yang bisa kita buat. Untuk membuat jalur, kita hanya bisa memilih dari beberapa potongan pipa acak yang tersedia. Pada game versi klasik, air akan mengalir secara real time di saat yang bersamaan dengan kita menyusun jalur pipa.

Tingkat kesulitan pada game ini diatur dengan cara mengatur peluang kemunculan beberapa jenis potongan. Pada tingkat kesulitan yang mudah, potongan pipa berbentuk plus (+) akan lebih sering muncul dibandingkan pada tingkat kesulitan yang lebih sulit. Satu komponen lain untuk mengatur kesulitan adalah waktu yang tersedia untuk pemain dalam membuat jalur pipa, dalam hal ini adalah kecepatan air mengalir. Pengaturan tingkat kesulitan yang serupa juga dilakukan pada game tetris, yaitu dengan mengatur peluang munculnya balok lurus (|) dan mengatur kecepatan balok-balok bergerak ke bawah.

Pengembangan untuk gameplay Pipe Dreams ini bisa dilakukan dengan beberapa cara, dan beberapa sudah diimplementasi pada game lain.

Rocket Mania

Pada game Rocket Mania, kita juga membuat sebuah jalur dari titik awal ke titik akhir, namun dalam game ini kita membuat jalur untuk api, dan titik awal dan akhirnya lebih dari satu. Perbedaan utama dari game Pipe Dreams adalah untuk membuat jalur, kita tidak meletakkan potongan baru, tapi memutar potongan yang sudah ada di area permainan. Lalu saat sebuah jalur sudah dinyalakan, jalur tersebut akan menjadi kosong dan akan terisi oleh potongan yang ada di atasnya. Lalu akan muncul beberapa potongan acak lain dari atas area permainan untuk mengisi sisa tempat kosong di area permainan.

Tambahan berikutnya pada Rocket Mania adalah adanya combo jika saat potongan turun tercipta jalur baru dan jalur tersebut langsung menyala. Aspek ini bahkan dapat membuat pemain yang sudah mahir dapat memasukkan komponen combo ini menjadi bagian dari strategi permainan, dengan sengaja membuat lebih dari satu jalur yang dapat menyala dalam suatu combo untuk mendapatkan poin lebih besar lagi.

Pengaturan tingkat kesulitan pada gameplay ini kurang lebih sama dengan pada gameplay klasiknya, namun satu hal yang perlu diingat adalah perlunya sebuah algoritma untuk mendeteksi apakah sebuah konfigurasi potongan-potongan pada area permainan dapat membuat sebuah jalur atau tidak. Jika tidak mungkin terbentuk sebuah jalur, kita harus memberi pemain satu set potongan-potongan yang baru dan acak (dan dipastikan bisa tercipta jalur).

Pengembangan terakhir yang bisa dilakukan adalah dengan membuat pemain bukan memutar potongan pipa, tapi menukarnya dengan potongan pipa di sampingnya (atas, bawah, kiri, atau kanan). Untuk game seperti ini saya belum menemukan contohnya, tapi lebih terinspirasi pada tipikal game match three seperti Bejeweled.

Oke, pengembangan yang bisa saya lakukan hanya sejauh ini. Apakah kamu masih punya ide bagaimana mengembangkan game play Pipe Dreams ini? Game design manakah yang menurut kamu paling menarik untuk dimainkan? Silahkan tulis di komentar :D

Tuesday, April 2, 2013

Tips and ideas for using Evernote

Sejak punya akses terhadap smartphone yang memang smart, saya kembali mencoba menggunakan Evernote, cloud based document storing/sharing platform. Hal itu dilakukan karena task-list plus note-taking tools yang terakhir saya gunakan, Trello, tidak memiliki app khusus di WP8, hanya sebuah optimized mobile site (which is actually good, even have features that their iOS app didn't had). Sayangnya, mobile site tersebut tidak bisa diakses offline, alias butuh constant internet access to function.

Sejauh ini, Evernote for WP8 terasa cukup bagus buat saya, selain saya gunakan untuk mencatat hal-hal yang melintas di pikiran saya, Evernote juga saya gunakan untuk menyimpan berbagai artikel untuk dibaca di rumah (yang kebetulan belum terpasang internet :| ). Evernote Webclipper berguna kalau kita butuh akses offline (misalnya sering keluar jangkauan wifi gratis atau sekedar tidak punya internet).

Hanya satu saja kekurangan yang saya temui dari Evernote ini, untuk free user, ada kuota bulanan untuk penggunaan note sebanyak 60MB, dan saya hari ini tanpa sengaja menghabiskan lebih dari setengah kuota bulan ini =/ It all happens when I clipped several pages full of images for my reference...

Pro tip: jangan menggunakan evernote web clipper untuk menyimpan berbagai gambar menarik di internet, simpan linknya saja. Optimalkan kuota gratis yang dimiliki untuk sinkronisasi berbagai teks yang bermanfaat :)

Thursday, February 14, 2013

Pixar Pitch and #1GAM

Once upon a time __________. Every day, __________. One day __________. Because of that __________. Because of that __________. Until finally __________.

Ini adalah "Pixar Pitch", salah satu panduan untuk membuat elevator pitch, teknik menjelaskan sebuah konsep atau ide dalam waktu singkat (sekitar 30 detik sampai 2 menit). Konon katanya di Pixar, teknik ini digunakan untuk menjelaskan ide untuk film, kalau kita tidak bisa menjelaskan ide kita dalam waktu singkat, bagaimana kita berharap customer kita bisa menangkap tentang produk kita?


Walaupun panduan di atas condong ke arah ide film ala Pixar, konsep yang sama sepertinya bisa juga kita terapkan dalam membuat game design :) Dengan sedikit penyesuaian tentunya.

Kenapa game design?

Di akhir Januari lalu saya tertarik mencoba mengikuti #1GAM, atau One Game a Month. Sebuah gerakan untuk membuat game tiap bulan dalam rangka meningkatkan kemampuan kita sebagai game developer, baik secara teknis atau dalam kemampuan game design.

Walau seharusnya saya menghasilkan satu game tiap bulan, di tengah Februari ini saya belum membuat satu game pun, dan baru sebatas membuat sebuah game design yang nampaknya akan menarik untuk dibuat. Karena melihat Pixar Pitch di atas, saya pikir setidaknya saya bisa berlatih membuat game design pitch, dan semoga ada ide yang cukup menarik untuk dijadikan game :D

Let's try:
Plumber's Flowers
Once upon a time there is a plumber who loves flowers. Every day, he always takes care of his flowers. One day the city water supply system broke down, and the water pipe goes crazy. Because of that, all his plants aren't getting enough water and soon will be dead. Because of that, he must switch the underground water pipes around to give water supply for his plants. Until finally all his plants are healthy again and blooming all day long.
Semoga ini bisa saya lakukan tiap muncul ide game yang menarik :)

Friday, January 11, 2013

Plamo Video Tutorial: Pla-plate (styrene) basics

Tertarik memodifikasi plamo kamu dengan pla-plate atau styrene? (yang bahasa lokalnya itu plastik maket :) ) Ini ada video tutorial tentang penggunaan dasar pastik maket itu *Contoh yang dipakai sih plamo transformer, bukan gundam, tapi sama aja lah ya*


Ada yang tertarik belajar bareng modifikasi plamo? :) Atau kalau ada yang mau ngajarin saya boleh lho :P

Thursday, January 10, 2013

About Agile and Customer Focused

http://blogs.atlassian.com/2010/03/zynga_on_game_development_tools/

Zynga menggunakan agile development methodology, seperti yang dijelaskan QA Manager Zynga, Micah Figone di suatu interview.

Agile Development Methodology adalah metode pengembangan software yang seharusnya lebih 'lincah' dibandingkan metode tradisional seperti Waterfall (plan-build-test). Agile menggunakan iterasi proses plan-build-test-evaluate yang lebih singkat dibanding Waterfall, sehingga dapat lebih cepat beradaptasi dengan kondisi yang tidak sesuai rencana. Sebenarnya saya sendiri belum terlalu paham detail dari Agile Software development ini sendiri, walau sebenarnya beberapa konsep dari Agile Development sudah diadaptasi untuk diterapkan di Agate Studio.

Interview tersebut dilakukan oleh perusahaan yang membuat tools yang digunakan di Zynga untuk membantu proses planning-development-dan testing. Namun hal yang paling menarik perhatian saya bukanlah berbagai fitur canggih yang dimiliki tools yang bersangkutan, tapi mengenai salah satu bagian dari proses Agile Development.


Pada video penjelasan tools untuk membantu Agile Development tersebut, backlog (semacam daftar pekerjaan yang belum dikerjakan) dalam sebuah Agile Development bukanlah nama fitur, atau jumlah asset art yang perlu dibuat, namun suatu hal yang disebut user story. User story di sini adalah deskripsi pengalaman apa yang ingin kita berikan ke pada user, atau pengalaman apa yang ingin kita dapatkan saat menggunakan aplikasi atau game kita. Hal ini menarik karena biasanya milestone ditentukan berdasarkan % (persen) penyelesaian game tersebut, atau batas waktu, atau implementasi sebuah fitur besar. Dengan membuat tim bergerak sesuai user story yang ingin kita inginkan, maka game atau aplikasi tersebut akan lebih mendekati kebutuhan user.

Menurut saya, game lebih cocok untuk menerapkan sudut pandang development seperti ini, jangan lagi melakukan planning development berbasis fitur atau modul yang perlu dibuat. Kita ambil contoh sebuah game RPG, jika kita merencanakan fitur battle akan diimplementasi pertama, mungkin pemain belum bisa bergerak di peta, belum ada dialog saat battle, atau bahkan monster yang kita lawan masih berupa asset dummy atau placeholder.

Sedangkan jika sudut pandangnya adalah user story, misalnya kita ingin pemain bisa melawan monster random di peta dunia. Story seperti ini mungkin akan melibatkan modul battle, modul world map, sedikit tentang UI, sedikit tentang sistem karakter dan monster. Yang dipastikan di sini adalah saat seorang pemain memainkan game tersebut, dia akan mendapatkan key experience yang nantinya akan dihadapi pemain dalam game akhirnya, walaupun dinilai merupakan bagian kecil. Keuntungan dibanding model pada paragraf sebelumnya adalah kita dapat menguji experience pemain dalam memainkan game kita dan mendapat feedback lebih cepat tentang aspek non teknis seperti gameplay atau look and feel game tersebut.

Apakah ada yang pernah menggunakan metode Agile? Apakah pemahaman saya tentang Agile di atas sudah benar?

Wednesday, January 9, 2013

Top down goals strategy

Ajarin tentang top down goals & strategy dong..

Minggu lalu saya sempat ditanya oleh rekan saya di Agate, Dian, tentang top down goals dan strategy setting. Dia bilang yang dia lakukan masih lebih sering bottom up.
Oke, bedanya bottom up dan top down itu seperti apa?

Bottom up

Bottom up itu menentukan strategi kita berdasarkan kondisi kita sekarang dan apa yang kita punya, semacam memaksimalkan yang kita miliki.
Contohnya untuk divisi HR, mengoptimalkan sistem rekrutmen karena jumlah pelamar kerja per bulan meningkat adalah strategi yang baik untuk mengatasi masalah waktu yang terlalu banyak tersita untuk mengolah tumpukan lamaran kerja yang ada.

Top down

Sedangkan top down itu lebih ke menentukan apa yang kita perlu lakukan untuk mencapai suatu target yang kita tentukan, dalam kondisi belum tentu semua resource yang kita butuhkan sudah kita miliki.
Contohnya untuk divisi HR, anggapklah kita menargetkan untuk memaksimalkan jumlah crew di akhir tahun depan menjadi 50 orang dari kondisi sekarang 35 orang, kita perlu membuat strategi untuk merekrut 15 orang crew sepanjang tahun ini. Nah, jika ternyata dirasa kita memerlukan sistem baru yang lebih optimal untuk rekrutmen, kita rencanakan juga untuk membuat sistem itu tahun ini.

Jadi bedanya apa?

Masalah dengan bottom up strategy, walau memang bagus dan tepat guna, adalah berpeluang untuk tidak sesuai dengan kebutuhan divisi lain atau bahkan kebutuhan perusahaan. Dari contoh di atas, membuat sistem rekrutmen yang optimal mungkin bukan strategi yang baik kalau ternyata kapasitas crew sudah mencapai batas maksimum dan tidak berencana untuk merekrut dalam waktu dekat.
Sedangkan dengan top down strategy, bisa dipastikan kalau strategi tiap divisi akan sejalan dengan kebutuhan perusahaan. Dan jika ada halangan atau perubahan kondisi di tengah perjalanan, kita bisa mengubah strategi dengan tetap mengarah ke tujuan kita, seperti saat mengemudikan kendaraan.

Bisnis itu seperti menyetir, kalau ada masalah kita bisa pilih jalan lain tapi tetap mendekati ke tujuan akhir kita.

Jadi caranya bagaimana?

Untuk membuat top down strategy sederhananya seperti ini:
1. Tentukan target akhir kita. Bisa berdasarkan visi atau mimpi, bisa juga berdasarkan contoh perusahaan lain.
2. Cari tahu kondisi perusahaan kita seperti apa, sedetail mungkin.
3. Lakukan gap analysis. Cari tahu perbedaan antara kondisi kita saat ini dengan kondisi ideal yang kita inginkan.
4. Tentukan apa saja yang perlu kita lakukan atau miliki untuk mencapai kondisi idel yang kita inginkan.

Semoga berguna :) So, do you have a new target to achieve this year?

Tuesday, January 8, 2013

Does your game worth losing?

Beberapa hari yang lalu saya sempat melihat status seorang teman game developer, dia baru membaca interview dengan pembuat Dominion, kurang lebih statusnya seperti ini:
How to make a game become fun to losing player?1. Player lost, but they somehow think they actually win.2. Player lost, but get the feeling that they almost win.
Dia menyimpulkan itu mungkin dari potongan interview ini:
“Do you consider yourself as having a ‘game design philosophy’?”Well in general I aim for short games, with low downtime, minimized politics, variety, and interacting rules on cards.An example of an overall philosophy would be, it has to be fun to lose.
Menurut sudut pandang saya, kalau saat kita kalah kita merasa senang menunjukkan kalau game yang kita mainkan memang bagus. Tapi bukan berarti kita harus 'menipu' pemain yang kalah dengan membuat dia merasa hampir menang atau merasa menang. Kenapa saya pake kata 'menipu'? Karena praktek seperti itu setahu saya digunakan di permainan ketangkasan di kasino-kasino, untuk membuat orang yang bermain merasa hampir menang dan memilih untuk terus menghabiskan uang di mesin yang bersangkutan.


Menurut saya kunci untuk membuat pemain merasa senang walau kalah adalah membuat pengalaman bermain menjadi sesuatu yang menyenangkan untuk pemain. Err, semua game juga gitu kali... Yang penting di sini adalah eksekusinya. Contohnya Megic the Gathering, saking banyaknya kartu yang ada, dan dengan adanya berbagai format permainan, MtG mengakomodasi keinginan berbagai jenis pemain. Kalau saya pribadi senang proses membuat deck, terutama menggunakan kartu-kartu aneh atau yang jarang dipakai orang. Lalu saat main, sebenarnya tidak masalah kalau saya kalah, asal bisa mengejutkan lawan dengan deck yang unik atau combo yang heboh. :) *Di MtG bahkan sudah ada 'klasifikasi' untuk berbagai permain seperti ini, kapan-kapan saya bahas deh*
Contoh lain misalnya di game Catan, untuk menang kita perlu mengumpulkan victory points, tapi ada dua achievement (yang menambah victory points kita) yang cukup menantang untuk didapatkan, yaitu longest road dan largest army. Di beberapa sesi permainan bahkan saya tidak mengincar menang tapi justru mengincar dua achievement itu. :)
"Don't make games that makes people think they win when they are losing, make games that makes people think the time and money spend playing was worth it." - me 
Bagaimana dengan game yang kamu buat? Is it worth losing for? :)

Monday, January 7, 2013

Hidden Message in Magic the Gathering: Guilds of Ravnica

Ternyata ada pesan tersembunyi di beberapa kartu Magic di dua set terakhir, Return to Ravnica dan Gatecrash. Ada pesan tersembunyi yang terdapat pada flavor text alias kata-kata mutiara di kartu-kartu land tipe Gate di dua set ini (kebetulan ada 10, satu untuk masing-masing Guild di Ravnica).
Bagaimana Wizards of the Coast (WotC) menyembunyikan pesan ini? Ternyata ada beberapa huruf yang posisinya bergeser ke atas beberapa pixel.

Yap, beberapa PIXEL D:


Gambar di atas kira-kira ukuran kartu Magic biasa, kalau tidak bisa melihat huruf-huruf yang dimaksud klik saja untuk versi besarnya, sudah saya bantu tandai dengan garis merah.
Di forum mtgsalvation, pesan ini sudah dipecahkan, isinya begini:

Azorius: Senate justice foundation Ravnican
Izzet: those release their creations
Rakdos: Enter indulge maagain
Golgari: starving rest Ravnica
Selesnya: united open and
Simic: and comprehend perfection
Gruul: enter leave the shackles behind
Boros: merciful hearts cries
Orzhov: wealth security for
Dimir: mastermind spies lies deception

Azorius: TIFI
Izzet: HLRC
Rakdos: EDAA
Golgari: GSV
Selesnya: UON
THE GUILDS OF RAVNICA

Orzhov: WEYO
Dimir: ISET
Gruul: LTAH
Boros: LRCE
Simic: DOHR
WILL DESTROY EACH OTHER




"The guild of Ravnica will destroy each other"


Yang lucu, thread pertama yang membahas tentang pesan rahasia ini beberapa bulan yang lalu sudah dihapus oleh moderator karena dianggap mengada-ada :)

Lalu apa hebatnya? Para fans terbukti sangat hebat bisa memecahkan easter egg seperti ini dalam waktu singkat (Gatecrash saja baru akan rilis akhir Januari ini), hanya berdasarkan gambar yang didapat dari spoiler season Gatecrash. Hebat yang berikutnya adalah milik WotC, karena bukan hanya membuat easter egg untuk kartu-kartu bahasa Inggris, mereka membuat pesan ini di SEMUA KARTU MAGIC VERSI BAHASA ASING. D:

Lihat sendiri contohnya di kartu guildgate versi Jerman ini:

Buat yang tidak bisa bahasa asing, kira-kira pesan versi asingnya seperti ini:
Jerman: "Die Gilden von Ravnica" ...
Spanyol: "Los gremios de Rávnica" ...
China: 拉尼卡此时空的十公会 ... 终将同归于尽 -> The plane of Ravnica's ten guilds ... will eventually perish together
Jepang: やるどのみここのじっこのぎるど ... それぞれがたがいをほろぼしおう

Friday, January 4, 2013

[WIP] Zaku 1.0 Part 6: Hand-painting

Setelah modifikasi kecil-kecilan, saatnya proses yang paling panjang, yaitu hand-painting untuk mengubah color scheme Zaku yang asalnya pink menjadi merah. Untuk cat yang bisa digunakan untuk mewarnai plamo ada tiga jenis berdasarkan bahan/pengencernya, laquer based, enamel based, acrylic (water based). Perbedaan antara tiga jenis cat ini selain dari pengencernya (atau biasa disebut thinner), juga dari faktor kekuatannya (laquer > acrylic > enamel).
Untuk mengaplikasikan cat ke plamo juga caranya bermacam-macam, bisa hand-paint pake kuas, pake spray can langsung pakai, atau pake airbrush+compressor. Saya pilih opsi hand-paint dengan acrylic paint karena paling murah, dan paling tidak beracun dari ketiga jenis cat yang saya sebutkan sebelumnya. Untuk laquer dan enamel, uap thinnernya juga sudah mengandung bahan berbahaya. Sebelum punya fasilitas yang lengkap, saya lebih nyaman dengan yang tidak beracun :)
Kekurangan cat acrylic water based ini adalah butuh waktu yang paling lama untuk 'kering' atau pigmennya menempel pada plastik, selain itu lapisannya cukup mudah terkelupas jadi membutuhkan top coat tambahan (sebaiknya glossy agar bisa ditambahkan panel line). Karena prosesnya lama, bagian painting mungkin akan diteruskan di part-part berikutnya:
Sementara ini saya masih puas dengan warna merah yang dihasilkan, tapi untuk menyelesaikannya masih butuh top coat dan proses panel lining dengan cat enamel.

Link WIP sebelumnya: part 1, part 2, part 3, part 4, dan part 5.

Thursday, January 3, 2013

[WIP] Zaku 1.0 Part 5: Pla-plating (canceled)

Untuk kali ini intermezzo saja, awalnya ingin modifikasi plamo dengan pla-plate (lempengan plastik tambahan), tapi karena ingin fokus di percobaan painting, pla-plating ini sekedar coba-coba saja.
Rencananya saya akan coba-coba lagi pla-plating untuk WIP plamo kedua saya nantinya.

Link WIP sebelumnya: part 1, part 2, part 3, dan part 4.

Wednesday, January 2, 2013

[WIP] Zaku 1.0 Part 4: Seamline Removal

Untuk kali ini update yang ringan-ringan saja, menangani seamline. Seamline itu celah atau garis yang muncul dari dua keping plastik yang menempel pada model, misalnya bagian tangan luar dan dalam kan menghasilkan dua celah di depan dan belakang. Untuk mengatasinya dengan menggunakan resin cement, yang berguna untuk melelehkan plastik dan 'menggabungkan' dua keping plastik itu sehingga menyatu dan tidak ada celahnya lagi.
Link WIP sebelumnya: part 1, part 2, dan part 3.