Posts tagged ‘computer graphics’
Game API di Java Micro Edition
Sebentar lagi masa kuliah semester genap akan berakhir, saatnya untuk liburan panjang… Aku akui liburan panjang hingga bulan September mendatang menyebabkan hampir gaji tiga bulan menjadi ‘kosong’.. Tapi dari sisi lain, liburan ini berarti aku bisa berpesta ria dengan aneka kode program tanpa diganggu sedikit pun. Bayangkan, waktu kerja kantoran dulu, jatah cuti hanya 12 hari selama setahun.. Dan sekarang, sebagai dosen, aku bisa cuti selama dua bulan!!!
Selama mengajar dua semester ini, aku lebih banyak menghabiskan waktu menulis materi di modul kuliah ketimbang menulis di blog. Maklum, itu merupakan salah satu tugas seorang dosen.. Salah satu mata kuliah menarik yang harus aku ajarkan adalah pemograman mobile dengan Java Micro Edition.. Aku sudah sering bermain-main dengan Java Enterprise Edition & Java Standard Edition, tapi baru kali ini menyentuh JME.. Sebagai informasi, aplikasi Android juga diprogram dengan Java, tetapi bukan versi JME.. Aplikasi BlackBerry sendiri mendukung JME, tetapi juga punya pengembangan aplikasi berbasis Java-nya sendiri yang khas untuk BlackBerry.
Salah satu hal menarik yang dari JME adalah dukungan Game API bawaan. Hal ini karena JME banyak dipakai untuk membuat aplikasi game, istilah gaulnya: “game java” sehingga ia disertai dengan peralatan yang sangat membantu dalam pembuatan game. Inti dari Game API di JME adalah class GameCanvas yang merupakan turunan dari class Canvas.
Class GameCanvas menyediakan method getGraphics() dan flushGraphics() untuk mendukung double buffering. Programmer bisa mendapatkan sebuah Graphics dengan memanggil getGraphics(), kemudian menggambar dengan menggunakan context tersebut, baru setelah selesai menggambar dan ingin menampilkan ke layar, ia tinggal memanggil flushGraphics().
Class lain dalam Game API adalah class TiledLayer dan class Sprite. Kedua class tersebut mewakili objek dalam game yang dapat digambar secara otomatis oleh class LayerManager.
Salah satu cara untuk memahami konsep Layer di Game API adalah dengan memanfaatkan Game Builder dari NetBeans IDE. Game Builder bukanlah bagian dari spesifikasi JME, melainkan alat bantu yang ditawarkan oleh NetBeans IDE. Versi terbaru dari NetBeans IDE, yaitu versi 7.0, dapat didownload di http://netbeans.org/community/releases/70/ .
Untuk membuat sebuah Game Builder baru, klik kanan pada nama package, kemudian pilih New, Game Builder… Berikut ini adalah contoh tampilan sample Game Builder dari NetBeans:
Scenes mewakili apa yang akan ditampilkan di layar nantinya, terdiri atas satu atau lebih TiledLayer dan Sprite.
TiledLayer adalah sebuah layer yang terdiri atas kotak-kotak dimana setiap ‘kotak’ ini diisi dengan gambar tertentu. Perancang game harus membuat sebuah file gambar yang merupakan gabungan dari seluruh elemen yang dapat di-isi-kan ke dalam TiledLayer tersebut. Contoh file gambarnya seperti:
Game Builder menawarkan kemudahan untuk mengisi setiap kotak atau ’tile’ yang ada di gambar secara visual, seperti yang terlihat di gambar berikut:
Pembuat game dapat memisahkan setiap elemen interaksi yang berbeda ke dalam TiledLayer yang berbeda. Misalnya sebuah TiledLayer untuk background game, dan sebuah TiledLayer lagi untuk mewakili bebatuan atau penghalang. Dengan demikian, pada saat karakter utama bergerak, programmer dapat memanggil method collidesWith() untuk memeriksa apakah karakter bersinggungan dengan TiledLayer tertentu.
Karakter yang ada di game diwakili oleh class Sprite. Game Builder menyediakan editor visual untuk merancang dan memutar animasi sebuah Sprite seperti pada contoh tampilan berikut ini:
Setelah selesai merancang TiledLayer dan Sprite, yang harus dilakukan berikutnya adalah menggambar mereka di layar dengan menggunakan method paint() dari LayerManager. Jangan khawatir soal pergeseran layar karena programmer dapat memanggil method setViewWindow() milik LayerManager untuk mengkliping layar.
Berikut ini adalah contoh tampilan hasil game yang dibuat dengan Game Builder bila dijalankan menggunakan emulator bawaan JME:
Full-screen Exclusive API: Menggambar Satu Layar Penuh
Tidak semua program puas menggambar di komponen Swing. Passive rendering yang memakai method paint(Graphics g) tidak sesuai untuk program grafis yang harus memiliki performance tinggi. Contohnya adalah program game, yang umumnya memakai full-screen active rendering. Umumnya, program seperti game memakai bantuan API DirectX atau OpenGL. Java juga mendukung penggambaran full-screen dengan double-buffering berupa page-flipping. Tapi karena Java dirancang untuk multi-platform, tidak seluruh platform mendukung fitur ini. Aku dapat memeriksanya dengan kode seperti berikut:
GraphicsEnvironment env = GraphicsEnvironment.
getLocalGraphicsEnvironment();
GraphicsDevice gd = env.getDefaultScreenDevice();
if (gd.isFullScreenSupported()) {
System.out.println("Fullscreen API is supported.");
} else {
System.out.println("Fullscreen API is not supported.");
}
if (gd.isDisplayChangeSupported()) {
System.out.println("Display resolution change is supported.");
} else {
System.out.println("Display resolution change is not supported.");
}
DisplayMode dm = gd.getDisplayMode();
System.out.format("Display resolution %d x %d (%d bit, refresh rate %d Hz)",
dm.getWidth(), dm.getHeight(), dm.getBitDepth(), dm.getRefreshRate());
Sekarang aku akan latihan membuat sebuah program yang menggambar full screen sekumpulan lingkaran dengan posisi dan warna yang acak, seperti berikut:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
public class Main extends JFrame {
private static final long serialVersionUID = 4648172894076113183L;
public Main() {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
setUndecorated(false);
setResizable(false);
setIgnoreRepaint(true);
device.setFullScreenWindow(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
createBufferStrategy(2);
BufferStrategy buffer = getBufferStrategy();
Graphics g;
List<LingkaranWarna> lstLingkaran = new ArrayList<LingkaranWarna>();
while (true) {
if (lstLingkaran.size()<100) {
lstLingkaran.add(new LingkaranWarna());
} else {
lstLingkaran.clear();
}
g = buffer.getDrawGraphics();
g.clearRect(0,0, getWidth(), getHeight());
for (LingkaranWarna b : lstLingkaran) {
b.gambar(g);
}
g.dispose();
buffer.show();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
protected class LingkaranWarna {
private int lokasiX;
private int lokasiY;
private Color warna;
private int sizeX;
private int sizeY;
public LingkaranWarna() {
atributBaru();
}
private void atributBaru() {
Random rand = new Random();
lokasiX = rand.nextInt(1000);
lokasiY = rand.nextInt(600);
warna = new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
sizeX = rand.nextInt(100);
sizeY = rand.nextInt(100);
}
private void gambar(Graphics g) {
g.setColor(warna);
g.fillOval(lokasiX, lokasiY, sizeX, sizeY);
atributBaru();
}
}
public static void main(String[] args) {
new Main();
}
}




