Data Struktur pada Game Maker:Studio (Bagian 1)

Di posting pada tanggal  Saturday 16 April 2016





Di dalam sebuah game, ada kalanya kita membutuhkan sebuah variable untuk menyimpan daftar informasi. Informasi tersebut contohnya dapat berupa daftar (list) nama item yang diperoleh pemain. Ada juga informasi yang memiliki nilai tertentu (seperti object dan properties-nya). Di dalam Game Maker:Studio terdapat beberapa data struktur yang bisa kita gunakan sesuai dengan keinginan kita.


Berikut ini adalah beberapa jenis data struktur pada Game Maker:Studio yang masing-masing akan dijelaskan dan diberikan contoh penggunaannya.

DS Lists

DS Lists merupakan data struktur yang manampung informasi secara berurutan. Seperti array 1 dimensi atau (linked list pada bahasa pemrograman lain). Ketika kita menambahkan index baru ke DS Lists, maka secara otomatis akan membuat nomor index dengan bilangan integer untuk mengakses value-nya.

Ilustrasi dari DS Lists

Gambar diatas mengilustrasikan sebuah DS Lists yang mana memiliki 4 index. Masing-masing index berisi value. Kita bisa secara bebas mengakses, mengacak, mengurutkan dan lain sebagainya dengan fungsi-fungsi dari DS Lists ini.

Apa sajakah fungsi-fungsi DS Lists tersebut ?

