Data struktur pada Game Maker:Studio (Bagian 2)

Di posting pada tanggal  Wednesday 11 May 2016



Pembahasan data struktur menjadi semakin menarik ketika kita bisa menerapkannya ke dalam sebuah game. Di dalam GAME MAKER:STUDIO terdapat beberapa data struktur lain yang memudahkan kita dalam membuat sebuah game. Apa sajakah data struktur tersebut ?


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

DS Stacks

DS Stacks adalah data struktur yang meiliki prinsip last-in-first-out (LIFO) atau terakhir masuk dan pertama keluar. "Jika kalian ingin menambahkan tumpukan bambu pada tumpukan kayu, maka bambu - bambu tersebut akan berada di atas tumpukan kayu. JIka kalian ingin mengambil sebuah kayu, terlebih dahulu kalian harus mengambil bambu - bambu yang berada paling atas".
Ilustrasi dari DS Stacks

Perhatikan gambar di atas! Jika ada data baru (push), maka data tersebut akan terletak di posisi paling atas (pop). Jika data struktur tersebut diambil datanya pop, maka data pertama kali yang terambil adalah data yang terletak paling atas tersebut. Secara otomatis data yang berada di bawahnya akan tertekan naik.

DS Stacks bisa digunakan untuk merekam beberapa data yang masuk sebagai riwayat (history), membuatan AI untuk game, mengatur tumpukan deck kartu, atau bisa juga membuat fungsi Undo.

Apa sajakah fungsi-fungsi DS Stacks tersebut ?

Berikut ini saya akan menjelaskan beberapa fungsi-fungsi built-in Ds Stacks yang ada di dalam Game Maker:Studio beserta contoh penggunaanya.

  • ds_stack_create();

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

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_buku = ds_stack_create();

  • ds_stack_destroy(id);

    Fungsi dari ds_stack_destroy adalah untuk menghapus (menghilangkan dari memory) Ds stacks tertentu sesuai dengan argument berupa id dari Ds stacks yang dimaksud.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_buku = ds_stack_create(); //membuat data struktur
    ds_stack_destroy(data_buku); //menghapus data struktur

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

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

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_buku = ds_stack_create();

    //Menumpuk value
    ds_stack_push(stack, "Matematika");
    ds_stack_push(stack, "IPA");
    ds_stack_push(stack, "Bhs. Inggris");

  • ds_stack_top(id);

    Fungsi dari ds_stack_top adalah untuk mendapatkan value paling atas dari sebuah Ds stacks. Fungsi ini memiliki sebuah argument yaitu id dari Ds stacks tersebut.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_buku = ds_stack_create();
    ds_stack_push(data_buku, "Matematika", "IPA", "Bhs. Inggris"); //Menumpuk value

    ambil = ds_stack_top(data_buku); //Mendapatkan value paling atas
    show_message(ambil); //Memunculkan value

  • ds_stack_pop(id);

    Fungsi dari ds_stack_pop adalah untuk mengambil (menghapus) value paling atas dari sebuah Ds stacks dan menghasilkan value tersebut. Fungsi ini memiliki sebuah argument yaitu id dari Ds stacks tersebut.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_buku = ds_stack_create();
    ds_stack_push(data_buku, "Matematika", "IPA", "Bhs. Inggris");

    pop = ds_stack_pop(data_buku); //Mengambil value paling atas
    ambil = ds_stack_top(data_buku); //Mendapatkan value paling atas

    show_message("Nilai terambil= " + pop + "#Nilai paling atas= " + ambil); //Memunculkan value

  • ds_stack_copy(id, source);

    Fungsi dari ds_stack_copy adalah untuk menyalin semua value yang dimiliki suatu Ds stacks ke Ds stacks lainnya. Jika Ds stacks memiliki value, maka akan terhapus dan tergantikan dengan value Ds stacks yang disalin. Fungsi ini memiliki dua argument yaitu id dari Ds stacks yang ditujukan dan id dari Ds lists yang disalin.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    //Membuat stacks data_buku
    data_buku = ds_stack_create();
    ds_stack_push(data_buku, "Matematika", "IPA");

    //Membuat stacks baru buku_baru
    buku_baru = ds_stack_create();
    ds_stack_push(buku_baru, "IPS", "Sejarah", "Bhs. Jepang");

    //Menyalin buku_baru ke data_buku
    ds_stack_copy(data_buku, buku_baru);

    jumlah = ds_stack_size(data_buku); //Mendapatkan jumlah value stelah dicopy
    ambil = ds_stack_top(data_buku); //Mendapatkan value paling atas

    show_message("Jumlah buku= " + string(jumlah) + "#Buku paling baru= " + ambil); //Memunculkan value

