Untuk final project pemrograman berbasis objek, saya terinspirasi untuk membuat sebuah game setelah bermain game bernama osu!Catch the Beat. Saya ingin membuat game seperti itu namun menggunakan bahasa pemrograman java.
Potongan gambar dari osu! Catch the Beat yang asli:
Dengan pemrograman java seadanya saya berhasil membuat remake game ini namun dengan fitur yang lebih sedikit dari yang aslinya.
Program osu!ctb yang saya buat memiliki fitur basic yaitu menangkap buah yang jatuh dan permainan akan selesai setelah semua buah ditangkap.
Potongan gambar dari osu!ctb yang saya buat:
Class Schema untuk pemrograman osu!ctb ini adalah sebagai berikut:
- frame
- class ini berfungsi untuk menggenerate frame yang digunakan untuk menjalankan permainan.
- background
- class ini merupakan motor utama game ini. class ini memiliki banyak fungsi salah satunya memanggil buah dan membuat ryu(alat penangkap buahnya). Selain itu background juga mengecek tabrakan antara ryu dan buah.
- control
- class ini berfungsi untuk mengatur gerakan dari ryu dan juga mengatur laju dari hasil inputan keyboard.
- buah
- class ini berfungsi untuk mengatur segala hal mengenai buah seperti laju turunnya buah dan menggenerate buahnya
Link github kodingan saya: osu!ctb
Link download program in jar: here
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.applet.Applet; | |
import java.applet.AudioClip; | |
import java.awt.Color; | |
import java.awt.Font; | |
import java.awt.FontMetrics; | |
import java.awt.Graphics; | |
import java.awt.Graphics2D; | |
import java.awt.Image; | |
import java.awt.Rectangle; | |
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 java.util.ArrayList; | |
import javax.swing.ImageIcon; | |
import javax.swing.JPanel; | |
import javax.swing.Timer; | |
public class background extends JPanel implements ActionListener { | |
private Timer timer; | |
private control buah; | |
private ArrayList fruits; | |
private boolean ingame; | |
private int B_WIDTH; | |
private int B_HEIGHT; | |
AudioClip soundTrack; | |
AudioClip sound; | |
Image gambar; | |
private Image back; | |
private int[][] pos = { | |
{89,-30}, {29,-90}, {59,-120}, | |
{109,-280}, {259,-390}, {150,-590}, | |
{170,-490}, {70,-510}, {60,-530}, | |
{90,-540}, {45,-560}, {139,-580}, | |
{80,-590}, {50,-660}, {239,-680}, | |
{30,-700}, {180,-740}, {50,-760}, | |
{109,-780}, {259,-790}, {150,-790}, | |
{220,-810}, {128,-820}, {20,-860}, | |
{259,-900}, {200,-920}, {159,-930}, | |
{59,-940}, {209,-980}, {30,-990}, | |
{89,-1380}, {29,-1680}, {59,-2000} | |
}; | |
public background() { | |
addKeyListener(new TAdapter()); | |
setFocusable(true); | |
setBackground(Color.black); | |
setDoubleBuffered(true); | |
ingame = true; | |
setSize(400,400); | |
buah = new control(); | |
initFruits(); | |
soundTrack=Applet.newAudioClip(getClass().getResource("backsound.wav")); | |
soundTrack.loop(); | |
timer = new Timer(20, this); | |
timer.start(); | |
} | |
@Override | |
public void addNotify() { | |
super.addNotify(); | |
B_WIDTH = getWidth(); | |
B_HEIGHT = getHeight(); | |
} | |
public final void initFruits() { | |
fruits = new ArrayList(); | |
for (int i=0; i<pos.length; i++ ) { | |
fruits.add(new buah(pos[i][0], pos[i][1])); | |
} | |
} | |
public static Image loadImage(String fileName) { | |
ImageIcon icon = new ImageIcon(fileName); | |
return icon.getImage(); | |
} | |
@Override | |
public void paint(Graphics g) { | |
super.paint(g); | |
if (ingame) { | |
Graphics2D g2d = (Graphics2D)g; | |
if (buah.isVisible()) { | |
g2d.drawImage(buah.getImage(), buah.getX(), buah.getY(),this); | |
} | |
for (int i = 0; i < fruits.size(); i++) { | |
buah a = (buah)fruits.get(i); | |
if (a.isVisible()) { | |
g2d.drawImage(a.getImage(), a.getX(), a.getY(), this); | |
} | |
} | |
g2d.setColor(Color.red); | |
g2d.drawString("Target Buah: " + fruits.size(), 5, 15); | |
} else { | |
String msg = "Permainan Selesai"; | |
Font small = new Font("Helvetica", Font.BOLD, 30); | |
FontMetrics metr = this.getFontMetrics(small); | |
g.setColor(Color.red); | |
g.setFont(small); | |
g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) /2, B_HEIGHT /2); | |
} | |
Toolkit.getDefaultToolkit().sync(); | |
g.dispose(); | |
} | |
@Override | |
public void actionPerformed(ActionEvent e) { | |
if (fruits.isEmpty()) { | |
ingame = false; | |
} | |
for (int i = 0; i < fruits.size(); i++) { | |
buah a = (buah) fruits.get(i); | |
if (a.isVisible()) { | |
a.move(); | |
} | |
else { | |
fruits.remove(i); | |
} | |
} | |
buah.move(); | |
checkCollisions(); | |
repaint(); | |
} | |
public void checkCollisions() { | |
Rectangle r3 = buah.getBounds(); | |
for (int j = 0; j<fruits.size(); j++) { | |
buah a = (buah) fruits.get(j); | |
Rectangle r2 = a.getBounds(); | |
if (r3.intersects(r2)) { | |
a.setVisible(false); | |
sound = Applet.newAudioClip(getClass().getResource("soft-slidertick.wav")); | |
sound.play(); | |
} | |
} | |
} | |
private class TAdapter extends KeyAdapter { | |
@Override | |
public void keyReleased(KeyEvent e) { | |
buah.keyReleased(e); | |
} | |
@Override | |
public void keyPressed(KeyEvent e) { | |
buah.keyPressed(e); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.Image; | |
import java.awt.Rectangle; | |
import javax.swing.ImageIcon; | |
public class buah { | |
private int x; | |
private int y; | |
private int width; | |
private int height; | |
private boolean visible; | |
private Image image; | |
public buah(int x, int y) { | |
ImageIcon ii = new ImageIcon(this.getClass().getResource("banana.png")); | |
image = ii.getImage(); | |
width = image.getWidth(null); | |
height = image.getHeight(null); | |
visible = true; | |
this.x = x; | |
this.y = y; | |
} | |
public void move() { | |
if (y > 400) { | |
y = 0; | |
} | |
y += 1; | |
} | |
public int getX() { | |
return x; | |
} | |
public int getY() { | |
return y; | |
} | |
public boolean isVisible() { | |
return visible; | |
} | |
public void setVisible(Boolean visible) { | |
this.visible = visible; | |
} | |
public Image getImage() { | |
return image; | |
} | |
public Rectangle getBounds() { | |
return new Rectangle(x, y, width, height); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.Image; | |
import java.awt.Rectangle; | |
import java.awt.event.KeyEvent; | |
import java.util.ArrayList; | |
import javax.swing.ImageIcon; | |
public class control { | |
private int dx; | |
private int dy; | |
private int x; | |
private int y; | |
private int width; | |
private int height; | |
private boolean visible; | |
private Image image; | |
public control() { | |
ImageIcon ii = new ImageIcon(this.getClass().getResource("ryu.png")); | |
image = ii.getImage(); | |
width = image.getWidth(null); | |
height = image.getHeight(null); | |
visible = true; | |
x = 40; | |
y = 340; | |
} | |
public void move() { | |
x += dx; | |
if (x < 1) { | |
x = 1; | |
} | |
if(x > 355){ | |
x = 355; | |
} | |
} | |
public int getX() { | |
return x; | |
} | |
public int getY() { | |
return y; | |
} | |
public Image getImage() { | |
return image; | |
} | |
public void setVisible(boolean visible) { | |
this.visible = visible; | |
} | |
public boolean isVisible() { | |
return visible; | |
} | |
public Rectangle getBounds() { | |
return new Rectangle(x, y, width, height); | |
} | |
public void keyPressed(KeyEvent e) { | |
int key = e.getKeyCode(); | |
if (key == KeyEvent.VK_LEFT) { | |
dx = -5; | |
} | |
if (key == KeyEvent.VK_RIGHT) { | |
dx = 5; | |
} | |
} | |
public void keyReleased(KeyEvent e) { | |
int key = e.getKeyCode(); | |
if (key == KeyEvent.VK_LEFT) { | |
dx = 0; | |
} | |
if (key == KeyEvent.VK_RIGHT) { | |
dx = 0; | |
} | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.Component; | |
import javax.swing.JFrame; | |
public class frame extends JFrame { | |
public frame() { | |
Component add; | |
add = add(new background()); | |
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
setSize(400,400); | |
setLocationRelativeTo(null); | |
setTitle("CTB in Java"); | |
setResizable(false); | |
setVisible(true); | |
} | |
public static void main(String[] args) { | |
frame frame = new frame(); | |
} | |
} |
Tidak ada komentar:
Posting Komentar