Fungsi-fungsi built-in Ds lists yang ada di dalam Game Maker:Studio cukup banyak dan sangat berguna dalam membuat game tertentu. Berikut ini saya akan menjelaskan beberapa fungsi-fungsi tersebut beserta contoh penggunaanya.

  • ds_list_create();

    Fungsi dari ds_list_create adalah untuk membuat Ds lists baru. Fungsi ini harus pertama kali dieksekusi sebelum fungsi Ds lists yang lainnya. Fungsi ini tidak memiliki argument dan akan menghasilkan id (handle) untuk digunakan pada fungsi Ds lists yang lainnya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_score = ds_list_create();

  • ds_list_destroy(id);

    Fungsi dari ds_list_destroy adalah untuk menghapus (menghilangkan dari memory) Ds lists tertentu sesuai dengan argument berupa id dari Ds lists yang dimaksud. Fungsi ini biasanya digunakan untuk meringankan kinerja memori bila data struktur yang dimaksud sudah tidak digunakan lagi.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_score = ds_list_create(); //membuat data struktur
    ds_list_destroy(data_score); //menghapus data struktur

  • ds_list_add(id, val1 [, val2, ... val15]);

    Fungsi dari ds_list_add adalah untuk menambah sebuah atau beberapa value ke Ds lists tertentu. Fungsi ini minimal harus memiliki dua argument yaitu id dari Ds lists yang akan ditambahkan dan value-nya. Maksimal kita bisa menambahkan 16 value pada fungsi ini.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_score = ds_list_create(); //membuat data struktur
    ds_list_add(data_score, 160); //menambahkan value ke data struktur (index value = 0)
    ds_list_add(data_score, 135); //menambahkan value ke data struktur (index value = 1)

  • ds_list_find_value(id, pos);

    Fungsi dari ds_list_find_value adalah untuk mendapatkan value dari sebuah Ds lists dengan index yang diinginkan. Fungsi ini memiliki dua argument yaitu id dari Ds lists tersebut dan index-nya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_score = ds_list_create();
    ds_list_add(data_score, 160);
    ds_list_add(data_score, 135);
    cari = ds_list_find_value(data_score, 1); //mendapatkan value index ke 1
    show_message("value ke 1= " + string(cari)); //menampilkan value

    Kita juga bisa menggunakan bentuk Accessors untuk mengganti ds_list_find_value(data_score, 1); agar lebih singkat seperti berikut ini.

    Create
    cari = data_score[| 1]; //mendapatkan value index ke 1

  • ds_list_replace(id, pos, val);

    Fungsi dari ds_list_replace adalah untuk mengganti value dari Ds lists tertentu dengan index yang dimaksudkan dengan value yang baru. Fungsi ini memiliki tiga argument yaitu id dari Ds lists, posisi index-nya dan value baru untuk menggantikannya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_score = ds_list_create();
    ds_list_add(data_score, 160);
    ds_list_add(data_score, 350);
    ds_list_replace(data_score, 0, 100); //mengganti value ke 0 menjadi 100
    cari = data_score[| 0]; //mendapatkan value ke 0
    show_message("value ke 0= " + string(cari)); //menampilkan value (350)

  • ds_list_delete(id, pos);

    Fungsi dari ds_list_delete adalah untuk menghapus sebuah value dari Ds lists tertentu dengan index yang dimaksudkan. Jika posisi selanjutnya masih ada value lagi, maka index-nya akan berubah menjadi index saat ini. Fungsi ini memiliki dua argument yaitu id dari Ds lists yang akan dihapus dan nomor index-nya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_score = ds_list_create();
    ds_list_add(data_score, 160);
    ds_list_add(data_score, 350);
    ds_list_delete(data_score, 0); //menghapus value ke 0
    cari = data_score[| 0]; //mendapatkan value ke 0
    show_message("value ke 0= " + string(cari)); //menampilkan value (350)

  • ds_list_shuffle(id);

    Fungsi dari ds_list_shuffle adalah untuk mengacak posisi value dalam sebuah Ds lists. Fungsi ini memiliki satu argument yaitu id dari Ds lists tersebut. Karena biasanya seed random ditentukan oleh Game Maker:Studio, untuk membuatnya benar-benar acak (tidak mengulang acakan yang sama sebelumnya), panggilah fungsi randomize();.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    awal = "";
    akhir = "";

    data_score = ds_list_create();
    ds_list_add(data_score, 160, 350, 125, 145, 200, 500, 125);

    for(i=0;i<ds_list_size(data_score);i++){
      awal += string(data_score[| i]) + " "; //Menyimpan semua value
    }

    randomize(); //menjadikan seed ke acak
    ds_list_shuffle(data_score); //mengacak Ds list

    for(i=0;i<ds_list_size(data_score);i++){
      akhir += string(data_score[| i]) + " "; //Menyimpan semua value
    }

    show_message("Sebelum di acak= " + awal + "#Setelah diacak= " + akhir); //menampilkan awal dan akhir

  • ds_list_sort(id, pos);

    Fungsi dari ds_list_sort adalah untuk mengurutkan semua value dari Ds lists baik secara Ascending (dari kecil ke besar) maupun Descending (dari besar ke kecil). Fungsi memiliki dua argument yaitu id dari Ds lists dan pengurutannya true apabila diurutkan secara ascending dan false apabila diurutkan secara descending.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    awal = "";
    akhir = "";

    data_score = ds_list_create();
    ds_list_add(data_score, 160, 350, 125, 145, 200, 500, 125);

    for(i=0;i<ds_list_size(data_score);i++){
      awal += string(data_score[| i]) + " "; //Menyimpan semua value
    }

    ds_list_sort(data_score, true); //mengurutkan Ds list

    for(i=0;i<ds_list_size(data_score);i++){
      akhir += string(data_score[| i]) + " "; //Menyimpan semua value
    }

    show_message("Sebelum diurutkan= " + awal + "#Setelah diurutkan= " + akhir); //menampilkan awal dan akhir

Fungsi-fungsi diatas hanyalah beberapa dari semua fungsi Game Maker:Studio yang sering saya pakai. Untuk selengkapnya bisa dibaca di sini.

Kapan kita harus memakai DS Lists ?

