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 :
- 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);
- Mengecek apakah tubrukan terjadi atau tidak :
Bagaimana cara pengecekannya diserahkan sepenuhnya kepada turunan (subclass) dari classCollisionManager.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); } }