Kapan kita harus memakai DS Stacks ?

Melihat dari kegunaan Ds Stacks yaitu untuk menyimpan data dengan struktur last-in-first-out (LIFO), kita bisa menggunakannya untuk membuat sistem khusus dengan struktur stacks (tumpukan) tertentu mengingat kita hanya bisa mengakses value yang paling atas dari jenis data struktur ini.

Untuk contoh kasus, kita akan membuat sebuah sistem untuk mengembalikan posisi sebuah object ke posisi sebelumnya (Undo).

CONTOH KASUS MEMBUAT SISTEM UNDO

Kali ini saya akan memberikan studi kasus agar kita lebih paham lagi kegunaan dari Ds stacks ini. Studi kasus kali ini adalah membuat sistem Undo (mengembalikan ke posisi terakhir). Persiapannya adalah, membuat sprite untuk object yang akan di record posisi-nya. Dalam hal ini, saya akan menggunakan sprite berikut.

spr_monster

Jangan lupa, atur origin sprite-nya ke center agar posisinya bisa tepat ditengah-tengah nanti.

Buatlah sebuah object berinama obj_control dan atur sprite-nya ke spr_monster tadi. Kemudian tambahkan event-event dan isikan code berikut.

EVENT CREATE
Create
record = ds_stack_create();

EVENT GLOBAL LEFT RELEASED
Glob Left Released
x = mouse_x;
y = mouse_y;

var posisi; //Array untuk menyimpan posisi
posisi[0] = x;
posisi[1] = y;
ds_stack_push(record, posisi);

KEYBOARD CONTROL KEY
<Ctrl>
//Ketika ditekan tombol 'Z'
if(keyboard_check_pressed(ord('Z'))){
  if(ds_stack_size(record) > 1){
    ds_stack_pop(record);//Menghapus nilai paling atas
    var posisi;
    posisi = ds_stack_top(record);//Memperoleh nilai paling atas

    x = posisi[0];
    y = posisi[1];
  }
 else{
    x = xstart;
    y = ystart;

    ds_stack_clear(record);
  }
}

Tempatkan object tersebut di dalam sebuah room pada posisi dimana saja.



Sekarang coba jalankan game-nya (F5). Sekarang coba klik pada daerah room yang kosong, jika object telah berpindah cobalah menekan tombol keyboard CTRL + Z. Jika berhasil, maka object tersebut akan berpindah ke posisi sebelumnya. Lakukan lagi dengan meng-klik lebih banyak kemudian tekan tombol CTRL + Z.


  DOWNLOAD SAMPLE (.GMZ)

DS Queues

Ds Queues adalah data struktur yang memiliki prinsip first-in-first-out (FIFO) atau yang pertama masuk dan pertama keluar layaknya sebuah baris antrian. Berbeda dengan Ds Stacks yang mana data terakhir lah yang akan dikeluarkan terlebih dahulu. Untuk lebih jelasnya simaklah gambar berikut!


Ilustrasi dari DS Queues

Dari gambar tersebut telah dijelaskan jika pada sewaktu data masuk (Enqueue) maka ia harus menunggu giliran sebelum data sebelumnya dikeluarkan (Dequeue). Data yang berada pada antrian paling depan disebut kepala (Head) sedangkan data yang terletak paling belakang pada antrian disebut ekor antrian (Tail).

Fungsi Ds Queues hampir mirip dengan Ds Stacks yang juga bisa digunakan untuk variasi pembuatan AI pada game. Juga bisa diterapkan untuk memunculkan beberapa jenis musuh (wave) seperti pada game tower defense.

Apa sajakah fungsi-fungsi DS Queues tersebut ?