Sebelum saya mengetahui apa itu data struktur, saya biasa menggunakan array 1 dimensi untuk kebutuhan data list. Namun karena fungsi array terbatas, saya sering kerepotan seperti jika ingin mengacak data ataupun mengurutkannya kembali. Namun kini dengan mengacu pada kegunaannya, kita sudah tahu kapan harus menggunakan Ds lists. Kegunaanya tergantung dan pasti berhubungan berat sama yang namanya data list (berupa daftar).

Kalo menurut saya fungsi yang paling usefull banget adalah menipulasi list(add, replace, delete) dan mengacak serta mengurutkannya kembali. Berguna bangetkan untuk bikin game puzzle, game card dan lain sebagainya atau cuma sekedar mengurutkan score.

Selanjutnya saya uraikan pengalaman saya menggunakan Ds lists dalam rangka memudahkan pembuatan game.

PEMBUATAN GAME PUZZLE JIGSAW

Bagi yang masih pemula dan belum mengenal apa itu data struktur (kayak saya dulu), biasanya memakai banyak banget sprite dan object. Namun kini dengan Ds list dan pengetahuan fungsi-fungsi instance... dan hanya bermodal 2 object saja kita sudah bisa membuat game puzzle.

Sebagai gambaran saya akan menerapkan teknik mengacak dan mengurutkan kembali sebuah gambar puzzle dengan percobaan berikut.

Carilah gambar untuk sprite dengan ukuran 480 X 480, namakan spr_puzzle. Buatlah sebuah object, namakan obj_control. Tambahkan event dan isikan code seperti berikut.

CREATE
Create
data_puzzle = ds_list_create();
ds_list_add(data_puzzle, 0, 1, 2, 3, 4, 5, 6, 7, 8);
randomize();
ds_list_shuffle(data_puzzle);
acak = true;

DRAW
Draw
for(i=0;i<ds_list_size(data_puzzle);i++){
  left = data_puzzle[| i] mod 3 * 160;
  top = data_puzzle[| i] div 3 * 160;
  pos_x = i mod 3 * 160;
  pos_y = i div 3 * 160;
  draw_sprite_part(spr_puzzle, 0, left, top, 160, 160, pos_x, pos_y);
}

KEYPRESS SPACE
Press<Space>
if(acak){
  ds_list_sort(data_puzzle, true);
  acak = !acak;
}
else{
  ds_list_shuffle(data_puzzle);
  acak = !acak;
}

Jika suda, buatlah room baru, namakan rm_game buat ukurannya menjadi 480 X 480. Kemudian masukkan object obj_control. Terakhir cobalah run game-nya dan jika benar, jika tombol keyboard spasi ditekan, maka gambar akan mengacak dan mengembalikannya secara otomatis.

  DOWNLOAD SAMPLE (.GMZ)

DS Maps

DS maps adalah jenis data struktur yang mempunyai key dan value. Kegunaan key ini adalah untuk mengakses value pada DS maps itu sendiri layaknya sebuah nomor index pada DS lists. Sedangkan key yang digunakan tidak boleh sama dengan yang lainnya. Jika ada key yang sama, maka yang digunakan adalah key yang pertama.

Ilustrasi dari DS Maps  (Original Character from Onigiri)

Perhatikan gambar di atas! Dua karakter tersebut memiliki data struktur yang terdiri dari 3 key yang masing-masing mewakili 3 value. Jika karakter tersebut ingin mengganti sebuah item, contohnya mengganti armor kita cukup mengganti value-nya saja. Ya! memang Ds maps ini sangat cocok untuk membuat data tables seperti inventory, data player dan lain sebagainya.

Jika bagi kalian yang sudah akrab dengan bahasa pemrograman berorientasi object, Ds maps bisa dibilang layaknya sebuah object yang memiliki properties di dalamnya. value dari properties bisa diakses maupun diubah sesuai yang kita inginkan.

Apa sajakah fungsi-fungsi DS Maps tersebut ?

