Balloon App Scenario
Pertama-tama, buatlah sebuah Java Scenario pada aplikasi Greenfoot Anda dan berikan nama Balloon App sebagai nama skenario tersebut. Setelah membuat skenario yang baru, mari kita menambahkan beberapa buah class yaitu RedBalloon, YellowBalloon, dan Dart.
Berikan image bawaan dari Greenfoot untuk class MyWorld, RedBalloon, dan YellowBallon. Class Dart akan diberikan juga sebuah gambar (image) namun gambar tersebut tidak berasal dari library yang sudah disediakan. Untuk itu, Anda akan diberikan sebuah file yaitu dart.png dan copy-kan file tersebut pada folder images di skenario yang bersangkutan.
Setelah Anda meng-copy-kan dart.png pada folder tersebut, Anda dapat memberikan gambar kepada class Dart dengan cara klik kanan pada class tersebut kemudian pilih menu Set Image dan memilih gambar yang telah diberikan sebagai gambar untuk class Dart.
Setelah Anda memberikan gambar untuk masing-masing class yang ada, maka langkah selanjutnya adalah mengubah resolusi dari world menjadi 480*800 px. Untuk itu, bukalah class MyWorld dan ubahlah baris yang akan membuat resolusi world berubah.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class MyWorld extends World {
/**
* Constructor for objects of class MyWorld.
*
*/
public MyWorld() {
super(480, 800, 1);
}
}
Setelah mengubah resolusi, kita akan membuat kode program pada class MyWorld yang ditujukan untuk men-generate balon berwarna merah ke dalam world. Untuk itu kita akan membuat method act()
pada class MyWorld.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class MyWorld extends World {
/**
* Constructor for objects of class MyWorld.
*
*/
public MyWorld() {
super(480, 800, 1);
}
public void act() {
/*
* Auto generate red baloon if random number less than 3
*/
if (Greenfoot.getRandomNumber(100) < 2) {
this.addObject(new RedBalloon(), getBalloonRandomXPosition(), getHeight());
}
}
private int getBalloonRandomXPosition() {
int randomNumber = Greenfoot.getRandomNumber(getWidth());
if (randomNumber >= getWidth() - 25) {
randomNumber -= 25;
}
return randomNumber;
}
}
Quiz Time >> Buatlah tambahan kode program pada method act() agar dapat menghasilkan balon berwarna kuning juga.
Setelah Anda melengkapi kode program dengan men-generate balon berwarna kuning, Anda dapat melihat hasilnya bahwa Greenfoot sudah berhasil menciptakan balon-balon tersebut, namun tidak ada satupun balon yang naik ke atas. Untuk itu kita akan mengubah class RedBalloon dan YellowBalloon agar balon-balon tersebut dapat naik secara otomatis ketika dijalankan.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class RedBalloon extends Actor {
/**
* Act - do whatever the RedBalloon wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act() {
this.setLocation(this.getX(), this.getY() - 1);
}
}
Quiz Time >> Buatlah hal yang sama untuk class YellowBalloon namun berikan kecepatan naik yang berbeda dengan balon merah.
Setelah Anda membuat class YellowBalloon, sekarang mari kita membuat class Dart yang akan berperilaku sebagai pemecah balon. Pertama-tama, mari membuat kode program untuk mengatur lokasi dart sesuai dengan pergerakan mouse.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class Dart extends Actor {
public Dart() {
this.setImage("dart.png");
}
/**
* Act - do whatever the Dart wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act() {
// Method ini digunakan untuk mengatur lokasi dart sesuai dengan pergerakan mouse
if(Greenfoot.mouseMoved(null)) {
MouseInfo mouse = Greenfoot.getMouseInfo();
setLocation(mouse.getX(), mouse.getY());
}
// Method ini digunakan untuk meledakkan (menghilangkan) balon dari world
if(Greenfoot.mousePressed(null)) {
MouseInfo mouse = Greenfoot.getMouseInfo();
int x = getImage().getWidth() / 2;
int y = getImage().getHeight() / 2;
Actor baloon = this.getOneObjectAtOffset(-x, y, Actor.class);
if (baloon instanceof RedBalloon) {
((RedBalloon) baloon).pop();
} else if (baloon instanceof YellowBalloon) {
((YellowBalloon) baloon).pop();
}
}
}
}
Kemudian agar balon-balon (RedBalloon dan YellowBalloon) dapat hilang dari world pada saat Anda mengklik balon tersebut dengan dart, tambahkan method pop()
pada masing-masing class RedBalloon dan YellowBalloon. Method yang perlu diperhatikan adalah method removeObject()
yang memang berfungsi menghilangkan sebuah objek dari world.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class RedBalloon extends Actor {
public RedBalloon() {
this.setImage("balloon1.png");
}
/**
* Act - do whatever the RedBaloon wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act() {
this.setLocation(this.getX(), this.getY() - 1);
}
public void pop() {
this.getWorld().removeObject(this);
}
}
Setelah Anda berhasil untuk memecahkan balon-balon tersebut, mari kita membuat sistem penilaian untuk setiap balon. Untuk setiap balon merah yang dipecahkan, maka nilai akan bertambah 10 sedangkan jika balon kuning yang dipecahkan, maka nilai akan bertambah 20. Untuk mengakomodasi sistem penilaian, Greenfoot telah menyediakan sebuah class yang dapat Anda gunakan. Class ini bernama Counter yang dapat Anda tambahkan melalui menu Edit -> Import Class.
Pada tampilan window yang muncul, Anda dapat memilih class Counter kemudian menekan tombol Import sehingga class Counter akan muncul pada pohon inheritance proyek Anda. Untuk menggunakan class Counter ini, Anda dapat menambahkannya pada world dengan cara yang sama seperti Anda membuat objek wombat.
Untuk proyek ini, Anda diminta untuk memilih new Counter(String prefix)
kemudian letakkan objek dari Counter tersebut pada tempat yang Anda inginkan. Setelah Anda meletakkan objek tersebut, maka Greenfoot akan menampilkan sebuah window di mana Anda dapat memasukkan teks yang ingin Anda munculkan pada awal penilaian tersebut. Agar seragam, mari kita tulis Score pada window yang muncul tersebut kemudian tekan tombol OK.
Setelah penambahan objek Counter selesai, mari kita membuat kode program untuk menambah penilaian berdasarkan ketentuan yang telah ditetapkan sebelumnya. Penambahan ini dapat Anda lihat pada method addScoreForRedBalloon()
dan addScoreForYellowBalloon()
.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class MyWorld extends World {
// Declare object for GreenfootSound
private GreenfootSound bgSound;
// Declare object for counter
private Counter scoreCounter;
/**
* Constructor for objects of class MyWorld.
*
*/
public MyWorld() {
// Create a 480*800 world with density 1 px
super(480, 800, 1);
// Set background for this world (needed if this app wants to be ported)
this.setBackground("recycpap.jpg");
prepare();
}
public void act() {
/*
* Auto generate red baloon if random number less than 3
*/
if (Greenfoot.getRandomNumber(100) < 2) {
this.addObject(new RedBalloon(), getBaloonRandomXPosition(),
getHeight());
}
/*
* Auto generate yellow baloon if random number equals to 99
*/
if (Greenfoot.getRandomNumber(200) == 99) {
this.addObject(new YellowBalloon(), getBaloonRandomXPosition(),
getHeight());
}
}
private int getBaloonRandomXPosition() {
int randomNumber = Greenfoot.getRandomNumber(getWidth());
if (randomNumber >= getWidth() - 25) {
randomNumber -= 25;
}
return randomNumber;
}
/**
* Add 10 to scoreCounter
*/
public void addScoreForRedBaloon() {
scoreCounter.add(10);
}
/**
* Add 20 to scoreCounter
*/
public void addScoreForYellowBaloon() {
scoreCounter.add(20);
}
/**
* Prepare the world for the start of the program.
* That is: create the initial objects and add them to the world.
*/
private void prepare() {
// Add dart object to world
this.addObject(new Dart(), getWidth() / 2, getHeight() / 2);
// Create a background sound
bgSound = new GreenfootSound("Jenga.mp3");
bgSound.setVolume(50);
bgSound.playLoop();
// Create a score counter and add it to world
scoreCounter = new Counter("Score: ");
this.addObject(scoreCounter, 80, 780);
}
}
Setelah proses penambahan method pada class MyWorld selesai, mari kita meng-update class RedBalloon agar setiap kali balon berwarna merah dipecahkan, sistem penilaian akan bertambah. Berikut adalah tambahan kode program untuk penambahan nilai balon merah.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class RedBalloon extends Actor {
public RedBalloon() {
this.setImage("balloon1.png");
}
/**
* Act - do whatever the RedBaloon wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act() {
this.setLocation(this.getX(), this.getY() - 1);
}
public void pop() {
((MyWorld) this.getWorld()).addScoreForRedBaloon();
this.getWorld().removeObject(this);
}
}
Quiz Time >> Buatlah agar jika balon berwarna kuning dipecahkan, score Anda juga bertambah.
Langkah terakhir dari skenario ini adalah penambahan kondisi untuk permainan berakhir. Kita dapat membuat peraturan sendiri mengenai kondisi ini. Namun agar seragam, mari kita mengkondisikan permainan berakhir jika salah satu dari balon berwarna merah menyentuh layar bagian atas. Untuk membuat hal tersebut terjadi, kita perlu melakukan update terhadap dua buah class yaitu MyWorld dan RedBalloon.
Sebelum menambahkan kode program untuk membuat permainan berakhir, kita perlu menambahkan sebuah class bernama Label yang dapat diakses melalui Edit >> Import Class. Class ini akan digunakan untuk menampilkan teks (tulisan) "GAME OVER" pada permainan jika salah satu balon menyentuh layar bagian atas. Setelah Anda menambahkan class Label, barulah tambahkan method gameOver()
seperti pada kode program di bawah.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class MyWorld extends World {
// Declare object for GreenfootSound
private GreenfootSound bgSound;
// Declare object for counter
private Counter scoreCounter;
/**
* Constructor for objects of class MyWorld.
*
*/
public MyWorld() {
// Create a 480*800 world with density 1 px
super(480, 800, 1);
// Set background for this world (needed if this app wants to be ported)
this.setBackground("recycpap.jpg");
prepare();
}
public void act() {
/*
* Auto generate red baloon if random number less than 3
*/
if (Greenfoot.getRandomNumber(100) < 2) {
this.addObject(new RedBalloon(), getBaloonRandomXPosition(),
getHeight());
}
/*
* Auto generate yellow baloon if random number equals to 99
*/
if (Greenfoot.getRandomNumber(200) == 99) {
this.addObject(new YellowBalloon(), getBaloonRandomXPosition(),
getHeight());
}
}
private int getBaloonRandomXPosition() {
int randomNumber = Greenfoot.getRandomNumber(getWidth());
if (randomNumber >= getWidth() - 25) {
randomNumber -= 25;
}
return randomNumber;
}
/**
* Add 10 to scoreCounter
*/
public void addScoreForRedBaloon() {
scoreCounter.add(10);
}
/**
* Add 20 to scoreCounter
*/
public void addScoreForYellowBaloon() {
scoreCounter.add(20);
}
/**
* This method is used to show a game over to user and stop the gameplay.
*/
public void gameOver() {
Label labelGameOver = new Label("Game Over", 80);
this.addObject(labelGameOver, getWidth() / 2, getHeight() / 2);
Greenfoot.stop();
}
/**
* Prepare the world for the start of the program.
* That is: create the initial objects and add them to the world.
*/
private void prepare() {
// Add dart object to world
this.addObject(new Dart(), getWidth() / 2, getHeight() / 2);
// Create a background sound
bgSound = new GreenfootSound("Jenga.mp3");
bgSound.setVolume(50);
bgSound.playLoop();
// Create a score counter and add it to world
scoreCounter = new Counter("Score: ");
this.addObject(scoreCounter, 80, 780);
}
}
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
* @author Robby Tan
* @version 1.0
*/
public class RedBalloon extends Actor {
public RedBalloon() {
this.setImage("balloon1.png");
}
/**
* Act - do whatever the RedBaloon wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act() {
this.setLocation(this.getX(), this.getY() - 1);
if (this.getY() == 0) {
((MyWorld) this.getWorld()).gameOver();
}
}
public void pop() {
((MyWorld) this.getWorld()).addScoreForRedBaloon();
this.getWorld().removeObject(this);
}
}