Pengenalan Game Design

Object

Dalam bahasa pemrograman berbasis object (Objek Oriented Programming / OOP), object didefinisikan sebagai sebuah entitas sendiri yang memiliki data, constructor serta fungsionalitas sendiri. Programnya sendiri kemudian berisi bagaimana object-object ini kemudian berperilaku. Karena basis penyusun programnya adalah object, maka paradigma pemrograman ini disebut Object Oriented Programming.

Object sendiri bisa kita analogikan dengan manusia. Apabila entitas manusia ini kita definisikan secara sederhana, maka mungkin ia akan terdeskripsikan sebagai berikut:

  • Data (sifat-sifat terukur):
    • Tinggi badan
    • Berat badan
    • Warna rambut
    • Jenis kelamin
  • Fungsi (kemampuan)
    • Berjalan
    • Melompat
    • Makan
    • Mengetik

Meski deskripsi di atas sangatlah sederhana, namun bisa ditangkap bahwa yang disebut manusia adalah yang memiliki properti seperti di atas. Ia tersusun dari data-data tertentu dan ia mampu melakukan fungsi tertentu. Meski demikian, tentu saja setiap manusia memiliki data yang berbeda, walaupun template penyusunnya sama. Template ini kemudian dikenal sebagai class, dan dari class inilah kita bisa menyusun object yang berbeda-beda.

Menggunakan Object

Sekarang bayangkan karakter yang telah kita buat dalam bab sebelumnya, akan kita buat sebagai object tersendiri. Ini terasa intuitif, karena pada dasarnya ia memang entitas sendiri, dengan potensi dikembangkan tersendiri (menambah kemampuan gerakan, warna badan, ukuran badan, dan sebagainya). Selanjutnya, dengan mengikuti cara deskripsi manusia, kita akan mendeskripsikan karakter kita. Untuk memudahkan pemahaman, kita beri saja jenis nama karakter kita sebagai smiley. Dengan mengikuti apa yang telah kita lakukan di bab sebelumnya, smiley akan kita deskripsikan sebagai berikut:

  • Data
    • Ukuran badan
    • Ukuran mata
    • Ukuran mulut
    • Warna badan
    • Warna mata
    • Warna mulut
    • Posisi
  • Fungsi
    • Gambar
    • Gerak

Dari sini, kita bisa memetakan apa saja yang harus ada di dalam object smiley. Perhatikan bahwa variabel global seperti posisi yang ada di contoh sebelumnya, kini kita masukkan ke dalam class. Ini karena ia akan menjadi parameter yang digunakan untuk menentukan di manakah smiley harus ditempatkan.

Nantinya, setelah object dibuat, maka kita bisa menggunakannnya. Cara penggunaannya mirip dengan menggunakan variabel, hanya saja kali ini, tipe datanya disesuaikan dengan class objectnya, serta kita berikan nama, seperti saat kita memberikan nama pada variabel. Contohnya seperti ini:

Contoh 8-1 Menggunakan Object

// deklarasi object
Smiley siSmiley;

void setup() {
    // inisialiasi object
    siSmiley = new Smiley();
}

void draw() {
    background (140);

    // memanggil fungsi milik object
    siSmiley.gerak();
    siSmiley.gambar();
}

Sama seperti variabel maupun fungsi, sebelum menggunakan object, kita perlu mendeklarasikan dan menginisiasi object tersebut. Dalam hal ini, object smiley kita deklarasikan dengan menulis

Smiley siSmiley;

Smiley adalah nama classnya, sementara siSmiley adalah object yang kita buat. Renungi ini sebentar. Selanjutnya, object siSmiley kita inisialisasi dengan menulis

siSmiley = new smiley();

Ini menandakan bahwa siSmiley adalah sebuah object dari class smiley yang berarti cara membuat serta apa yang bisa dilakukannya akan bergantung dari apa isi class smiley. Selanjutnya, fungsi maupun variabel penyusun smiley bisa kita panggil dengan memanggil terlebih dahulu objectnya, lalu diikuti dengan titik dan fungsi/variabel yang ingin dipanggil. Sebagai contoh, untuk membuat object siSmiley bergerak, kita bisa memanggil fungsi gerak() milik class smiley, sehingga yang ditulis adalah

siSmiley.gerak();

