Tutorial 10

BAGAIMANA DENGAN TUBRUKAN!?

CollisionManager.java [view online]
Bab ini menjelaskan sistem tubrukan dalam GTGE untuk mendeteksi tubrukan antar sprite.
Tujuan : Mengerti sistem tubrukan GTGE, jenis-jenis tubrukan, dan cara pemakaiannya.
collapse/expand

Seperti telah dijelaskan di bab sebelum, sistem tubrukan pada GTGE adalah mengecek tubrukan antara sprite dalam suatu grup (SpriteGroup) dengan sprite dalam grup lainnya.

Sebagai contoh :
Dalam game shooter dibuat 6 grup sprite berikut : grup player, grup tembakan player, grup musuh, grup tembakan musuh, grup asteroid, dan grup bonus.
Tubrukan dapat dideteksi antara : grup player <-> grup musuh, tembakan musuh, asteroid, dan bonus; sementara grup musuh <-> grup player dan tembakan player; dan sebagainya.

Dengan menggunakan sistem pendeteksian tubrukan berdasarkan grup seperti ini, pengorganisasian implementasi dari tubrukan menjadi sangat mudah. Misalnya dalam contoh game shooter di atas dapat dibuat implementasi tubrukan sebagai berikut : bila terjadi tubrukan grup tembakan player <-> grup musuh, sprite yang bertubrukan dalam grup musuh diset untuk hancur dan sprite dalam grup tembakan player diset untuk lenyap; sedangkan untuk tubrukan grup player <-> grup bonus, set energi, nilai, ataupun power player untuk bertambah dan set bonus yang bertubrukan untuk lenyap.

Selain memudahkan implementasi tubrukan, sistem tubrukan seperti ini juga memudahkan pembacaan dan penulisan kode program, meningkatkan kecepatan pendeteksian tubrukan, dan lain-lain.

Dasar Pendeteksian Tubrukan

Fondasi dari sistem tubrukan pada GTGE adalah class CollisionManager. Class CollisionManager merupakan dasar dari seluruh jenis sistem tubrukan yang disediakan oleh GTGE.

Cara kerja class CollisionManager, yakni :

  1. Meregister 2 grup yang akan dideteksi tubrukannya :
    class :: CollisionManager
    
    Syntax:
       public void setCollisionGroup(SpriteGroup group1,
                                     SpriteGroup group2);
    
    dimana :
    group1 = grup 1 yang akan diregister untuk sistem tubrukan ini
    group2 = grup 2 yang akan diregister untuk sistem tubrukan ini
    
    
    Misal:
    meregister tubrukan antara grup tembakan player dengan grup musuh
    
       SpriteGroup       PLAYER_SHOT_GROUP,
                         ENEMY_GROUP;
    
       CollisionManager  collisionType;
    
    
       collisionType.setCollisionGroup(PLAYER_SHOT_GROUP, ENEMY_GROUP);
    
  2. Mengecek apakah tubrukan terjadi atau tidak :
    Bagaimana cara pengecekannya diserahkan sepenuhnya kepada turunan (subclass) dari class CollisionManager.
    class :: CollisionManager
    
    Syntax:
       public abstract void checkCollision();
    
    
    Misal:
    meregister dan mengecek tubrukan antara grup tembakan player dengan grup musuh
    
       SpriteGroup       PLAYER_SHOT_GROUP,
                         ENEMY_GROUP;
    
       CollisionManager  collisionType;
    
    
       collisionType.setCollisionGroup(PLAYER_SHOT_GROUP, ENEMY_GROUP);
    
       collisionType.checkCollision();
    

Jenis-Jenis Tubrukan