Berikut ini saya akan menjelaskan beberapa fungsi-fungsi built-in Ds Queues yang ada di dalam Game Maker:Studio beserta contoh penggunaanya.

  • ds_queue_create();

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

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_antrian = ds_queue_create();

  • ds_queue_destroy(id);

    Fungsi dari ds_queue_destroy adalah untuk menghapus (menghilangkan dari memory) Ds queues tertentu sesuai dengan argument berupa id dari Ds queues yang dimaksud.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_antrian = ds_queue_create(); //membuat data struktur
    ds_queue_destroy(data_antrian ); //menghapus data struktur

  • ds_queue_enqueue(id, val [, val2, ... val15]);

    Fungsi dari ds_queue_enqueue adalah untuk menambahkan nilai (antrian baru) pada Ds queues. Jumlah data yang bisa ditambahkan untuk setiap fungsi adalah 16 buah (16 argument).

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_antrian = ds_queue_create(); //membuat data struktur

    //Menambahkan antrian baru
    ds_queue_enqueue(data_antrian, "Toni", "Anjar", "Mega");
    ds_queue_enqueue(data_antrian, "Adit");

  • ds_queue_dequeue(id);

    Fungsi dari ds_queue_dequeue adalah untuk menghapus data antrian paling depan pada Ds queues. Fungsi ini memiliki sebuah argument yaitu id dari Ds queues yang akan dihapus datanya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_antrian = ds_queue_create(); //membuat data struktur

    //Menambahkan antrian baru
    ds_queue_enqueue(data_antrian, "Toni", "Anjar", "Mega");

    //Menghapus data antrian paling depan
    ds_queue_dequeue(data_antrian);

  • ds_queue_head(id);

    Fungsi dari ds_queue_head adalah untuk mendapatkan nilai antrian paling depan pada Ds queues. Fungsi ini memiliki sebuah argument yaitu id dari Ds queues yang akan diambil nilainya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_antrian = ds_queue_create(); //membuat data struktur

    //Menambahkan antrian baru
    ds_queue_enqueue(data_antrian, "Toni", "Anjar", "Mega");

    //Mengambil nilai antrian paling depan
    cari = ds_queue_head(data_antrian);

    show_message(cari); //Menampilkan hasil

  • ds_queue_tail(id);

    Fungsi dari ds_queue_tail adalah untuk mendapatkan nilai antrian paling belakang pada Ds queues. Fungsi ini memiliki sebuah argument yaitu id dari Ds queues yang akan diambil nilainya.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_antrian = ds_queue_create(); //membuat data struktur

    //Menambahkan antrian baru
    ds_queue_enqueue(data_antrian, "Toni", "Anjar", "Mega");

    //Mengambil nilai antrian paling belakang
    cari = ds_queue_tail(data_antrian);

    show_message(cari); //Menampilkan hasil

  • ds_queue_copy(id, source);

    Fungsi dari ds_queue_copy adalah untuk menyalin semua value yang dimiliki suatu Ds queues ke Ds queues lainnya. Jika Ds queues memiliki value, maka akan terhapus dan tergantikan dengan value Ds queues yang disalin. Fungsi ini memiliki dua argument yaitu id dari Ds queues yang ditujukan dan id dari Ds queues yang disalin.

    Contoh penggunaannya adalah sebagai berikut.

    Create
    data_sub_antrian = ds_queue_create();
    ds_queue_enqueue(data_sub_antrian, "Toni", "Anjar", "Adit");

    data_master = ds_queue_create();

    //Menyalin dari data_sub_antrian ke data_master
    ds_queue_copy(data_master, data_sub_antrian);

    //Mengambil nilai antrian paling depan
    cari = ds_queue_head(data_master);

    show_message(cari); //Menampilkan hasil

Kapan kita harus memakai DS Queues ?

Penerapan DS Queues di dalam sebuah game adalah bisa digunakan untuk menyimpan data yang akan dikeluarkan menurut urutan tertentu (antrian). Karena itu DS Stacks dan DS Queues ini lebih unggul pada integritas data. Data yang keluar-masuk tetap pada urutan dan isi yang sama. Bisa dilihat dari tidak ada fungsi untuk acak (shuffle), menghapus data pada index tertentu maupun mengganti isi data.

