Pada bab sebelum (pendekatan manajemen sprite yang pertama) telah dijelaskan bagaimana sprite perlu diupdate, dirender, dan diletakkan di latar yang diinginkan satu per satu. Hal ini akan sangat merepotkan dan mungkin tidak dapat terorganisir lagi apabila sprite berjumlah sangat banyak.
Sebagai contoh untuk memanage 9 sprite :
file :: YourGame.java // JFC import java.awt.*; // GTGE import com.golden.gamedev.*; import com.golden.gamedev.object.*; import com.golden.gamedev.object.background.*; public class YourGame extends Game { Background background; Sprite s1, s2, s3, s4, s5, s6, s7, s8, s9; public void initResources() { background = new ColorBackground(Color.BLUE, 1024, 768); s1 = new Sprite(getImage("player.png")); s2 = new Sprite(getImage("player.png")); s3 = new Sprite(getImage("player.png")); s4 = new Sprite(getImage("player.png")); s5 = new Sprite(getImage("player.png")); s6 = new Sprite(getImage("player.png")); s7 = new Sprite(getImage("player.png")); s8 = new Sprite(getImage("player.png")); s9 = new Sprite(getImage("player.png")); s1.setBackground(background); s2.setBackground(background); s3.setBackground(background); s4.setBackground(background); s5.setBackground(background); s6.setBackground(background); s7.setBackground(background); s8.setBackground(background); s9.setBackground(background); } public void update(long elapsedTime) { background.update(elapsedTime); s1.update(elapsedTime); s2.update(elapsedTime); s3.update(elapsedTime); s4.update(elapsedTime); s5.update(elapsedTime); s6.update(elapsedTime); s7.update(elapsedTime); s8.update(elapsedTime); s9.update(elapsedTime); } public void render(Graphics2D g) { background.render(g); s1.render(g); s2.render(g); s3.render(g); s4.render(g); s5.render(g); s6.render(g); s7.render(g); s8.render(g); s9.render(g); } public static void main(String[] args) { GameLoader game = new GameLoader(); game.setup(new YourGame(), new Dimension(640,480), false); game.start(); } }
Untuk 9 sprite yang dapat dikategorikan sebagai jumlah yang sangat kecil untuk sebuah game pengorganisasiannya sudah cukup sulit. Disini mungkin Anda berpikir mengapa tidak menggunakan array, hal itu mungkin saja, tetapi bagaimana bila sprite tersebut dapat berkurang dan bertambah sesuai kebutuhan? Pengolahan array untuk membuang dan menambah isi array cukup sulit dilakukan, belum lagi untuk menentukan letak sprite yang akan dibuang/ditambah pada array tersebut.
Untuk itu GTGE menawarkan pendekatan manajemen sprite yang kedua, yakni mengumpulkan seluruh sprite ke dalam grup-grup dimana gruplah yang secara otomatis meletakkan member sprite dalam grupnya ke suatu latar, serta mengupdate, dan merender membernya.
Grup ini dalam GTGE diwakili dengan SpriteGroup class, yang intinya merupakan sebuah array yang dapat membesar dan mengecil sesuai kebutuhan.

