Menggunakan JSON pada Game Maker:Studio

Di posting pada tanggal  Sunday 17 April 2016





JSON (JavaScript Object Notation) adalah format pertukaran data yang ringan, mudah dibaca dan ditulis oleh manusia, serta mudah diterjemahkan dan dibuat (generate) oleh komputer. JSON juga bisa digunakan untuk merepresentasikan struktur data sederhana dan array asosiatif (objek).


Sebelumnya, kita telah mengetahui data struktur Ds lists dan Ds maps pada postingan kemarin. Materi kali ini masih berhubungan dengan dua data struktur tersebut.

JSON merupakan struktur data yang bisa digunakan dalam berbagai bahasa pemrograman. Hampir semua bahasa pemrograman mendukung penuh JSON dengan adanya fungsi-fungsi built-in seperti halnya GAME MAKER:STUDIO. JSON saat ini merupakan format data yang paling populer, sebelumnya format data XML yang sering digunakan.


JENIS JSON

JSON dibagi menjadi 2 jenis yaitu:

  • JSON OBJECT

    JSON OBJECT merupakan jenis JSON yang memiliki pasangan key dan value. Masih ingat Ds maps kan ? Struktur data JSON OBJECT memang sama dengan Ds maps. Di dalam Game Maker:Studio, apabila JSON OBJECT di-decoding maka hasilnya akan membuat sebuah Ds maps.


    JSON Object
  • JSON LIST

    JSON LIST atau disebut juga JSON ARRAY merupakan jenis JSON yang memiliki struktur ordered list seperti pada array 1 dimensi. Struktur data JSON LIST sama dengan Ds lists yang mana memiliki nomor index dan value-nya. Di dalam Game Maker:Studio, apabila JSON LISTS di-decoding maka hasilnya akan membuat sebuah Ds lists.


    JSON List

FUNGSI JSON

Di dalam Game Maker:Studio, fungsi JSON ada dua fungsi. Berikut adalah fungsi tersebut.

  • json_decode(string);

    Fungsi dari json_decode adalah untuk merubah format JSON menjadi data struktur. Fungsi ini memiliki satu argument berupa string.


  • json_encode(map);

    Fungsi dari json_encode adalah untuk merubah data struktur Ds maps menjadi format JSON. Fungsi ini memiliki satu argument yaitu id Ds maps yang dimaksud.


Untuk contoh penggunaan fungsi-fungsi di atas, akan dibahas pada point selanjutnya.


FORMAT JSON

Format JSON cukup mudah dipahami asalkan kita teliti karena format ini bersifat readable, maka penggunapun juga mudah untuk memanipulasi datanya.

Format JSON OBJECT adalah sebagai berikut.

{
  "nim": "88901", "nama": "Aldo", "umur": "18"
}

JSON OBJECT diawali dan diakhiri dengan tanda kurung "{}". Untuk penerapan di dalam Game Maker:Studio, bisa dicoba code berikut.

Create
json_str = '{"nim": "88901", "nama": "Aldo", "umur": 18}';
data_siswa = json_decode(json_str);
nim = data_siswa[? "nim"];
nama = data_siswa[? "nama"];
umur = data_siswa[? "umur"];
show_message("Nim= " + nim + "#Nama= " + nama + "#Umur = " + string(umur));

Format JSON LIST adalah sebagai berikut.

[
{ "nim": "88901", "nama": "Aldo", "umur": "18" },
{ "nim": "88902", "nama": "Rini", "umur": "17" },
{ "nim": "88903", "nama": "Endra", "umur": "18" }
]

JSON LIST diawali dan diakhiri dengan tanda kurung "[]". Pada dasaranya format JSON adalah " key ":" value " jadi tidak ada yang benar-benar berbentuk list. Pada contoh di atas adalah bentuk JSON OBJECT di dalam JSON LIST.

Untuk penerapan di dalam GAME MAKER:STUDIO, entah mengapa format JSON LIST di atas tidak bisa di-decode. Namun kita bisa merubahnya menjadi JSON OBJECT terlebih dahulu seperti code berikut ini.

Create
json_str = '[{"nim": "88901", "nama": "Aldo", "umur": 18},{"nim": "88902", "nama": "Rini", "umur": 17},{"nim": "88903", "nama": "Endra", "umur": 18}]';
fixed_json = '{ " data_siswa " :' + json_str + '}'; //Merubah ke JSON Object

data_all = ds_map_find_value(json_decode(fixed_json), "data_siswa");

for(i=0;i<ds_list_size(data_all);i++){
  data_current = data_all[| i];

  nim = data_current[? "nim"];
  nama = data_current[? "nama"];
  umur = data_current[? "umur"];

  show_message("DATA SISWA KE - " + string(i) + "#Nim= " + nim + "#Nama= " + nama + "#Umur = " + string(umur));
}

MENGAPA KITA MENGGUNAKAN JSON

JSON tujuan utamanya adalah untuk distribusi data. Data tersebut bisa berupa data table maupun data list. Tentu saja menggunakan JSON untuk membuat highscore atau penyimpanan data player tetap bisa dilakukan, namun cara itu bukanlah pilihan yang tepat (kurang aman). Namun kalo untuk sekedar menyimpan pengaturan atau map boleh-boleh saja.

Kembali ke topik tadi. Mengapa kita menggunakan JSON ? Jawabannya adalah sebagai berikut.

  • JSON memiliki beberapa tipe data (string, boolean, null, numerik, array dan object).
  • Ukuran JSON lebih kecil di banding dengan XML.
  • Kecepatan parsing JSON lebih unggul.
  • Bisa di-parsing dengan beberapa fungsi built-in pada berbagai bahasa pemrograman.

