Collision dan Iterator di game Fruit Keeper

Untuk penulis kode otodidak yang tidak mempunyai pengalaman maupun template lengkap yang berhubungan dengan game, tentunya pernah mendapatkan masalah dalam pengkodean yg kadang membuat stress, harus berlama-lama dengan kode yang sama demi untuk memecahkan suatu masalah, namun tidak juga ditemukan solusinya, apalagi sudah dikejar-kejar deadline untuk segera rilis game, benar-benar bikin stressss!! :-( . Pengalaman ini pernah saya alami juga sewaktu mengembangkan gameFruit Keeper, salah satu masalah yang muncul yaitu pergerakan dan collision antara object bergerak dalam game, contohnya yaitu burung dan Ammo. Untuk mengontrol pergerakan setiap object yg bergerak saya menggunakan Iterator, namun masalah yang timbul adalah bagaimana menggabungkan pergerakan dan pemeriksaan Collision dengan object lainnya?
Setelah coba ini coba itu, akhirnya saya menemukan solusi untuk Collision dan Iterator di game Fruit Keeper.
Solusinya yaitu dengan memisahkan antara Iterator pergerakan dan Iterator collision, kekuragannya terdapat 2 blok kode perulangan Iterator dengan bantuan while, hal ini tentunya akan membebani kinerja prosesor smartphone yang terbatas. Berikut adalah ilustrasi game dan penggalan kode dari game.

Ilustrasi Collision dan Iteration pada game Fruit Keeper


Berikut baris kode Iterator untuk nomor 1 dan 3

//============= AMMO FIRE =============
1   Iterator<AmmoObject> iterAmmo = ammoObjects.iterator();
2
3   while(iterAmmo.hasNext()) {
4      AmmoObject ao = iterAmmo.next();
5      ao.moveUp(delta);
6
7      if(ao.isOutOfScreen()) {
8          iterAmmo.remove();
9      }
10  } //end while
//=====================================

Keterangan kode untuk nomor 1 dan 3 sebagai berikut:
Kode baris ke
  • 1: menghubungkan class AmmoObject yg ada di dalam array ammoObjects ke dalam iterator.
  • 3: perulangan akan terjadi jika ada object dalam ammoObjects (memeriksa Ammo yang ditembakan).
  • 4: menghubungkan class AmmoObject dengan item Iterator.
  • 5: menggerakan AmmoObject ke atas.
  • 7: pengecekan AmmoObject jika sudah keluar layar, dalam hal ini melebihi tinggi layar. Kemudian menghapus AmmoObject seperti pada baris kode nomor 8.
  • 8: menghapus AmmoObject dari array ammoObjects. Ini berarti menghapus Ammo dari layar dan memori.

Berikut baris kode untuk nomor 1 dan 2

//============== FLYING BIRD =============
1   Iterator<BirdObject> iterBird = birdObjects.iterator();
2
3   while (iterBird.hasNext()) {
4       BirdObject bo = iterBird.next();
5       bo.moveFly(delta);
6
7       if(bo.isOutOfScreen()) {
8          iterBird.remove();
9       }
10
11      //=== ammo overlapping with bird (AMMO HIT BIRD) ===
12      Iterator<AmmoObject> iterAmmo1 = ammoObjects.iterator();
13
14      while(iterAmmo1.hasNext()) {
15          AmmoObject ao = iterAmmo1.next();
16
17          if(ao.isOverlapping(bo.getPosition())) {
18              soundManager.playHitSound();
19
20              iterAmmo1.remove();
21
22              //hit animation
23              //score animation
24
25              iterBird.remove();
26          }
27
28      } //end while (iterAmmo1.hasNext())
29  } //end while (iterBird.hasNext())

Keterangan kode untuk nomor 1 dan 3 sebagai berikut:
Kode baris ke
  • 1: menghubungkan class BirdObject yg ada di dalam array birdObjects ke dalam iterator.
  • 3: perulangan akan terjadi jika ada object dalam birdObjects (memeriksa burung yg terbang).
  • 4: menghubungkan class BirdObject dengan item Iterator.
  • 5: menggerakan BirdObject (burung terbang).
  • 7: pengecekan jika BirdObject sudah keluar layar, dalam hal ini sebelah kanan atau kiri layar. Kemudian menghapus BirdObject seperti pada baris kode nomor 8.
  • 8: menghapus BirdObject dari array birdObjects. Ini berarti menghapus Burung dari layar dan memori.
  • 12: menghubungkan class AmmoObject yg ada di dalam array ammoObjects ke dalam iterator.
  • 14: perulangan akan terjadi jika ada object dalam ammoObjects.
  • 15: menghubungkan class AmmoObject dengan item Iterator.
  • 17: pengecekan terjadi persinggungan antara posisi burung dan ammo. Persinggungan ini menggunakan persegi empat, sehingga ada kemungkinan persinggungan yang agak aneh terjadi pada game, yaitu gambar burung tidak bersentuhan dengan ammo, namun dinyatakan burung tertembak, karena ujung-ujung persegi empat bisa merupakan bukan ujung gambar.
  • 18 – 25: jika persinggungan terjadi, mainkan suara burung yang tertembak, hapus ammo yang menembak burung dan hapus burung yang tertembak, bisa juga menambahkan animasi lainnya.

Demikian solusi yang saya temukan untuk Collision dan Iterator antara object yang bergerak dalam game Fruit Keeper, ini sebagai pengalaman yang berharga bagi saya.

Referensi pemecahan masalah selain dari wiki LibGDX juga dari forum Stackoverflow dan Java-gaming.org, serta situs lainnya.

Jika ada penggunaan kata yang kurang dimengerti atau tidak tepat, silahkan berikan komentarnya, untuk kenyamanan akan saya perbaiki. Itulah bahasa pemrograman yg saya fahami secara sederhana.


Tetap Berkreasi dengan Creative di DoyanCreative.com

Tidak ada komentar:

Posting Komentar

Game Edukasi Anak Terbaru

Setelah cukup lama tidak release app terbaru, sekarang baru bisa release kembali game edukasi terbaru. Game ini saya beri judul Game Eduka...

Terpopuler di Blog