Final Project PBO B

 Game Aim Trainer

   Pada zaman sekarang ada banyak game shooter atau game FPS yang dimainkan banyak orang. Game-game terkenal seperti Fortnite, Call of Duty, Counter-Strike, Apex Legends, dan Valorant memerlukan skill aim yang sangat bagus untuk dapat menjadi pemenang. Game Aim Trainer ini bertujuan untuk melatih skill aim tersebut, terutama untuk orang-orang yang masih baru dalam genre shooter atau FPS karena orang yang hanya memainkan game shooter tidak akan melakukan aim sebanyak orang yang menggunakan atau memainkan game seperti aim trainer ini yang lebih intensif untuk melatih raw aim dari orang tersebut. Game ini juga dapat melatih dan memperbagus waktu reaksi Anda.

    Cara memainkan game ini sangat sederhana. Kita hanya perlu untuk menklik "target" yang muncul secepat dan sebanyak mungkin sebelum waktu habis dimana skor kita akan muncul setelah game over. Target baru akan muncul setelah target sebelumnya diklik. Game ini cocok untuk pemula karena user hanya perlu fokus ke aim tanpa mengkhawatirkan skill lain dari suatu game FPS.



Hanya ada 2 class yang digunakan pada program ini:

Board.java adalah class yang melakukan kebanyakan perkerjaan pada program ini termasuk memuat gambar target, menggambar gambar target tersebut pada board, mencek input mouse, menghitung skor, dan lain lain.

AimTrainer.java adalah main class yang menginisialisasikan UI, membuat JFrame dan memanggil class Board.java.

Source Code

Board.java

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Board extends JPanel implements ActionListener {
//Naikkan nilai ini untuk menambahkan durasi permainan atau sebaliknya
private int duration = 100;
private final int B_WIDTH = 800;
private final int B_HEIGHT = 800;
private final int RAND_POS = 720;
private final int DELAY = 140;
private int target_x;
private int target_y;
private int score = 0;
private boolean inGame = true;
private Timer timer;
private Image target;
public Board() {
initBoard();
}
private void initBoard() {
setBackground(Color.black);
setFocusable(true);
setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
loadImages();
addMouseListener(new TAdapter());
initGame();
}
private void loadImages() {
ImageIcon iia = new ImageIcon("target.png");
target = iia.getImage();
}
private void initGame() {
locateTarget();
timer = new Timer(DELAY, this);
timer.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
doDrawing(g);
}
private void doDrawing(Graphics g) {
if (inGame) {
g.drawImage(target, target_x, target_y, this);
Toolkit.getDefaultToolkit().sync();
} else {
gameOver(g);
}
}
private void gameOver(Graphics g) {
String msg = "Game Over";
String msg2 = "Score = "+score;
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = getFontMetrics(small);
g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2 - 12);
g.drawString(msg2, (B_WIDTH - metr.stringWidth(msg2)) / 2, B_HEIGHT / 2 + 12);
}
private void locateTarget() {
int r = (int) (Math.random() * RAND_POS);
target_x = r;
r = (int) (Math.random() * RAND_POS);
target_y = r;
}
private void checkTimer() {
if(duration < 1 ) {
inGame = false;
}
if(!inGame) {
timer.stop();
}
}
public void actionPerformed(ActionEvent e) {
duration--;
if (inGame) {
checkTimer();
repaint();
}
}
private class TAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if((x > (target_x) && x < (target_x + 100)) && (y > (target_y) && y < (target_y + 100))) {
score++;
locateTarget();
}
}
}
}
view raw gistfile1.txt hosted with ❤ by GitHub

AimTrainer.java

import java.awt.EventQueue;
import javax.swing.JFrame;
public class AimTrainer extends JFrame {
public AimTrainer() {
initUI();
}
private void initUI() {
add(new Board());
setResizable(false);
pack();
setTitle("Aim Trainer");
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame ex = new AimTrainer();
ex.setVisible(true);
});
}
}
view raw gistfile1.txt hosted with ❤ by GitHub

Penjelasan source code

Source code ini merupakan hasil modifikasi dari program game Snake yang diambil dari website zetcode.com (link di sini). 

Terdapat beberapa variabel pada program ini:

duration = durasi pada game sebelum screen "Game Over" muncul, semakin tinggi valuenya maka semakin lama permainannya.

B_WIDTH = lebar dari board (atau window).

B_HEIGHT = tinggi dari board.

RAND_POS = harus disesuaikan dengan size board, semakin kecil target akan hanya "spawn" di area yang kecil seakan-akan size board semakin kecil.

DELAY = digunakan untuk Java Swing Timer.

Metode initBoard mengatur background menjadi hitam, membuat size menjadi B_WIDTH dan B_HEIGHT, memuat gambar target dengan memanggil loadImages, menambahkan MouseListener, dan memanggil initGame.

loadImages memuat gambar target menggunakan ImageIcon.

initGame memanggil locateTarget dan membuat Java Swing Timer.

locateTarget akan memilih lokasi random untuk memunculkan target di metode doDrawing saat program menggambarkan target pada lokasi tersebut.

actionPerformed adalah metode yang berhubungan dengan Java Swing Timer yang akan selalu dipanggil setiap sekitar 0.15 detik. Metode ini mengurangi value duration dan memanggil checkTimer dan repaint dimana checkTimer akan menghentikan game jika duration < 1.

TAdapter adalah metode yang menggunakan MouseAdapter dimana saat user mengklik, program akan mengecek dimana cursor user dan jika posisi cursor tersebut berada di target, maka score akan bertambah dan target akan berpindah tempat.

gameOver adalah metode yang akan membuat game over screen pada saat game selesai dimana skor pemain akan ditampilkan.

Link Download .jar file

Aim Trainer.jar

Link Video Penjelasan Source Code dan Game

Video


Comments

Popular posts from this blog

Game Pong Java

File & Directory