Sambungan dari postingan sebelumnya yang hanya membahas cara membuat kepala pacman menggunakan java applet,
kali ini lebih lengkap dengan menambahkan pergerakannya, makanannya
hingga jalur yang dilewatinya. namun robot pacmannya masih belum dapat
dikendalikan, hanya sebatas berjalan melewati jalurnya saja lalu akan
memakan setiap butiran/bulatan yang dilewatinya. Lebih lengkapnya
silahkan baca studi kasus berikut:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Ahmad Ariful Amri
* @NIM 1108107010054
*/
public class PacMan extends Applet implements ActionListener{
/**
* Initialization method that will be called after the applet is loaded into
* the browser.
*/
Button start;
Button stop;
Panel papanTombol;
RobotAksi papanAksi;
@Override
public void init() {
setSize(700,500); //menentukan ukuran
int panjang = this.getWidth(); //mendeklarasikan variabel panjang untuk menampung lebar
int lebar = this.getHeight(); //mendeklarasikan variabel lebar untuk menampung tinggi
start = new Button(“Start”); //membuat tombol start
start.addActionListener(this);
stop = new Button(“Stop”); //membuat tombol stop
stop.addActionListener(this);
papanTombol = new Panel();
papanTombol.setLayout(new GridLayout()); //membuat papan baru berdasarkan grid
papanTombol.add(start); //menempel tombol start
papanTombol.add(stop); //menempel tombol stop
papanAksi = new RobotAksi();
papanAksi.setBackground(Color.black);
setLayout(new BorderLayout()); //layout yang berdasarkan border
add(“South”, papanTombol); //meletakkan papanTombol di bawah)
add(“Center”, papanAksi);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==start) //jika di klik start
{
papanAksi.jalan();
}
if(e.getSource()==stop) //jika di klik Stop
{
papanAksi.berhenti();
}
//throw new UnsupportedOperationException(“Not supported yet.”);
}
class RobotAksi extends Canvas implements Runnable
{
MyPoint[] p = new MyPoint[8]; //mendeklarasikan array posisi sampah
{
p[0] = new MyPoint(20,20);
p[1] = new MyPoint(500,80);
p[2] = new MyPoint(40,100);
p[3] = new MyPoint(380,300);
p[4] = new MyPoint(60,400);
p[5] = new MyPoint(100,500);
p[6] = new MyPoint(250,260);
p[7] = new MyPoint(300,400);
}
Thread runner = null;
Boolean keepRunning = true;
int x = 0; //mendeklarasikan posisi mula-mula x (horizontal)
int y = 10; //mendeklarasikan posisi mula-mula y (vertikal)
int incr =5; //besar perpindahan
int arahMulut = 0;
boolean black;
@Override
public void run()
{
Dimension ruang = getSize();
int lebar = getHeight();
int panjang = getWidth();
while(keepRunning)
{
if(x == 680) //700 -20 (20 adalah ukuran si pacman) sehingga pas
{
incr = -incr; //balik kebelakang.
arahMulut = 240; //arah mulut ke kiri
y = y+20; // dia akan turun 20 pixel sebelah kanan
}
if(x<0)
{
incr = -incr; //maju kedepan
arahMulut = 0; //arah mulut ke kanan
y = y+20; // dia akan turun 20 pixel sebelah kiri
}
for(int i=0; i<p.length; i++) //menghilangkan sampah..
{
if(x == p[i].getX() && y == (p[i].getY()-10)) //sampah ukurannya 10 px – 10px = 0
{
p[i].setX(-10); //x dikurang 10 sehinnga jadi 0
p[i].setY(-10); //y dikurang 10 sehinnga jadi 0
}
}
if((lebar <= y-20)&&(panjang >=x)) //jika lebar/tinggi lebih kecil dari 500 (520 – 20)
{
berhenti(); //berhenti
}
x = x + incr; //pacman bergerak + incr (5 px)
repaint();
try
{
Thread.sleep(50); //kontrol kecepatan
}
catch (InterruptedException ex)
{
Logger.getLogger(RobotAksi.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void jalan()
{
if (runner == null)
{
runner = new Thread(this);
keepRunning = true;
runner.start();
}
}
public void berhenti()
{
if (runner != null)
{
keepRunning = false;
runner = null;
}
}
@Override
public void paint(Graphics g)
{
super.paint(g);
if(black)
{
/************ BADAN ROBOT PACMAN************/
g.setColor(Color.yellow);
g.fillArc(x, y, 20, 20, arahMulut, 360);
g.setColor(Color.red);//—->mata robot Pacman
g.fillOval(x+6, y+3, 5, 5); //—->lokasi mata robot Pacman
/************garis bawah (genap)************/
int r=10;
for (int i = 0; i < 12; i++)
{
r +=40; //pertambahan 40 px untuk setiap garis atas (selang 2)
g.setColor(Color.red);
g.drawLine(20, r, 700, r);
}
/*************garis atas (ganjil)***********/
int s=-10;
for (int j = 0; j < 12; j++)
{
s +=40; //pertambahan 40 px untuk setiap garis bawah (selang 2)
g.setColor(Color.red);
g.drawLine(0, s, 680, s);
}
/*************garis pembatas samping dan bawah***********/
g.setColor(Color.red);
g.drawLine(0, 0, 0, 510); // garis samping kiri
g.drawLine(700, 0, 700, 510); // garis samping kanan
g.drawLine(0, 510, 700, 510); // garis bawah tutup
//sampah
for (int i = 0; i < p.length; i++) { g.setColor(Color.white); g.fillOval(p[i].getX(), p[i].getY(), 10, 10); //menggambar sampah } } else { /************ BADAN ROBOT PACMAN************/ g.setColor(Color.yellow); g.fillArc(x, y, 20, 20, arahMulut, 300); //badan robot pacman g.setColor(Color.red);//—->lokasi mata robot Pacman
g.fillOval(x+6, y+3, 5, 5);
/************garis bawah (genap)************/
int r=10;
for (int i = 0; i < 12; i++)
{
r +=40; //pertambahan 40 px untuk setiap garis atas (selang 2)
g.setColor(Color.red);
g.drawLine(20, r, 700, r);
}
/*************garis atas (ganjil)***********/
int s=-10;
for (int j = 0; j < 12; j++)
{
s +=40; //pertambahan 40 px untuk setiap garis bawah (selang 2)
g.setColor(Color.red);
g.drawLine(0, s, 680, s);
}
/*************garis pembatas samping dan bawah***********/
g.setColor(Color.red);
g.drawLine(0, 0, 0, 510); // garis samping kiri
g.drawLine(700, 0, 700, 510); // garis samping kanan
g.drawLine(0, 510, 700, 510); // garis bawah tutup
//sampah
for (int i = 0; i < p.length; i++)
{
g.setColor(Color.white);
g.fillOval(p[i].getX(), p[i].getY(), 10, 10);
}
}
black = !black;
}
class MyPoint
{
private int x;
private int y;
MyPoint(int x, int y)
{
this.x = x;
this.y = y;
}
public int getX()
{
return this.x;
}
public int getY()
{
return this.y;
}
public void setX(int X)
{
x=X;
}
public void setY(int Y)
{
y=Y;
}
}
}
[/java]
Pacman adalah sebuah agen robot yang
membersihkan semua sampah di dalam ruangan yang berukuran persegi
panjang. Ruangan mempunyai panjang 700 pixel (px) lebarnya 500px dan
memiliki dua buah tomboh ”Start” dan ”Stop” yang berada paling bawah
ruangan. Robot pacman berbentuk lingkaran dengan ukuran 20 x 20px dan
mempunyai mulut terbuka sedangkan ukuran sampahnya adalah 5 x 5 px. Pada
awalnya robot pacman berada pada posisi sudut kiri paling atas
(koordinat 0,10). Ketika tombol ”Start” ditekan, maka robot akan
berjalan ke arah kanan (secara horizontal) dan mencari sampahsampah yang
ada di dalam ruangan. Ketika posisi robot menabrak dinding di sebelah
kanan, robot akan mengubah arahnya satu langkah ke bawah, lalu
melanjutkan pencarian secara horizontal ke arah menuju dinding sebelah
kiri. Demikian juga sebaliknya, ketika robot menambrak dindin sebelah
kiri, maka robot akan mengubah arahnya satu langkah ke bawah, dan
melanjutkan pencarian secara horizontal ke arah menuju dinding sebelah
kanan. Jika sampah sudah d temukan oleh robot, maka robot akan
membersihkan sampah tersebut dan kemudian melanjutkan pencarian sampah
berikutnya sampai robot berada pada posisi koordinat (700,500). Jika
tombol ”Stop” ditekan, maka robot akan berhenti sebentar.
Berikut ini source codenya.. harap dipelajari ya.. ^^
[java]
package Tugas;
import java.applet.Applet;package Tugas;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Ahmad Ariful Amri
* @NIM 1108107010054
*/
public class PacMan extends Applet implements ActionListener{
/**
* Initialization method that will be called after the applet is loaded into
* the browser.
*/
Button start;
Button stop;
Panel papanTombol;
RobotAksi papanAksi;
@Override
public void init() {
setSize(700,500); //menentukan ukuran
int panjang = this.getWidth(); //mendeklarasikan variabel panjang untuk menampung lebar
int lebar = this.getHeight(); //mendeklarasikan variabel lebar untuk menampung tinggi
start = new Button(“Start”); //membuat tombol start
start.addActionListener(this);
stop = new Button(“Stop”); //membuat tombol stop
stop.addActionListener(this);
papanTombol = new Panel();
papanTombol.setLayout(new GridLayout()); //membuat papan baru berdasarkan grid
papanTombol.add(start); //menempel tombol start
papanTombol.add(stop); //menempel tombol stop
papanAksi = new RobotAksi();
papanAksi.setBackground(Color.black);
setLayout(new BorderLayout()); //layout yang berdasarkan border
add(“South”, papanTombol); //meletakkan papanTombol di bawah)
add(“Center”, papanAksi);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==start) //jika di klik start
{
papanAksi.jalan();
}
if(e.getSource()==stop) //jika di klik Stop
{
papanAksi.berhenti();
}
//throw new UnsupportedOperationException(“Not supported yet.”);
}
class RobotAksi extends Canvas implements Runnable
{
MyPoint[] p = new MyPoint[8]; //mendeklarasikan array posisi sampah
{
p[0] = new MyPoint(20,20);
p[1] = new MyPoint(500,80);
p[2] = new MyPoint(40,100);
p[3] = new MyPoint(380,300);
p[4] = new MyPoint(60,400);
p[5] = new MyPoint(100,500);
p[6] = new MyPoint(250,260);
p[7] = new MyPoint(300,400);
}
Thread runner = null;
Boolean keepRunning = true;
int x = 0; //mendeklarasikan posisi mula-mula x (horizontal)
int y = 10; //mendeklarasikan posisi mula-mula y (vertikal)
int incr =5; //besar perpindahan
int arahMulut = 0;
boolean black;
@Override
public void run()
{
Dimension ruang = getSize();
int lebar = getHeight();
int panjang = getWidth();
while(keepRunning)
{
if(x == 680) //700 -20 (20 adalah ukuran si pacman) sehingga pas
{
incr = -incr; //balik kebelakang.
arahMulut = 240; //arah mulut ke kiri
y = y+20; // dia akan turun 20 pixel sebelah kanan
}
if(x<0)
{
incr = -incr; //maju kedepan
arahMulut = 0; //arah mulut ke kanan
y = y+20; // dia akan turun 20 pixel sebelah kiri
}
for(int i=0; i<p.length; i++) //menghilangkan sampah..
{
if(x == p[i].getX() && y == (p[i].getY()-10)) //sampah ukurannya 10 px – 10px = 0
{
p[i].setX(-10); //x dikurang 10 sehinnga jadi 0
p[i].setY(-10); //y dikurang 10 sehinnga jadi 0
}
}
if((lebar <= y-20)&&(panjang >=x)) //jika lebar/tinggi lebih kecil dari 500 (520 – 20)
{
berhenti(); //berhenti
}
x = x + incr; //pacman bergerak + incr (5 px)
repaint();
try
{
Thread.sleep(50); //kontrol kecepatan
}
catch (InterruptedException ex)
{
Logger.getLogger(RobotAksi.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void jalan()
{
if (runner == null)
{
runner = new Thread(this);
keepRunning = true;
runner.start();
}
}
public void berhenti()
{
if (runner != null)
{
keepRunning = false;
runner = null;
}
}
@Override
public void paint(Graphics g)
{
super.paint(g);
if(black)
{
/************ BADAN ROBOT PACMAN************/
g.setColor(Color.yellow);
g.fillArc(x, y, 20, 20, arahMulut, 360);
g.setColor(Color.red);//—->mata robot Pacman
g.fillOval(x+6, y+3, 5, 5); //—->lokasi mata robot Pacman
/************garis bawah (genap)************/
int r=10;
for (int i = 0; i < 12; i++)
{
r +=40; //pertambahan 40 px untuk setiap garis atas (selang 2)
g.setColor(Color.red);
g.drawLine(20, r, 700, r);
}
/*************garis atas (ganjil)***********/
int s=-10;
for (int j = 0; j < 12; j++)
{
s +=40; //pertambahan 40 px untuk setiap garis bawah (selang 2)
g.setColor(Color.red);
g.drawLine(0, s, 680, s);
}
/*************garis pembatas samping dan bawah***********/
g.setColor(Color.red);
g.drawLine(0, 0, 0, 510); // garis samping kiri
g.drawLine(700, 0, 700, 510); // garis samping kanan
g.drawLine(0, 510, 700, 510); // garis bawah tutup
//sampah
for (int i = 0; i < p.length; i++) { g.setColor(Color.white); g.fillOval(p[i].getX(), p[i].getY(), 10, 10); //menggambar sampah } } else { /************ BADAN ROBOT PACMAN************/ g.setColor(Color.yellow); g.fillArc(x, y, 20, 20, arahMulut, 300); //badan robot pacman g.setColor(Color.red);//—->lokasi mata robot Pacman
g.fillOval(x+6, y+3, 5, 5);
/************garis bawah (genap)************/
int r=10;
for (int i = 0; i < 12; i++)
{
r +=40; //pertambahan 40 px untuk setiap garis atas (selang 2)
g.setColor(Color.red);
g.drawLine(20, r, 700, r);
}
/*************garis atas (ganjil)***********/
int s=-10;
for (int j = 0; j < 12; j++)
{
s +=40; //pertambahan 40 px untuk setiap garis bawah (selang 2)
g.setColor(Color.red);
g.drawLine(0, s, 680, s);
}
/*************garis pembatas samping dan bawah***********/
g.setColor(Color.red);
g.drawLine(0, 0, 0, 510); // garis samping kiri
g.drawLine(700, 0, 700, 510); // garis samping kanan
g.drawLine(0, 510, 700, 510); // garis bawah tutup
//sampah
for (int i = 0; i < p.length; i++)
{
g.setColor(Color.white);
g.fillOval(p[i].getX(), p[i].getY(), 10, 10);
}
}
black = !black;
}
class MyPoint
{
private int x;
private int y;
MyPoint(int x, int y)
{
this.x = x;
this.y = y;
}
public int getX()
{
return this.x;
}
public int getY()
{
return this.y;
}
public void setX(int X)
{
x=X;
}
public void setY(int Y)
{
y=Y;
}
}
}
[/java]