Monday, 28 February 2011

Tile Map dengan SDL (4)

"001, 002, 003, ... 999" + ".mymap"



Seperti janji saya sebelumnya, maka langsung saja kita download saja program dan source codenya pada link berikut ini.

Link : http://www.ziddu.com/download/13984636/49_Tile_Map.v0.2.7z.html
Size : 371.05 KB
Control : Use Arrow Up and Down.

Perhatikan fungsi diatas fungsi utama (main), yaitu 'bool setPolaTile(int _nomor)'. Sesuai namanya ia akan mengatur pola dari ubin-ubin yang akan menghias peta kita . Didalam fungsi ini kita akan memanggil file yang telah ditentukan, lalu nilai-nilai dalam file tersebut dimasukkan ke dalam array pola (yang sekarang telah menjadi variabel global). Terlihat bahwa parameter yang digunakan bertipe int atau bilangan bulat, ini untuk memudahkan pemanggilan file. Contoh 'setPolaTile(15)', yang berarti memanggil file peta ke 15 (015.mymap). Kenapa ada nolnya? seperti '009.mymap', '015.mymap', dst. Dibuat agar lebih rapi saja hehehe (atau malah lebih ribet. ) . Sebelum kita 'asal' panggil file dengan ifstream, terlebih dahulu nilai dari parameter fungsi (var _nomor) kita konversikan karena masih bertipe bilangan bulat. Sedangkan pengisian lokasi file pada ifstream harus bertipe string atau const char*. Dan tipe data stringstream berkerja disini, ia akan mengonversikan angka ke string atau sebaliknya.

Selanjutnya dengan variabel _namaFile, kita tampung terlebih dahulu string yang berisi lokasi file. Dengan inisialisasi awal berisi "Map/" menandakan file yang dituju ada dalam suatu folder, yaitu folder Map. Selanjutnya kita pastikan keberadaan file ini eksis atau tidak dengan pengecekkan kondisi '!= NULL', jangan sampai ia kurang pergaulan karena ketidak eksis-annya . Setelah file ditemukan lalu memasukkan nilai-nilainya ke array pola. Ibarat seorang turis yang berkunjung turis ini harus diperiksa terlebih dahulu isi kopernya, jangan bertanya apa yang harus dilakukan jika dia nggak bawa koper . Begitu juga dengan nilai-nilai ini, harus diperiksa kebenarannya:


   //jika nilainya tidak sesuai
   _file >> pola[c][d];
   if( pola[c][d] < 0 ) pola[c][d] = 0;
   else if( pola[c][d] > MAX_TILE ) pola[c][d] = MAX_TILE-1;

Kode diatas juga untuk mencegah nilai-nilai dasyat karena jumlah nilai pada file terlalu sedikit atau mengandung karakter (yang umumnya diterjemahkan dengan angka-angka besar). Serta jika file hanya memiliki beberapa nilai saja:

Gambar 1. Ada yang salah dengan file ini!

Hmm, dari percobaan yang dilakukan ternyata program akan berhenti mentransfer nilai-nilai tersebut jika kondisinya seperti diatas. Misal jika ditengah jalan ketemu si a atau berada pada ujung file padahal belum berakhir, maka tidak terjadi perpindahan nilai. Tetapi pengulangan tetap berlangsung sampai akhir (sebanyak TilePerbaris*TilePerkolom). Sehingga nilai yang digunakan masih nilai pada kondisi terakhir. Untuk mengganti file peta dapat menggunakan tombol panah atas dan bawah.

Untuk tata letak clip / potongan gambarnya sendiri, belum saya tata dengan rapi ( Maaf untuk kemalasan saya ). Jika teman-teman ada yang ingin menatanya dan menambah potongan gambarnya dan memposting link download atau semacamnya disini saya sangat berterima kasih, maju terus Programmer Indonesia!. Terakhir baru nyadar kalau source code cpp selama ini disertakan ternyata masih menggunakan judul artikel yang lama pada bagian komentar diawal (masih pakai yang "Efek Transparan pada Gambar") *dodol .

- krofz

