Bagi yang terbiasa dengan lingkungan windows khususnya Vista, pasti udah ga asing banget dengan Bubble Screensaver. Itu loh yang ntar di layar muncul balon-balon. Trus mantul kalau kena sisi monitor. Nah, saya mencoba membuat screen saver itu menggunakan bahasa JAVA. Hmmm… versi sederhananya lah. Walaupun ga mirip-mirp amat, yang penting kan kita jadi tau konsep bola memantul ama Transparent Window.
Yang Transparent Windows lupain dulu. Kita coba buat bola-bola yang bisa matul aja dulu. Btw kok bisa matul ya… Perhatikan skrip di bawah :
72: private int x,y,xC=2,yC=-2,ballSize = 100;
trus
85: public void move(){
86: x+=xC;
87: y+=yC;
88: if (x<=0){
89: x=0;xC=2;
90: }
91: if (x>=width-ballSize){
92: x=width-ballSize;xC=-2;
93: }
94: if (y<=0){
95: y=0;yC=2;
96: }
97: if (y>=height-ballSize){
98: y=height-ballSize;yC=-2;
99: }
100: }
Variabel x dan y adalah posisi bola, sedangkan xC dan yC digunakan sebagai increment yang menentukan arah bola. Tepatnya xC untuk pergerakan horizontal sedangkan yC untuk vertikal. Pasti udah tau donk kalau koordinat titik 0 (0,0) di monitor kita itu berada di sudut kiri atas. Ga tau?? barusan udah saya kasih tau
. Kalau udah tau kondisinya seperti itu, jadi untuk menggerakkan bola ke kanan atau ke kiri,kita tinggal set nilai xC ke positif atau negatif. Demikian juga yC untuk pergerakan secara vertikal. Sedangkan value xC dan yC menentukan kecepatan bola.
Nah, supaya dia bisa mantul, kita ubah nilai xC atau yC kalau posisi bola (x,y) sudah mencapai batas maksimal atau minimal dari ukuran monitor kita.
Untuk membuat Multiple ball, saya menggunakan class java.util.ArrayList. Fungsinya mirip dengan array. Untuk menyimpan objek tertentu.
Kenapa untuk frame saya memakai JWindow bukan JFrame???… Jawabannya, supaya program ini tidak muncul di taskbar. Program ini kan judulnya Screensaver, jadi kita buat seolah-olah tidak ada program yang jalan. Makanya jejak program di taskbar harus di lenyapkan. Kalau pakek JFrame, taskbarnya ga bs (atau ga tau
) diilangin.
Untuk ukuran frame, kita set ke ukuran maksimal monitor. Informasi ukuran layar di peroleh dengan bantuan class java.awt.Toolkit. Terus set AlwaysOnTop ke true supaya tidak ada window lain yang mengganggu keindahan program ini.
Nah sekarang Transparent Windows. Bagaimana cara membuat transparent window di JAVA?. Atau lebih tepatnya bagaimana membuat window kelihatan transparant?. Lha, kok ‘kelihatan’?. Transparent disini memang bukan transparent yang sebenarnya. Walaupun berbau penipuan, tapi emang gitu konsepnya. Program – program yang windownya transparent juga kebanyakan pake konsep ini kok. Jadi kita buat lingkungan di frame sesuai dengan lingkungan di belakangnya. Jadi sebelum program ini muncul, kita PrintScreen dulu tampilan window saat itu. yaitu dengan bantuan class java.awt.Robot (btw kok namanya robot y, ga nyambung banget dengan fungsinya…tw ah…). Kalau udah di Printscreen trus di convert ke image (BufferedImage) trus di tempelin deh di framenya. Jadi deh Window (seolah-olah) Transparent, tinggal di praktekin aja.
Program ini masih dalam pengembangan. Rencananya mo di tambahin fitur : bola mantul kalau saling bertabrakan sama efek gravitasi. Hmmm… ntar deh kalau ada waktu mo riset lagi. Sementara gini aja dulu, sekarang lagi sibuk PLA uy, jadi ga sempat buat menyalurkan hobi “programming for fun” gw T_T.
Source Code :
1: import javax.swing.JPanel;
2: import javax.swing.SwingUtilities;
3: import javax.swing.JWindow;
4: import java.util.*;
5: import java.awt.*;
6: import java.awt.event.*;
7: import java.awt.image.*;
8: import java.awt.geom.*;
9:
10: public class Bola extends JWindow{
11: private ArrayList balls = new ArrayList();
12: private Timer timer;
13: private TimerTask task;
14: private int counter;
15: private Robot robot;
16: private BufferedImage image;
17: private Dimension windowDimension;
18: public Bola(){
19: super();
20: windowDimension = Toolkit.getDefaultToolkit().getScreenSize();
21: try {
22: robot = new Robot();
23: }
24: catch (Exception e){
25: System.out.print(e.getMessage());
26: }
27: timer = new Timer();
28: task = new TimerTask(){
29: public void run(){
30: if (counter%100==0 && balls.size()<=20){
31: balls.add(new ball(windowDimension));
32: }
33: for (int i = 0;i < balls.size(); i++){
34: ball b = (ball)balls.get(i);
35: b.move();
36: }
37: counter++;
38: repaint();
39: }
40: };
41: timer.schedule(task,0,1);
42: setSize(windowDimension);
43: setAlwaysOnTop(true);
44: setVisible(true);
45: addMouseListener(new MouseAdapter(){
46: public void mousePressed(MouseEvent m){
47: System.exit(1);
48: }
49: });
50: image = robot.createScreenCapture(new Rectangle(this.getLocationOnScreen(),windowDimension));
51: add(new JPanel(){
52: public void paintComponent(Graphics g){
53: Graphics2D g2 = (Graphics2D)g;
54: g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
55: g2.drawImage(image,0,0,null);
56: for (int i = 0;i < balls.size(); i++){
57: ball b = (ball)balls.get(i);
58: b.draw(g2);
59: }
60: }
61: });
62: }
63: public static void main(String[] args){
64: SwingUtilities.invokeLater(new Runnable(){
65: public void run(){
66: new Bola();
67: }
68: });
69: }
70: }
71: class ball {
72: private int x,y,xC=2,yC=-2,ballSize = 100;
73: private Random rand;
74: private int width,height;
75: public ball(Dimension dimension){
76: rand = new Random();
77: width = (int)dimension.getWidth();
78: height = (int)dimension.getHeight();
79: x = 0;
80: y = rand.nextInt(height-ballSize);
81: }
82: public void draw(Graphics2D g2){
83: g2.drawOval(x,y,ballSize,ballSize);
84: }
85: public void move(){
86: x+=xC;
87: y+=yC;
88: if (x<=0){
89: x=0;xC=2;
90: }
91: if (x>=width-ballSize){
92: x=width-ballSize;xC=-2;
93: }
94: if (y<=0){
95: y=0;yC=2;
96: }
97: if (y>=height-ballSize){
98: y=height-ballSize;yC=-2;
99: }
100: }
101: }


Comments