Konsep ini mungkin akan terasa sedikit berat, namun vital untuk dipahami. Oleh karena itu, silakan ambil waktu sedikit untuk memahami apa yang baru saja dideskripsikan. Selanjutnya, kita akan mempelajari bagaimana membuat object. Dalam hal ini, object smiley kita.

Membuat Object

Membuat object sebenarnya terdiri dari beberapa kegiatan yang sebenarnya mirip dengan membuat program biasa dalam Processing. Bahkan, Processing sebenarnya adalah sebuah class dalam Java, sehingga kita akan menemukan beberapa kemiripan antara membuat program Processing dengan membuat object dalam Processing.

Secara umum, prosedur pembuatan sebuah object dalam Processing terdiri dari 5 hal:

  1. Memberikan nama class
  2. Menentukan data-data yang diperlukan, terdiri dari variabel yang biasa disebut instance variables
  3. Menyusun constructor, fungsi khusus yang menggunakan data-data sebelumnya untuk membentuk object
  4. Menyusun fungsi-fungsi yang diperlukan class
  5. Membuat object dengan memberikan data-data yang diperlukan oleh class

Keseluruhan prosedur pembuatan class ini bisa dibuat di luar fungsi setup() dan draw(). Penulisannya dimulai dengan sintaks

class namaClass {
    //isi deklarasi class
}

Sebagai contoh, marilah kita buat object smiley dengan mengikuti aturan yang telah dituliskan sebelumnya

Contoh 8.2 - Membuat Class Smiley

// nama class
class Smiley {

  // data
  int ukuranBadan, lebarMulut, tinggiMulut, ukuranMata, xpos, ypos;
  color warnaMulut, warnaBadan, warnaMata;

  // constructor
  Smiley() {
    warnaMulut = color (255);
    warnaMata = color (0);
    warnaBadan = color (200, 200, 0);
    ukuranBadan = 70;
    lebarMulut = 50;
    tinggiMulut = 40;
    ukuranMata = 20;
    xpos = width/2;
    ypos = height/2;
  }

  // fungsi untuk menggambar smiley
  void gambar() {
    fill (warnaBadan);
    ellipse (xpos, ypos, ukuranBadan, ukuranBadan);
    fill (warnaMata);
    ellipse (xpos-25, ypos-15, ukuranMata, ukuranMata);
    ellipse (xpos+25, ypos-15, ukuranMata, ukuranMata);
    fill (warnaMulut);
    arc (xpos, ypos+10, lebarMulut, tinggiMulut, 0, PI, CHORD);
  }

  // fungsi untuk bergerak
  void gerak() {
    xpos++;
  }
}

Untuk membuat class kita yang bernama Smiley , maka pertama-tama, kita berikan nama pada class kita, yakni Smiley. Selanjutnya, kita tentukan data-data apa yang harus ada di class ini, agar kita bisa menggambar objek ini, sesuai dengan kesepakatan kita sebelumnya. Di awalnya, ini hanyalah variabel yang dideklarasikan, belum diinisiasi. Perhatikan bahwa variabel-variabel ini kita jadikan variabel global agar bisa digunakan oleh constructor maupun fungsi yang membutuhkan.

Selanjutnya, di dalam constructor, kita berikan isi pada variabel-variabel data. Terakhir, kita definisikan fungsi-fungsi yang kita perlukan, yakni untuk menggambar dan menggerakkan Smiley. Kita berikan nama yang sesuai.

Pada akhirnya, object dari sebuah class bisa kita buat cukup dengan memanggil constructor class tersebut seperti pada contoh sebelumnya. Perhatikan bahwa besarnya huruf tidak boleh salah. Karena kita membuat class dengan nama Smiley, maka pemanggilannya saat pembuatan object juga harus berupa Smiley siSmiley.

Menggunakan Argumen dalam Constructor

Objek, sebagaimana juga data-data lainnya, bisa dibuat berkali-kali untuk menghasilkan objek yang banyak. Namun, dengan mengikuti contoh sebelumnya, kita perhatikan bahwa object Smiley akan selalu muncul di titik yang sama. Sila buktikan dengan program kecil berikut:

Contoh 8-3 Membuat Beberapa Object

// deklarasi object 1 dan 2
Smiley siSmiley;
Smiley siSmiley2;

void setup() {
  size (600, 700);
  // inisialiasi object 1 dan 2
  siSmiley = new Smiley();
  siSmiley2 = new Smiley();
}