Inisialisasi SpriteGroup
Inisialisasi SpriteGroup, meletakkan sprite dalam grup ke suatu latar, mengupdate serta merender member grup ke layar tidak berbeda jauh dengan kode program pada Sprite class :
class :: SpriteGroup Syntax: public SpriteGroup(String name); public void setBackground(Background backgr); public void update(long elapsedTime); public void render(Graphics2D g); dimana : name = nama dari grup, hanya sebagai penanda atau untuk membedakan satu grup dengan grup lainnya backgr = latar yang akan diasosiasikan ke grup ini setiap sprite dalam grup ini akan menggunakan latar ini elapsedTime = waktu yang terlewat semenjak update terakhir nilai ini didapat dari Game class g = objek grafis tempat grup akan digambar
Menambah Sprite ke dalam Grup
SpriteGroup yang baru terbentuk belum berisi sprite (masih kosong). Untuk menambah sprite ke dalam grup tersebut gunakan fungsi SpriteGroup.add(Sprite) :
class :: SpriteGroup Syntax: public void add(Sprite member); dimana : member = sprite yang akan ditambahkan ke dalam grup
Contoh memanage 9 sprite di atas dengan menggunakan SpriteGroup berubah menjadi :
Tutorial9_1.java [view online]
file :: YourGame.java // JFC import java.awt.*; // GTGE import com.golden.gamedev.*; import com.golden.gamedev.object.*; import com.golden.gamedev.object.background.*; public class YourGame extends Game { Background background; SpriteGroup PLAYER_GROUP; // we use sprite group's variable name // in UPPERCASE public void initResources() { background = new ColorBackground(Color.BLUE, 1024, 768); PLAYER_GROUP = new SpriteGroup("Player Group"); PLAYER_GROUP.setBackground(background); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); PLAYER_GROUP.add(new Sprite(getImage("player.png"))); } public void update(long elapsedTime) { background.update(elapsedTime); PLAYER_GROUP.update(elapsedTime); } public void render(Graphics2D g) { background.render(g); PLAYER_GROUP.render(g); } public static void main(String[] args) { GameLoader game = new GameLoader(); game.setup(new YourGame(), new Dimension(640,480), false); game.start(); } }Dengan menggunakan
SpriteGroup memanage banyak sprite dapat dilakukan dengan mudah. Tidak diperlukan lagi adanya referensi objek sprite, meletakkan sprite ke latar tertentu satu per satu, mengupdate, dan merender sprite satu per satu.
Mengeluarkan Sprite dari Grup
Tutorial9_2.java [view online]Untuk mengeluarkan suatu sprite dari suatu grup (bila sprite telah mati) cukup dengan menon-aktifkan sprite tersebut dengan fungsi Sprite.setActive(false), dan sprite tersebut akan secara otomatis dikeluarkan dari grup tempat dia berada.
class :: Sprite Syntax: public void setActive(boolean b); dimana : b = status aktif dari sprite, false maka sprite tidak aktif (mati) sprite yang tidak aktif akan dikeluarkan dari grup dimana dia berada
Cara Pengelompokan Sprite Dengan Tepat
Ada satu hal yang perlu diperhatikan dalam mengelompokkan sprite, yakni bahwa pengelompokkan sprite ini juga akan digunakan dalam pendeteksian tubrukan. Sistem tubrukan pada GTGE adalah mendeteksi tubrukan antara sprite-sprite antar grup. Jadi sebelum mengelompokkan sprite, terlebih dahulu perhatikan kelompok-kelompok sprite yang dapat saling bertubrukan.
Sebagai contoh dalam game shooter, Anda dapat membuat 6 kelompok sebagai berikut : player, tembakan player, musuh, tembakan musuh, asteroid, dan bonus. Anda kemudian dapat membuat sistem tubrukan dengan mudah seperti : player dapat bertubrukan dengan musuh, tembakan musuh, asteroid, dan bonus; sementara musuh dapat bertubrukan dengan player dan tembakan player; dan sebagainya.
Catatan Penting Lainnya
Yang perlu diperhatikan pada pendekatan kedua ini adalah, masing-masing grup masih tetap harus diasosiasikan ke latar yang diinginkan, diupdate, dan dirender satu per satu.
file :: YourGame.java // JFC import java.awt.*; // GTGE import com.golden.gamedev.*; import com.golden.gamedev.object.*; import com.golden.gamedev.object.background.*; public class YourGame extends Game { Background background; SpriteGroup PLAYER_GROUP, PLAYER_SHOT_GROUP, ENEMY_GROUP, ENEMY_SHOT_GROUP, ASTEROID_GROUP, BONUS_GROUP; public void initResources() { background = new ColorBackground(Color.BLUE, 1024, 768); PLAYER_GROUP = new SpriteGroup("Player Group"); PLAYER_SHOT_GROUP = new SpriteGroup("Player Shot Group"); ENEMY_GROUP = new SpriteGroup("Enemy Group"); ENEMY_SHOT_GROUP = new SpriteGroup("Enemy Shot Group"); ASTEROID_GROUP = new SpriteGroup("Asteroid Group"); BONUS_GROUP = new SpriteGroup("Bonus Group"); PLAYER_GROUP.setBackground(background); PLAYER_SHOT_GROUP.setBackground(background); ENEMY_GROUP.setBackground(background); ENEMY_SHOT_GROUP.setBackground(background); ASTEROID_GROUP.setBackground(background); BONUS_GROUP.setBackground(background); } public void update(long elapsedTime) { background.update(elapsedTime); PLAYER_GROUP.update(elapsedTime); PLAYER_SHOT_GROUP.update(elapsedTime); ENEMY_GROUP.update(elapsedTime); ENEMY_SHOT_GROUP.update(elapsedTime); ASTEROID_GROUP.update(elapsedTime); BONUS_GROUP.update(elapsedTime); } public void render(Graphics2D g) { background.render(g); PLAYER_GROUP.render(g); PLAYER_SHOT_GROUP.render(g); ENEMY_GROUP.render(g); ENEMY_SHOT_GROUP.render(g); ASTEROID_GROUP.render(g); BONUS_GROUP.render(g); } public static void main(String[] args) { GameLoader game = new GameLoader(); game.setup(new YourGame(), new Dimension(640,480), false); game.start(); } }