Seperti telah disebutkan diatas, class CollisionManager menyerahkan sepenuhnya bagaimana pendeteksian tubrukan kepada turunannya (subclassnya). Untuk itu GTGE menyediakan 5 jenis pendeteksian tubrukan (turunan class CollisionManager), yakni :

  • BasicCollisionGroup class
    Jenis tubrukan yang paling mendasar, hanya mendeteksi apakah tubrukan terjadi atau tidak.
  • CollisionGroup class
    Mendeteksi apakah tubrukan terjadi atau tidak beserta dengan beberapa informasi mengenai tubrukan tersebut, seperti sisi yang bertubrukan dan posisi sebelum tubrukan terjadi.
  • PreciseCollisionGroup class
    Posisi sebelum tubrukan terjadi dihitung secara tepat, sehingga sprite yang bertubrukan dapat kembali tepat sebelum tubrukan terjadi.
  • AdvanceCollisionGroup class
    Jenis tubrukan yang dapat mendeteksi tubrukan antara satu sprite dengan banyak sprite sekaligus dalam sekali waktu, misalnya tubrukan antara player dengan blok yang dipijaknya, player dapat berpijak dalam beberapa blok sekaligus dan player mesti berhenti tepat diatas blok-blok tersebut.
  • CollisionBounds class
    Mendeteksi tubrukan suatu sprite dengan kotak pembatas, misalnya gerak sprite dibatasi oleh area latar, apabila keluar dari area latar maka tubrukan terjadi.

Selalu usahakan untuk menggunakan jenis tubrukan yang tepat agar pendeteksian tubrukan dapat dilakukan secara optimal dan efisien. Misalnya bila Anda hanya ingin mengetahui apakah tubrukan terjadi antara 2 grup tanpa perlu hal lainnya (seperti sisi yang bertubrukan, atau posisi tubrukan) maka cukup gunakan BasicCollisionGroup class.

Implementasi Tubrukan

Seluruh jenis tubrukan diatas mengirimkan event tubrukan kefungsi collided(Sprite s1, Sprite s2), dimana difungsi inilah implementasi dari tubrukan dikerjakan. Apakah setelah tubrukan sprite yang bertubrukan berhenti, atau dikeluarkan dari permainan, dll.

class :: BasicCollisionGroup

Syntax:
   public abstract void collided(Sprite s1,
                                 Sprite s2);

dimana :
s1 = sprite dari grup 1 yang bertubrukan
s2 = sprite dari grup 2 yang bertubrukan

Inisialisasi Dan Pendeteksian Tubrukan

Tutorial10.java [view online]

Agar pendeteksian tubrukan dapat dikerjakan, terlebih dahulu turunkan (subclass) jenis tubrukan yang diinginkan untuk membuat dasar atau prototipe dari tubrukan. Misalnya membuat prototipe tubrukan dengan mensubclass BasicCollisionGroup untuk mendeteksi tubrukan antara tembakan player dengan musuh :

file :: PlayerShotToEnemyCollision.java

// GTGE
import com.golden.gamedev.object.*;
import com.golden.gamedev.object.collision.*;


public class PlayerShotToEnemyCollision extends BasicCollisionGroup {

   public void collided(Sprite s1, Sprite s2) {
      // s1 = player shot sprite
      // s2 = enemy sprite

      // we make both of sprites to vanish!
      s1.setActive(false);
      s2.setActive(false);
   }

}

Kode program diatas masih berupa prototipe, agar pendeteksian tubrukan dikerjakan, buat objek class tubrukan dari prototipe tersebut dan registerkan grup tembakan player dan grup musuh kedalamnya :

   SpriteGroup       PLAYER_SHOT_GROUP,
                     ENEMY_GROUP;

   CollisionManager  collisionType;


   collisionType = new PlayerShotToEnemyCollision();

   collisionType.setCollisionGroup(PLAYER_SHOT_GROUP, ENEMY_GROUP);

   collisionType.checkCollision();

Untuk menggunakan jenis tubrukan yang lain, misalnya CollisionGroup, cukup dengan mengubah BasicCollisionGroup menjadi CollisionGroup. Untuk melihat keseluruhan fungsi yang disediakan oleh jenis tubrukan yang digunakan (misalnya fungsi untuk mengetahui sisi tubrukan) lihat di dokumentasi API class jenis tubrukan yang bersangkutan.

Tubrukan Pixel