Jujur saja tidak seperti Ds lists saya jarang menggunakan Ds maps jadi fungsi-fungsi built-in Ds Maps yang ada di dalam Game Maker:Studio belum sepenuhnya saya pelajari namun kurang lebih sama saja sih. Langsung saja berikut ini saya akan menjelaskan beberapa fungsi Ds maps beserta contoh penggunaannya.

  • ds_map_create();

    ds_map_create() berfungsi untuk membuat Ds maps baru. Fungsi ini akan memberikan nilai balik berupa id (handle) Ds maps tersebut.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_player = ds_map_create();

  • ds_map_destroy(id);

    ds_map_destroy() berfungsi untuk menghapus Ds maps tertentu. Fungsi ini digunakan apabila Ds maps sudah tidak digunakan lagi di dalam game. ds_map_destroy() memiliki 1 argument yaitu id Ds maps yang ingin dihapus.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_player = ds_map_create(); //Membuat data struktur
    ds_map_destroy(data_player); //Menghapus data struktur

  • ds_map_add(id, key, val);

    ds_map_add() berfungsi untuk menambahkan value ke dalam Ds maps tertentu. Fungsi ini memiliki 3 argument yaitu id Ds maps yang ingin ditambahkan, key yang akan digunakan untuk mengakses value-nya dan nilai dari value itu sendiri.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_player = ds_map_create(); //Membuat data struktur
    ds_map_add(data_player, "nama", "Muharif Al Hanif"); //Menambahkan value ke data struktur

  • ds_map_find_value(id, key);

    Fungsi dari ds_map_find_value adalah untuk mendapatkan value dari sebuah Ds maps dengan key yang ditentukan. Fungsi ini memiliki dua argument yaitu id dari Ds lists tersebut dan key-nya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_player = ds_map_create();
    ds_map_add(data_player, "nama", "Muharif Al Hanif");
    cari = ds_map_find_value(data_player, "nama"); //Mendapatkan value
    show_message("Nama= " + cari); //Menampilkan value

    Kita juga bisa menggunakan bentuk Accessors untuk mengganti ds_map_find_value(data_player, "nama"); agar lebih singkat seperti berikut ini.

    Create
    cari = data_player[? "nama"]; //mendapatkan value dengan key 'nama'

  • ds_map_replace(id, key, val);

    ds_map_replace() berfungsi untuk merubah value dari Ds maps dengan value yang baru. Fungsi ini memiliki 3 argument yaitu id Ds maps yang ingin ditambahkan, key yang akan digunakan untuk mengakses value yang akan diubah dan value yang baru.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_player = ds_map_create();
    ds_map_add(data_player, "nama", "Muharif Al Hanif");
    ds_map_replace(data_player, "nama", "Mikado"); //Merubah value data struktur
    cari = data_player[? "nama"]; //Mendapatkan value
    show_message("Nama= " + cari); //Menampilkan value

  • ds_map_delete(id, key);

    ds_map_delete() berfungsi untuk menghapus value dari Ds maps dengan key yang ditentukan. Fungsi ini memiliki 2 argument yaitu id Ds maps tersebut dan key yang akan digunakan untuk menghapus.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_player = ds_map_create();
    ds_map_add(data_player, "nama", "Muharif Al Hanif");
    ds_map_delete(data_player, "nama"); //Menghapus value data struktur
    cari = data_player[? "nama"]; //Mendapatkan value

    if(is_undefined(cari)) show_message("value telah dihapus"); //Menampilkan value
    else show_message("value berisi= " + cari); //Menampilkan value

  • ds_map_size(id);

    Fungsi dari ds_map_size adalah untuk mendapatkan jumlah keseluruhan value dari suatu Ds maps. Fungsi ini memiliki 1 argument yaitu id dari Ds maps yang dimaksud.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_player = ds_map_create();
    ds_map_add(data_player, "nama", "Muharif Al Hanif");
    ds_map_add(data_player, "senjata", "Keris Angling Darma");
    ds_map_add(data_player, "power", 200);
    ds_map_add(data_player, "defense", 128);

    jumlah = ds_map_size(data_player); //Mencari jumlah value dari data struktur
    show_message("jumlah value = " + string(jumlah));