Di awal-awal tadi saya sudah menyinggung penerapan data struktur ini untuk membuat wave pada game Tower Defense atau seperti munculnya beberapa zombie pada game dibawah ini.


Game Plant VS Zombie

Game Plant VS Zombie ini sangat populer. Intinya ada beberapa pasukan zombie berbagai jenis mulai dari yang lemah sampai yang kuat. Sebelum permainan dimulai, akan diperlihatkan beberapa zombie yang siap menyerbu sebuah rumah yang tampak sedang antri di depan halaman. Jadi tidak semua zombie akan langsung masuk melainkan satu per satu dan biasanya dimulai dari yang paling lemah terlebih dahulu. Dalam hal ini, kita bisa menerapkan beberapa fungsi DS Queues.

Penerapan lainnya adalah untuk pembuatan AI pada game kita. Bisa berupa rencana perpindahan posisi object yang mana data posisi tersebut dimasukkan pada Ds Queues. Agar tidak monoton, gerakan object ini juga harus dinamis yang dapat berubah sesuai situasi. Di situlah Ds Queues berguna. Kamu hanya cukup menambahkan posisi baru (Enqueue) pada kondisi tertentu sementara Ds Queues akan tetap dijalankan (Dequeue).

Contoh kasus simulasi antrian

Untuk studi kasus ini, kita akan membuat sebuah simulasi antrian yang mana akan menampilkan antrian yang selanjutnya akan dipanggil. Untuk itu siapkan dulu beberapa sprite-nya jangan lupa atur origin sprite-nya ke center.

spr_red
spr_blue
spr_green

Buatlah sebuah object, namakan obj_red. Set sprite-nya ke spr_red. Lalu masukkan beberapa action dan code seperti dibawah ini.

CREATE EVENT
Create
no_antri = 0;
hspeed = -4;

OTHER > OUTSIDE ROOM EVENT
Outside Room
instance_destroy();

DRAW EVENT
Draw
draw_self();

draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_text(x, y - 64, "No. Antri: " + string(no_antri));

Buatlah dua buah object lagi, namakan obj_blue dan namakan obj_green. Jangan lupa atur sprite-ny ke spr_blue dan spr_green. Kemudian atur parent pada object properties kedua object ini ke obj_red.

Yang terakhir buatlah object untuk mengatur data antrian dan menampilkan antrian selanjutnya. Namakan object ini obj_control. Lalu masukkan beberapa action dan code seperti dibawah ini.

CREATE EVENT
Create
data_antrian = ds_queue_create();
jumlah_antrian = 15;

randomize();
for(i=0;i<jumlah_antrian;i++){
  antrian = choose(obj_red, obj_blue, obj_green);
  ds_queue_enqueue(data_antrian, antrian);
}

STEP EVENT
Step
if(ds_queue_size(data_antrian) > 0){
  if(!instance_exists(obj_red) && !instance_exists(obj_blue) && !instance_exists(obj_green)){
    keluar = instance_create(room_width, room_height/2, ds_queue_head(data_antrian));
    keluar.no_antri = (jumlah_antrian - ds_queue_size(data_antrian)) + 1;
    ds_queue_dequeue(data_antrian);
  }
}

DRAW EVENT
Draw
draw_set_halign(fa_left);
draw_set_valign(fa_top);

if(ds_queue_size(data_antrian) > 0){
  no_antri = (jumlah_antrian - ds_queue_size(data_antrian)) + 1;
  draw_text(0, 0, "Antrian selanjutnya: " + object_get_name
(ds_queue_head(data_antrian)) + ' [' + string(no_antri) + ']');
}
else{
  draw_text(0, 0, "Antrian selanjutnya kosong.");
}

Buatlah sebuah room berukuran 640 X 480, masukkan obj_control dan jalankan game nya.


  DOWNLOAD SAMPLE (.GMZ)

Demikianlah postingan saya kali ini, seperti biasa saya mohon maaf apabila ada salah-salah kata maupun penulisan code. Untuk lanjutan dari materi Data Struktur ini akan saya posting lain waktu. Semoga postingan ini bermanfaat dan jika ada pertanyaan ataupun saran silahkan berkomentar.




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