void draw() {
  background (140);

  // memanggil fungsi milik object-object
  siSmiley.gerak();
  siSmiley.gambar();

  siSmiley2.gerak();
  siSmiley2.gambar();
}

Hanya ada 1 object, atau sebenarnya object kedua dibuat menimpa object pertama. Ini terjadi karena pada saat membuat kedua object itu, kita memanggil constructor Smiley yang isinya data-data yang isinya tidak berubah, meskipun ia adalah variabel. Untuk mengatasi keterbatasan ini, kita bisa menggunakan argumen dalam constructor.

Dengan menggunakan argumen dalam constructor, maka kita akan memberikan beberapa parameter yang akan digunakan dalam membentuk object. Cara melakukannya juga sederhana, kita cukup menentukan data mana yang akan menerima argumen saat membuat object dengan constructor.

Mari kita buat contoh sederhana, di mana saat membuat constructor untuk Smiley, kita buat ia bisa menerima parameter posisi menggambar.

Contoh 8-4 Menggunakan Argumen dalam Constructor

// deklarasi object
Smiley siSmiley;
Smiley siSmiley2;

void setup() {
  size (600, 700);

  // inisialiasi object
  siSmiley = new Smiley(width/2, height/2);
  siSmiley2 = new Smiley(20, 50);
}

void draw() {
  background (140);

  // memanggil fungsi milik object
  siSmiley.gerak();
  siSmiley.gambar();

  siSmiley2.gerak();
  siSmiley2.gambar();
}

class Smiley {
  int ukuranBadan, lebarMulut, tinggiMulut, ukuranMata, xpos, ypos;
  color warnaMulut, warnaBadan, warnaMata;

  // dalam constructor, kita bisa menerima argumen untuk posisi
  Smiley( int tempxpos, int tempypos ) {
    warnaMulut = color (255);
    warnaMata = color (0);
    warnaBadan = color (200, 200, 0);
    ukuranBadan = 70;
    lebarMulut = 50;
    tinggiMulut = 40;
    ukuranMata = 20;
    xpos = tempxpos;
    ypos = tempypos;
  }

  void gambar() {
    fill (warnaBadan);
    ellipse (xpos, ypos, ukuranBadan, ukuranBadan);
    fill (warnaMata);
    ellipse (xpos-25, ypos-15, ukuranMata, ukuranMata);
    ellipse (xpos+25, ypos-15, ukuranMata, ukuranMata);
    fill (warnaMulut);
    arc (xpos, ypos+10, lebarMulut, tinggiMulut, 0, PI, CHORD);
  }

  void gerak() {
    xpos++;
  }
}

Perhatikan bahwa kali ini kita membuat object Smiley dengan kemampuan untuk menentukan posisinya, sehingga ia dibuat dengan memanggil fungsi new Smiley (20, 50), di mana kedua angka ini berkorepondensi dengan variabel xpos dan ypos dari object kita.

Saat object Smiley dibuat, argumen dalam constructor akan diberikan ke dalam instance variable xpos dan ypos. Sehingga kedua smiley bisa digambar di posisi yang berbeda.

Object adalah Tipe Data

Pada hakikatnya, object adalah juga sebuah tipe data, dengan demikian, kita bisa menyusun class di dalam sebuah class, ataupun menggunakan array untuk menggambar beberapa object yang berbeda dari sebuah class yang sama.

Sebagai contoh, kita akan membuat 100 object Smiley dengan posisi yang berbeda. Dalam hal ini, kita gunakan class yang sama seperti contoh sebelumnya.

Contoh 8-5 Array berisi Object

// deklarasi array berisi object Smiley
Smiley[] siSmiley;

void setup() {
  size (600, 700);

  // array ini berukuran 100
  siSmiley = new Smiley [100];

  // inisialiasi 100 object Smiley
  for (int i = 0; i < 100; i++) {
    siSmiley[i] = new Smiley (int(random(height)), int(random(width)));
  }
}

void draw() {
  background (140);

  // memanggil fungsi milik masing-masing object
  for (int i = 0; i < 100; i++) {
    siSmiley[i].gambar();
  }
}

Perhatikan contoh tadi, lalu bandingkan dengan membuat array berisi integer. Apakah Anda bisa menemukan kesamaan dalam penulisannya?