Demikian beberapa fungsi Ds maps yang sering saya gunakan. Fungsi yang lainnya mungkin akan saya jelaskan jika dibutuhkan dalam postingan tutorial. Untuk melihat lebih lengkap semua fungsi Ds maps, silahkan lihat di sini.

Kapan kita harus memakai DS Maps ?

Ds maps sangat erat kaitannya dengan data table. Menurut penglihatan saya Ds maps merupakan sebuah object. Sebagai contoh ada sebuah object yaitu manusia (Ds maps) yang memiliki nama (key) dan namanya adalah "Muharif AL Hanif" (value).

Untuk lebih akrab lagi dengan Ds maps ini dan bagaimana sebaiknya penerapannya di dalam sebuah game, lihatlah contoh kasus berikut ini.

CONTOH KASUS INVENTORY

Seperti yang sudah saya singgung sebelumnya, ada pembuatan inventory. Misalnya kita mempunyai sebuah kotak penyimpanan berisi 2 pedang dan 4 kapak. Dalam hal ini kita bisa menerapkan fungsi-fungsi dari Ds maps.

Create
items= ds_map_create();
ds_map_add(items, "pedang", 2);
ds_map_add(items, "kapak", 4);

Misalkan suatu bermain, "Player" menemukan sebuah item baru yaitu sebuah "panah". Kita bisa menggunakan code seperti ini.

if (ds_map_exists(items, "panah")){
  ds_map_replace(items, "panah", items[? "panah"] + 1);
}
else{
  ds_map_add(items, "panah", 1);
}

ds_map_exists() digunakan untuk mengecek apakah suatu key sudah ada sebelumnya atau tidak.

Kemudian karena butuh uang, "Player" ini menjual "pedang"-nya. Maka kita bisa menuliskan code seperti berikut.

Create
if (ds_map_exists(items, "pedang")){
  if (items[? "pedang"] > 0){
    ds_map_replace(items, "pedang", items[? "pedang"] - 1);
    //Terjual (uang nambah)
  }
  else{
    show_message("Kamu tidak memiliki item ini!");
  }
}
else{
  show_message("Kamu tidak memiliki item ini!");
}

PENERAPAN DS LISTS DAN DS MAPS

Masih kelanjutan kasus yang tadi. Sekarang kita akan mencoba menampilkan semua item yang kita miliki. Namun bagaimana kita mengecek semua item yang kita miliki ? Oke, kita bisa menampilkan value dari Ds maps, namun bagaimana menampilkan value tertentu apabila kita tidak mengetahui key-nya karena "pedang", "kapak" dan "panah" tadi hanyalah sebatas key saja. Dari awal memang ini bukan cara yang tepat, namun gak masalah karena kita akan menyelesaikan kasus ini.

Kita akan membuat data struktur bantuan yang digunakan sebagai table bantu. Table bantu ini akan memuat info mengenai key dari Ds maps tadi.

Create
pesan = "";

//Membuat table bantuan daftar item
daftar_item = ds_list_create();
ds_list_add(daftar_item, "pedang", "kapak", "panah");
//

items = ds_map_create();

ds_map_add(items, "pedang", 2);
ds_map_add(items, "kapak", 4);
ds_map_add(items, "panah", 5);

for(i=0;i<ds_list_size(daftar_item);i++){
  if(ds_map_exists(items, daftar_item[| i])){
    pesan += daftar_item[| i] + " (" + string(items[? daftar_item[| i]]) +" buah)#";
  }
}

show_message(pesan); //Manmpilkan data struktur

DS MAPS DI DALAM DS LISTS