Class BasicCollisionGroup dan turunannya mensupport pendeteksian tubrukan tahap pixel. Untuk menggunakannya cukup set variabel pixelPerfectCollision menjadi true :

class :: BasicCollisionGroup

Syntax:
    boolean pixelPerfectCollision;


Misal:
mengeset deteksi tubrukan sampai tahap pixel pada
tubrukan antara tembakan player dan musuh pada contoh di atas

   BasicCollisionGroup collisionType = new PlayerShotToEnemyCollision();
   collisionType.pixelPerfectCollision = true;

Contoh Lengkap

Contoh penggunaan sistem tubrukan dalam GTGE dengan menggunakan jenis tubrukan yang paling dasar (BasicCollisionGroup class) dimana pengecekan tubrukan dilakukan sampai tahap pixel :

file :: YourGame.java

// JFC
import java.awt.*;

// GTGE
import com.golden.gamedev.*;
import com.golden.gamedev.object.*;
import com.golden.gamedev.object.background.*;
import com.golden.gamedev.object.collision.*;


public class YourGame extends Game {


    Background   background;

    SpriteGroup  PLAYER_SHOT_GROUP,
    SpriteGroup  ENEMY_GROUP;

    CollisionManager collisionType;


    public void initResources() {
        background = new ColorBackground(Color.BLUE, 640, 480);

        PLAYER_SHOT_GROUP = new SpriteGroup("Player Shot Group");
        ENEMY_GROUP = new SpriteGroup("Enemy Group");

        collisionType = new PlayerShotToEnemyCollision();
        collisionType.setCollisionGroup(PLAYER_SHOT_GROUP, ENEMY_GROUP);
    }


    public void update(long elapsedTime) {
        background.update(elapsedTime);

        PLAYER_SHOT_GROUP.update(elapsedTime);
        ENEMY_GROUP.update(elapsedTime);

        collisionType.checkCollision();
    }


    public void render(Graphics2D g) {
        background.render(g);

        PLAYER_SHOT_GROUP.render(g);
        ENEMY_GROUP.render(g);
    }


    public static void main(String[] args) {
        GameLoader game = new GameLoader();
        game.setup(new YourGame(), new Dimension(640,480), false);
        game.start();
    }

}

class PlayerShotToEnemyCollision extends BasicCollisionGroup {

    public PlayerShotToEnemyCollision() {
	pixelPerfectCollision = true;
    }

    public void collided(Sprite s1, Sprite s2) {
        // s1 = player shot sprite
        // s2 = enemy sprite

        // make both sprites to vanish!
        s1.setActive(false);
        s2.setActive(false);
    }

}


Kesimpulan :

  • Sistem tubrukan dalam GTGE adalah mendeteksi tubrukan antar sprite dalam 2 grup.
  • Class CollisionManager adalah dasar dari sistem tubrukan pada GTGE, dimana tugas utamanya adalah meregister grup yang akan dideteksi tubrukannya dengan fungsi setCollisionGroup(SpriteGroup, SpriteGroup), dan mengecek tubrukan yang sebenarnya dengan fungsi checkCollision().
  • Terdapat 5 jenis tubrukan dalam GTGE (turunan dari class CollisionManager), yakni BasicCollisionGroup, CollisionGroup, PreciseCollisionGroup, AdvanceCollisionGroup, dan CollisionBounds. Selalu usahakan untuk menggunakan jenis yang tepat untuk mengefisienkan kinerja game.
  • Untuk menginisialisasi tubrukan, turunkan (subclass) jenis tubrukan yang diinginkan, bentuk objek dari class tersebut, register grup-grup yang akan dideteksi, dan deteksi tubrukan dengan memanggil fungsi checkCollision().
  • Untuk menghidupkan pendeteksian tubrukan sampai tahap pixel, set nilai pixelPerfectCollision menjadi true.

Referensi : CollisionManager class, BasicCollisionGroup class, Package com.golden.gamedev.object.collision

Copyright © 2003-2005 Golden T Studios. All rights reserved. Use is subject to license terms.
GoldenStudios.or.id
Halaman 10 dari 12