Friday, 25 February 2011

Tile Map dengan SDL (3)

Agar Lebih Praktis.


Tulisan ini merupakan lanjutan dari:
Tile Map dengan SDL (1)
Tile Map dengan SDL (2)

Banyak kekurangan pada kode sebelumnya, salah satunya adalah saat kita menampilkan tile-tile tersebut:


...
   for(int c=0;c < TilePerkolom;c++){
      for(int d=0;d < TilePerbaris;d++){
         terapinGbr(d*ukuranTile,c*ukuranTile, tileSet, screen, &clipTile40x40[pola[c][d]]);
      }
   }
...

Dimana letak kesalahannya? Yaitu saat menampilkan nilai pada array pola[][]. Misalkan kita menampilkan potongan gambar (clipTile40x40) yang tidak sesuai. Seperti diketahui potongan ini dimulai dari angka 0 sampai 3 (berjumlah 4 potong). Apa yang terjadi jika nilainya dibawah 0 (-1,-2,dst) atau diatas 3 (4,5,dst)? Untungnya program masih dapat berjalan hanya saja potongan gambar ini menjadi aneh . Sehingga kita perlu memperbaiki kode tersebut:


...
   for(int c=0;c < TilePerkolom;c++){
      for(int d=0;d < TilePerbaris;d++){

         int _temp = pola[c][d];
         if( pola[c][d] < 0 ) _temp = 0;
         else if( pola[c][d] > MAX_TILE ) _temp = MAX_TILE-1;

         terapinGbr(d*ukuranTile,c*ukuranTile, tileSet, screen, &clipTile40x40[ _temp]);
      }
   }
...

Dapat dilihat bahwa jika nilainya tidak sesuai, maka akan disesuaikan (ya iyalah... kalau nggak error lagi ntar ). Intinya kita mencegah nilai-nilai yang tidak semestinya yang dapat menyebabkan program 'Crash'. Ini baru dari sisi keamanan nilai, bagaimana dengan sisi yang lainnya? Misal kemudahan pengembangan Map (peta). Disini jika kita ingin merubah nilai-nilainya maka perlu melakukan proses build ulang, atau nilainya berada pada tubuh program (secara Hardcore). Yang tentu kurang efisien, terlebih ketika melibatkan banyak library dan banyak perubahan tata letak gambar pada peta. Sehingga kita perlu sedikit modifikasi. Yang diperlukan adalah sebuah file yang menyimpan deretan nilai peta kita, seperti contoh file berikut ini (kita namakan 001.mymap):


2 2 1 1  2 3 1 1  2 1 1 1  3 3 1 1
2 1 1 1  2 3 1 1  2 1 1 1  3 3 1 1 
1 1 1 1  2 3 1 1  1 1 1 1  3 3 1 1 
1 1 1 1  2 3 1 1  2 1 2 1  1 1 1 3 
1 1 1 1  1 1 2 1  1 1 2 1  3 3 1 3 
1 1 1 1  2 3 1 1  2 1 1 1  3 2 1 1  

2 1 2 3  1 2 1 1  2 1 1 1  1 1 2 3 
1 1 1 1  1 1 1 1  3 1 1 1  1 3 1 1 
1 1 1 1  1 3 1 1  2 1 1 1  3 3 1 3 
3 3 1 1  2 1 1 1  1 1 1 1  1 3 1 1 
1 0 3 5  2 3 2 2  2 1 1 1  3 1 2 2 
0 1 3 3  3 3 1 1  3 1 1 1  3 1 1 1 

Dengan memanggil sebuah file tentu kita sudah dapat membuat kode-nya lalu menampilkan nilai-nilai dari file 001.mymap diatas dong? . Disini kita melakukannya secara Softcore, yaitu tanpa perlu build ulang source code. Dengan bermodalkan notepad kita sudah dapat merubah nilai-nilai diatas (jangan bingung dengan ektensi '.mymap' hehe..). Jika anda belum bisa maka akan kita bahas di tulisan selanjutnya hehehe... berikut program dan source codenya. Happy Coding!

- krofz
 

back to top

back to top