Implementasi Game Pong
Raden Kurniawan Agung Fitrianto | 5025241104 | PBO A2 | Pertemuan 15
Tugas pada pertemuan kali ada adalah implementasi GUI dengan membuat Game Pong. Berikut adalah diagram program
dengan menggunakan BlueJ.
Paddle Class
Kelas Paddle adalah kelas yang merepresentasikan raket dalam permainan Pong. Kelas ini memiliki atribut posisi (x, y), kecepatan vertikal (yVelocity), percepatan gerak (speed), serta width dan height. Metode draw() digunakan untuk menggambar paddle di layar sebagai persegi panjang berwarna hitam. Metode move() mengatur pergerakan paddle berdasarkan nilai yVelocity. Selanjutnya, kelas ini juga menangani input keyboard melalui metode keyPressed() dan keyReleased(). Saat tombol W atau UP ditekan, paddle bergerak ke atas, sedangkan tombol S atau DOWN membuatnya bergerak ke bawah. Metode ini juga memastikan paddle tidak keluar dari batas atas atau bawah layar. Ketika tombol dilepas, yVelocity diatur kembali menjadi 0 untuk menghentikan gerakan.
import java.awt.*;
import java.awt.event.*;
public class Paddle {
int x, y;
int yVelocity = 0;
int speed = 5;
int width = 20;
int height = 100;
public Paddle(int x, int y) {
this.x = x;
this.y = y;
}
int getX() {
return x;
}
int getY() {
return y;
}
int getWidth() {
return width;
}
int getHeight() {
return height;
}
public void draw(Graphics g) {
g.setColor(Color.BLACK);
g.fillRect(x, y, width, height);
}
public void move() {
y += yVelocity;
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_W:
yVelocity = -speed;
if (y <= 0)
yVelocity = 0;
break;
case KeyEvent.VK_S:
yVelocity = speed;
if (y >= GamePanel.GAME_HEIGHT - height)
yVelocity = 0;
break;
case KeyEvent.VK_UP:
yVelocity = -speed;
if (y <= 0)
yVelocity = 0;
break;
case KeyEvent.VK_DOWN:
yVelocity = speed;
if (y >= GamePanel.GAME_HEIGHT - height)
yVelocity = 0;
break;
}
}
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_W:
case KeyEvent.VK_S:
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
yVelocity = 0;
break;
}
}
}
Ball Class
Kelas ini mendefinisikan sebuah objek bola dengan field posisi yakni x dan y, kecepatan yakni xVelocity dan yVelocity, dan diameter. Objek bola juga berinteraksi dengan dua objek paddle yaitu player1 dan player2. Metode draw() digunakan untuk menggambar bola di layar menggunakan objek Graphics, sementara metode move() mengatur pergerakan bola dengan memantulkannya saat menyentuh batas atas/bawah layar atau saat bersentuhan dengan paddle. Metode isOutOfBound() memeriksa apakah bola sudah keluar dari batas kiri/kanan lapangan permainan, dan setPosition akan digunakan untuk mengatur ulang posisi bola.
import java.awt.*;
import javax.swing.plaf.metal.MetalBorders.PaletteBorder;
public class Ball {
int x, y;
int xVelocity = 3;
int yVelocity = 3;
int diameter = 30;
Paddle player1;
Paddle player2;
public Ball(int x, int y, Paddle p1, Paddle p2) {
this.x = x;
this.y = y;
this.player1 = p1;
this.player2 = p2;
}
public void draw(Graphics g) {
g.setColor(Color.BLACK);
g.fillOval(x, y, diameter, diameter);
}
public void move() {
x += xVelocity;
y += yVelocity;
if (y <= 0 || y >= GamePanel.GAME_HEIGHT - diameter)
yVelocity = -yVelocity;
if (x <= player1.getX() + player1.getWidth() && y >= player1.getY() && y <= player1.getY() + player1.getHeight() ||
x + diameter >= player2.getX() && y >= player2.getY() && y <= player2.getY() + player2.getHeight())
xVelocity = -xVelocity;
}
public boolean isOutOfBound(int leftBoundary, int rightBoundary) {
if (this.x < leftBoundary|| this.x > rightBoundary)
return true;
return false;
}
public void setPosition(int x, int y) {
this.x = x;
this.y = y;
}
}
GamePanel Class
Kelas GamePanel berfungsi sebagai panel utama untuk permainan Pong. Di dalam konstruktor, kelas ini menginisialisasi dua objek paddle player1 dan player2 dan satu objek ball, serta mengatur ukuran panel permainan menjadi 800x600 piksel. Panel ini juga mendengarkan input keyboard melalui kelas inner AL (Adapter Listener) untuk mengontrol gerakan paddle. Metode paint() digunakan untuk menggambar objek-objek permainan ke layar, sementara metode draw() menggambar masing-masing objek. Metode move() menggerakkan semua objek dan memeriksa apakah bola keluar dari batas layar. Jika bola keluar, metode resetBall() mengembalikan bola ke posisi tengah. Game loop dijalankan dalam metode run(), yang mengatur pembaruan gerakan dan penggambaran ulang layar dengan kecepatan 60 fps.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GamePanel extends JPanel implements Runnable {
static final int GAME_WIDTH = 800;
static final int GAME_HEIGHT = 600;
Thread gameThread;
Image image;
Graphics graphics;
public Paddle player1, player2;
Ball ball;
public GamePanel() {
player1 = new Paddle(0, (GAME_HEIGHT / 2) - 50);
player2 = new Paddle(GAME_WIDTH - 20, (GAME_HEIGHT / 2) - 50);
ball = new Ball((GAME_WIDTH / 2) - 15, (GAME_HEIGHT / 2) - 15, player1, player2);
this.setPreferredSize(new Dimension(GAME_WIDTH, GAME_HEIGHT));
this.setFocusable(true);
this.addKeyListener(new AL());
gameThread = new Thread(this);
gameThread.start();
}
public void paint(Graphics g) {
image = createImage(getWidth(), getHeight());
graphics = image.getGraphics();
draw(graphics);
g.drawImage(image, 0, 0, this);
}
public void draw(Graphics g) {
player1.draw(g);
player2.draw(g);
ball.draw(g);
}
public void move() {
player1.move();
player2.move();
ball.move();
if (ball.isOutOfBound(-20, GAME_WIDTH + 10)) {
resetBall();
}
}
public void resetBall() {
ball.setPosition((GAME_WIDTH / 2) - 15, (GAME_HEIGHT / 2) - 15);
}
public void run() {
double nsPerFrame = 1000000000 / 60.0;
long lastTime = System.nanoTime();
double delta = 0;
while (true) {
long now = System.nanoTime();
delta += (now - lastTime) / nsPerFrame;
lastTime = now;
while (delta >= 1) {
move();
repaint();
delta--;
}
}
}
public class AL extends KeyAdapter {
public void keyPressed(KeyEvent e) {
player1.keyPressed(e);
player2.keyPressed(e);
}
public void keyReleased(KeyEvent e) {
player1.keyReleased(e);
player2.keyReleased(e);
}
}
}
GameFrame Class
Kelas GameFrame berfungsi sebagai window utama untuk menampilkan game Pong ini. Di dalam konstruktor, kelas ini menambahkan objek GamePanel ke dalam jendela. Jendela diberi judul "Pong Game", dinonaktifkan fitur resize-nya, dan diatur agar aplikasi berhenti saat jendela ditutup. Metode pack() digunakan untuk menyesuaikan ukuran jendela dengan konten di dalamnya, sementara setLocationRelativeTo(null) menempatkan jendela di tengah layar. Terakhir, setVisible(true) membuat jendela menjadi terlihat.
import javax.swing.*;
public class GameFrame extends JFrame {
public GameFrame() {
this.add(new GamePanel());
this.setTitle("Pong Game");
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
}
PongGame Class
Kelas PongGame adalah kelas utama yang berfungsi untuk menjalankan permainan Pong. Kelas ini hanya memiliki metode main, yang membuat sebuah objek GameFrame saat program dijalankan.
public class PongGame {
public static void main(String[] args) {
new GameFrame();
}
}
Comments
Post a Comment