Menurut penelitian saya, khususnya bagi para mobile developer. Banyak layanan yang menyediakan REST API atau bahkan FULL REST API yang menggunakan format JSON sebagai transfer data-nya. Contohnya adalah Google Maps, Facebook, Twitter, My Anime List dan masih banyak lagi. Dengan adanya JSON kita bisa menggunakan layanan mereka di dalam sebuah game.


STUDI PROJECT

Agar lebih akrab dan paham, kita akan mencoba membuat sebuah project game yang akan membuat dan memuat kembali semua object monster di dalam room. Property yang dibutuhkan akan disimpan ke dalam file JSON. Langsung saja mari kita coba membuatnya.

PEMBUATAN SPRITE

Sprite yang kita butuhkan untuk project ini adalah sebagai berikut.

spr_monster_a
spr_monster_b

PEMBUATAN OBJECT

Object yang dibutuhkan adalah sebagai berikut.

obj_control

Oject ini bertugas untuk membuat object monster dan untuk Save dan Load file JSON. obj_control memiliki beberapa event, berikut beserta code di dalamnya.

GLOBAL MOUSE LEFT PRESSED
GLob Left Pressed
//Munculkan moster A
if(position_empty(mouse_x, mouse_y)){
  monster = instance_create(mouse_x, mouse_y, obj_monster);
  monster.sprite_index = spr_monster_a;
  monster.type = 0;
}

GLOBAL MOUSE RIGHT PRESSED
GLob Right Pressed
//Munculkan moster B
if(position_empty(mouse_x, mouse_y)){
  monster = instance_create(mouse_x, mouse_y, obj_monster);
  monster.sprite_index = spr_monster_b;
  monster.type = 1;
}

KEYBOARD PRESS S
press S-key
//Save to JSON
saving_file = get_save_filename("JSON|*.json", "");

if(saving_file != ""){
  json_file = file_text_open_write(saving_file);
  file_text_write_string(json_file, '{ "data_monster" :[');
  file_text_writeln(json_file);
  for(i=0;i<instance_number(obj_monster);i++){
     monster = instance_find(obj_monster, i);
    map_monster = ds_map_create();
    ds_map_add(map_monster, "type", monster.type);
    ds_map_add(map_monster, "x", monster.x);
    ds_map_add(map_monster, "y", monster.y);

    file_text_write_string(json_file, json_encode(map_monster));
    if(i < instance_number(obj_monster)-1){
      file_text_write_string(json_file, ',');
    }
    file_text_writeln(json_file);
    ds_map_destroy(map_monster);
    }
    file_text_write_string(json_file, ']}');
    file_text_close(json_file);
}

KEYBOARD PRESS L
press L-key
//Load from JSON
saving_file = get_open_filename("JSON|*.json", "");

if(saving_file != ""){
  json_string = "";
  json_file = file_text_open_read(saving_file);
  line = file_text_read_string(json_file);
  while(ord(line) <= 255 && ord(line) >= 32){
    json_string += line;
    file_text_readln(json_file);
    line = file_text_read_string(json_file);
  }
  file_text_close(json_file);
  with(obj_monster) instance_destroy();

  decoded = json_decode(json_string);
  data_monster = decoded[? "data_monster"];
  for(i=0;i<ds_list_size(data_monster);i++){
    current_monster = data_monster[| i];
    type = real(current_monster[? "type"]);
    xpos = real(current_monster[? "x"]);
    ypos = real(current_monster[? "y"]);

    monster = instance_create(xpos, ypos, obj_monster);
    switch(type){
      case 0: monster.sprite_index = spr_monster_a;break;
      case 1: monster.sprite_index = spr_monster_b;break;
    }
    monster.type = type;
  }
}

obj_monster

Pilihlah spr_monster_a sebagai sprite-nya. Sprite ini berguna sebagai mask saja. obj_monster memiliki event sebagai berikut.

Create
type = 0;


PENGUJIAN

Buatlah sebuah room berukuran 640 X 480. Tempatkan obj_control di room tersebut kemudian jalankan game-nya. Cobalah untuk memunculkan object obj_monster dengan klik kiri atau kanan mouse. Cobalah juga untuk menyimpan dan membuka file JSON-nya dengan menekan keyboard "S" dan "L".

Hasil running project



  DOWNLOAD SAMPLE (.ZIP)

PENUTUP

Dari postingan kali ini dapat kita simpulkan bahwa JSON merupakan format pertukaran data yang didukung GAME MAKER:STUDIO. JSON memiliki kecepatan mem-parse yang lebih unggul. Bisa dilihat dari Studi Project kita di atas bahwa untuk memuat obj_monster tidak dibutuhkan waktu yang lama. Penerapannya pun bisa untuk banyak fungsi misalkan studi kita tadi bisa untuk menyimpan dan memuat sebuah map pada game RPG atau lainnya.

Demikianlah postingan saya kali ini, semoga kita dapat belajar ilmu baru yang tentunya bermanfaat dalam dunia pemrograman khususnya pembuatan game. Jika ada kata-kata yang salah atau code yang kurang tepat saya mohon maaf dan silahkan berikan kritik yang membangun melalui komentar di bawah ini.




Doki Doki Maker
© 2016, Muharif Al Hanif
Semua konten dalam blog ini adalah hak milik penulis dan dilarang untuk memuat ulang di media lain baik media elektronik maupun cetak tanpa ijin terlebih dahulu.

Datapatkan update berita dan tutorial