Mengapa tidak ? Ds lists yang value-nya berupa Ds maps sering digunakan untuk kebutuhan struktur pemetaan data yang banyak. Jika kalian sudah pernah mempelajari struct pada bahasa C++ kalian mungkin tidak asing dengan hal seperti ini.

Sebagai contoh, misalkan ada seorang siswa(Ds maps) di sekolah X. Siswa tersebut mempunyai nim(key), nama(key) dan usia(key). Kemudian ada siswa lainnya juga dari sekolah yang sama. Otomatis siswa tersebut tidak mungkin memiliki nim, nama dan usia yang sama (kalo usia dan nama masih bisa sama sih).

Jika digambarkan dengan diagram mungkin seperti berikut ini.

Diagram DS Maps di dalam DS List

Bisa dilihat gambar di atas, Daftar Siswa merupakan sebuah Ds lists yang memiliki 3 value. 3 value tersebut merupakan sebuah Ds maps yang masing-masing memiliki 3 value yang berbeda dengan 3 key yang sama.

Ingat kasus yang sebelumnya, kita membutuhkan table bantuan yang sangat sederhana (hanya menyimpan 1 value yaitu nama item). Dengan teknik ini, kita bisa mendeskripsikan data item yang lebih banyak. Misal "pedang" memiliki "harga" sekian dan "ability" sekian dan lain sebagainya.

Create
pesan = "";

//Mendeskripsikan property item
item0 = ds_map_create();
ds_map_add(item0, "nama", "Pedang");
ds_map_add(item0, "element", "Fire");
ds_map_add(item0, "harga", 200);

item1 = ds_map_create();
ds_map_add(item1, "nama", "Tombak");
ds_map_add(item1, "element", "Darkness");
ds_map_add(item1, "harga", 150);

item2 = ds_map_create();
ds_map_add(item2, "nama", "Tongkat sihir");
ds_map_add(item2, "element", "Light");
ds_map_add(item2, "harga", 100);
//

//Menambahkan item ke daftar item
daftar_item = ds_list_create();
ds_list_add(daftar_item, item0, item1, item2);
//

item_player = ds_map_create(); //Membuat daftar item yang dimiliki

ds_map_add(item_player, 1, 3);
ds_map_add(item_player, 0, 5);
ds_map_add(item_player, 2, 2);

for(i=0;i<ds_list_size(daftar_item);i++){
  if(ds_map_exists(item_player, daftar_item[| i])){
    data_item = daftar_item[| i];
    jumlah = item_player[? ds_list_find_index(daftar_item, data_item)];
    pesan += string(data_item[? "nama"]) + " (" + string(jumlah) + ") Harga total= " + string(data_item[? "harga"] * jumlah) + "#";
  }
}

show_message(pesan); //Menampilkan pesan

Coba lihat pada kode ds_map_add(item_player, 1, 3);. Kali ini tidak menggunakan key, melainkan menggunakan index yang sudah didapatkan waktu pembuatan data property item (dalam hal ini item1). Jika kurang yakin bisa dicek melalui code berikut.

Create
cari = ds_list_find_index(daftar_item, item1)//cari index
show_message(string(cari)); //Menmapilkan pesan

  DOWNLOAD SCRIPT(.TXT)

PENUTUP

Wah, tak terasa udah panjang banget postingan ini padahal baru 2 data struktur yang dibahas. Maka dari itu, untuk data struktur yang lain akan saya lanjutkan di bagian ke 2. Intinya postingan kali ini bisa ditarik kesimpulan bahwa Ds lists dan Ds maps sangat membantu kita dalam membuat sebuah game. Ds lists dan Ds maps bisa juga digunakan bersama-sama seperti contoh kasus di atas.

Demikianlah atikel Mengenal Data Struktur pada Game Maker:Studio (Bagian 1) ini. Semoga bisa bermanfaat bagi pembaca dan apabila ada kata-kata maupun code yang salah saya mohon maaf (maklum belum mahir) dan mohon ingatkan melalui komentar di bawah.




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