Anda di halaman 1dari 49

Laporan Tugas Besar

Turn Based Game Dengan JavaFx


Pemrograman Berorientasi Objek

Dosen Pengampu :
Adi Wahyu Pribadi, S.Si., M.Kom

Anggota Kelompok :
Filia Sekar Murty (4518210039)
Syahrial Akbar Muzaki (4518210012)
Dirga Nugrah Putra (4518210075)

Fakultas Teknik Program Studi Informatika


2019-2020
KATA PENGANTAR
Puji syukur penulis Panjatkan kepada Tuhan Yang Maha Esa atas egala berkat dan kasih karunia-Nya
sehingga laporan ini dapat diselesaikan dengan baik.
Laporan ini ditulis dalam rangka memenuhi tugas besar Mata Kuliah Pemrograman Berorientasi Objek
pada Program Studi Teknik Informatika, Fakultas Teknik Universitas Pancasila, Jakarta.
Dalam penulisan dan pembangunan projek penulis banyak memperoleh bantuan baik berupa pengajaran,
bimbingan dan arahan dari bermacam pihak. Oleh karena itu penulis menyampaikan ucapan terima kasih
sebesar-besarnya dan penghargaan setinggi-tingginya kepada yang terhormat dosen Mata Kuliah Pemrograman
Berorientasi Objek, Bapak Adi Wahyu Pribadi, S.Si., M.Kom. Dengan kerja keras beliau dalam membimbing
penulis serta kawan-kawannya supaya memahami konsep dan pengertian hal-hal seputar Pemrograman
Berorientasi Objek.
Pada akhir kata penulis beserta timnya berharap semoga laporan ini dapat bermanfaat dan permintaan
maaf yang tulus apabila dalam penulisan dan pembentukan laporan ini terdapat kekurangan dan kesalahan, baik
berupa penulisan maupun pengertian.
DAFTAR ISI

KATA PENGANTAR.......................................................................................................................................2
DAFTAR ISI...................................................................................................................................................3
BAB 1...........................................................................................................................................................4
PENDAHULUAN...........................................................................................................................................4
1.1 Latar Belakang.............................................................................................................................4
1.2 Rumusan Masalah.......................................................................................................................4
1.3 Tujuan..........................................................................................................................................4
BAB II...........................................................................................................................................................5
PEMBAHASAN.............................................................................................................................................5
2.1 Konsep.........................................................................................................................................5
A. Class.............................................................................................................................................5
B. Relasi...........................................................................................................................................5
C. UML.............................................................................................................................................6
2.2 Mockup........................................................................................................................................6
2.3 Source Code...............................................................................................................................10
2.4 Membuat file .jar VoidGame.JAR...............................................................................................46
BAB III........................................................................................................................................................50
KESIMPULAN.............................................................................................................................................50
3.1 Kesimpulan................................................................................................................................50
3.2 Saran..........................................................................................................................................50
DAFTAR PUSTAKA......................................................................................................................................51
BAB 1
PENDAHULUAN
1.1 Latar Belakang
Dalam perkembangan teknologi dan pendidikan saat ini banyak diajarkan bagaimana cara untuk
membuat suatu produk yang unik, baik berupa karya digital maupun karya fisik. Salah satu cara mudah yang
umum diajarkan adalah dengan menggunakan Object Oriented Programming  (OOP). Pemrograman
Berorientasi Objek atau Object Oriented Programming (OOP) merupakan sebuah paradigma atau teknik
pemrograman yang berorientesikan Objek. Dalam OOP fingsi dan vatiabel berada di dalam sebuah objek atau
class yang dapat saling berinteraksi, sehingga membentuk sebuah program.
Salah satu program yang memiliki konsep OOP adalah video game atau permainan digital, yang pada
akhir-akhir ini sedang naik daun. Permaian digital biasanya dirancang untuk menghibur pemainnya dan
memberikan pengalaman unik ketika berinteraksi dengan NPC atau pemain lain secara bersamaan.

1.2 Rumusan Masalah


Berdasarkan latar belakang yang terurai diatas maka dapat disimpulkan rumusan masalahnya sebagai
berikut :
1. Apakah JavaFx dapat digunakan untuk membuat permainan yang dapat menghibur pemainnya.
2. Bagaimana susunan Class, Relasi dan UML dari permainan yang akan dibuat.
3. Seperti apa tampilan (mockup) yang akan disajikan dalam permainan.
4. Seperti apa Source Code dalam permainan ini.
5. Hasil implementasi permainan yang dibuat.

1.3 Tujuan
Laporan ini disusun dengan tujuan sebagai tugas besar Pemrograman Berorientasi Objek, bertujuan untuk
membuat suatu permainan singkat dan simpel, menggunakan JavaFX dan SceneBuilder.
BAB II
PEMBAHASAN
2.1 Konsep
Pada tugas besar kali ini kami telah membuat sebuah game yang singkat, dengan menggunakan JavaFx dan
SceneBuilder. Game yang kami rancang menceritakan tentang seorang pemain yang mengikuti sebuah
perburuan atau sayembara, pemain mendapatkan tugas untuk memburu seorang Wizard. Permainan ini memiliki
turn based battle atau pertarungan yang bergilir antara pemain dan NPC. Permainan ini dibuat singkat dan
mudah ditamati, dengan tombol dan desain yang mudah dimengerti dan sederhana.

A. Class
Class yang terdapat pada projek ini adalah :
 Battle
 Context
 Entity
 EntityType
 Goblin
 Player
 Wizard

B. Relasi
Pada permainan ini class Player, Goblin dan Wizard merupakan child (inherritance) dari class Entity.
Class Entity sendiri memiliki class EntityType sebagai filter yang digunakan saat pemain melakukan
pertempuran dengan musuh. Class Context berfungsi untuk menyalurkan data yaitu nama pemain yang terapat
dalam class Player ke FXML dan tampilan layar.
C. UML

Gambar 1 : UML voidGame

2.2 Mockup
Sebelum memasuki tahap pemrogaman kami terlebih dahulu membuat desain awal atau mockup, pertama-tama
kami membuat sketsa kasar model tampilan yang akan dibuat.
Gambar 2 : Mockup tampilan menu utama

Pada tampilan menu utama terdapat tiga tombol untuk memulai permainan, melihat orang-orang dibalik layar,
dan keluar. Diatas ketiga tombol ada logo yang menjadi ciri khas dari permainan yang kami buat.

Gambar 3 : Mockup pembuka cerita

Tampilan kedua merupakan sambutan kepada pemain, dimana pemain diberikan keterangan singkat tentang alur
yang menanti mereka. Pemain juga diharuskan mengisi nama untuk karkater mereka dan apabila tidak mengisi
nama pemain tidak dapat melanjutkan permainan.
Gambar 4 : Mockup gambaran karakter pemain

Setelah pemain mengisi nama untuk karakter mereka pemain dapat melihat seperti apa kearakter mereka dan
perlengkapan apa yang mereka miliki.

Gambar 5 : Interaksi NPC dengan pemain


Gambar 6 : Turn based battle

Ketika pertarungan dimulai, pemain disajikan tiga buah tombol ; [SERANG] adalah tombol untuk melakukan serangan
kepada musuh, ketika pemain memilih untuk menyerang giliran pemain sudah selesai dan NPC akan memilih menyerang
atau bertahan secara random sebagai tindakan berikutnya. [BERTAHAN] adalah tombol untuk melakukan pertahanan,
efek dari tindakan ini adalah mengurangi kesempatan untuk menerima serangan dan akan langsung mengakhiri giliran
yang dimiliki pemain.
Tombol yang ketiga adalah [LANJUTKAN] tombol ini hanya akan bereaksi ketika musuh sudah dikalahkan, apabila
dipilih sebelum musuh kalah tidak akan terjadi apa-apa.

Gambar 7 : ENDING

Diakhir pertarungan pemain dengan musuh utama, pemain akan mendapatkan ilustrasi spesial yang menggambarkan
kemenangan pemain. Dan tersedia menu untuk kembali ke menu utama dan bermain lagi.
2.3 Source Code
A. Program Utama
a. Main.java
package sample;

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

import java.io.IOException;

import static javafx.scene.media.MediaPlayer.INDEFINITE;

public class Main extends Application {


@Override
public void start(Stage primaryStage) throws IOException{

//Mainkan backsound
final Task task = new Task() {

@Override
protected Object call() throws Exception {
int s = INDEFINITE;
AudioClip audio = new AudioClip(getClass().getResource("backsound/poker
face medieval.wav").toExternalForm());
audio.setVolume(0.5f);
audio.setCycleCount(s);
audio.play();
return null;
}
};
Thread thread = new Thread(task);
thread.start();

//Memulai scene
Parent root = FXMLLoader.load(getClass().getResource("views/mainScene.fxml"));
primaryStage.setTitle("VOID");
Scene scene = new Scene (root, 626, 400);
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {

launch(args);
}

b. Context.java
package sample.models;

public class Context {


private final static Context instance = new Context();

public static Context getInstance() {


return instance;
}

//Getter
private final Player player = new Player(100, 20, (float) 0.6, "Player");

public Player getPlayer() {


return player;
}
}

c. Entity.java
package sample.models;

public class Entity {


protected String name;
private int health = 100;
private int attackDamage = 0;
private float guardPercentage = (float) 0.75;
private boolean isGuarding = false;

public Entity(int health, int attackDamage, float guardPercentage, String name){


this.name = name;
this.health = health;
this.attackDamage = attackDamage;
this.guardPercentage = guardPercentage;
}

//Getter

public String getName() {


return name;
}

public int getHealth () {


return health;
}

public float getGuardPercentage() {


return guardPercentage;
}

public boolean getGuarding () {


return isGuarding;
}

//Setter

public void setName(String name) {


this.name = name;
}

public String setGuarding (boolean status) {


isGuarding = status;

return getName() + " melakukan pertahanan.";


}

public int setHealth (int newHealth) {


health = newHealth;
return health;
}

//Attack Bot

public String[] attack(Entity enemy) {


if (isGuarding) {
setGuarding(false);
}

int newHealth;
if (!enemy.getGuarding()) {
newHealth = enemy.getHealth() - attackDamage;
} else {
newHealth = (int) (enemy.getHealth() - (attackDamage * (1 -
enemy.getGuardPercentage())));
enemy.setGuarding(false);
}

if (newHealth < 0) {
newHealth = 0;
}

String[] messages = {
getName() + " menyerang " + enemy.getName() + " dengan damage " + attackDamage
+ ".",
"Health " + enemy.getName() + " berkurang dari " + enemy.getHealth() + " menjadi "
+ newHealth + ".",
};
enemy.setHealth(newHealth);

return messages;
}

d. EntityType.java

package sample.models;

public enum EntityType {


PLAYER,
ENEMY
}

e. Player.java
package sample.models;

public class Player extends Entity {


private String name;

public Player() {
super(100, 20, (float) 0.6, "Player");
}

//Getter

public String getName() {


return name;
}
//Setter
public void setName(String name) {

this.name = name;
}
}

f. Goblin.java

package sample.models;

public class Goblin extends Entity {


public Goblin() {
super(60, 5, (float) 0.2, "Goblin");
}
}

g. Wizard.java
package sample.models;

public class Wizard extends Entity {


public Wizard() {
super(80, 15, (float) 0.3, "Wizard");
}
}

B. Controller
a. attackGoblinController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.Node;
import sample.models.Battle;
import sample.models.Context;
import sample.models.Goblin;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class attackGoblinController extends BattleController implements Initializable {


@Override
public void initialize(URL url, ResourceBundle rb) {
setBattle(new Battle(
Context.getInstance().getPlayer(),
new Goblin(),
this::playerTalks,
this::enemyTalks,
this::onPlayerAttack,
this::onPlayerTurn,
() -> {
playerTalks("Sangat efektif!");
enemyTalks("Argh!");

continueButton.setDisable(false);
}));

playerTalks("Err... Hai....");
enemyTalks("Hei! Penyusup!");

continueButton.setDisable(true);
}

@FXML
public void attackButtonOnAction(ActionEvent event) throws IOException {
getBattle().playerAttackAction();
}

@FXML
public void guardButtonOnAction(ActionEvent event) throws IOException {
getBattle().playerGuardAction();
}

@FXML
public void continueButtonOnAction(ActionEvent event) throws IOException {
Parent characterView = null;
try {
characterView =
FXMLLoader.load(getClass().getResource("/sample/views/looted.fxml"));
} catch (IOException e) {
e.printStackTrace();
}
Scene characterViewScene = new Scene(characterView);
Stage characterViewStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
characterViewStage.hide();
characterViewStage.setScene(characterViewScene);
characterViewStage.show();
}

b. attackWizardController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.Node;
import sample.models.Battle;
import sample.models.Context;
import sample.models.Wizard;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class attackWizardController extends BattleController implements Initializable {


@Override
public void initialize(URL url, ResourceBundle rb) {
setBattle(new Battle(
Context.getInstance().getPlayer(),
new Wizard(),
this::playerTalks,
this::enemyTalks,
this::onPlayerAttack,
this::onPlayerTurn,
() -> {
playerTalks("Karirmu berakhir di sini!");
enemyTalks("Waktumu akan datang!");

continueButton.setDisable(false);
}));

playerTalks("Akhirnya, wizard yang kucari-cari.");


enemyTalks("Beraninya kau memasuki wilayahku!");

continueButton.setDisable(true);
}

@FXML
public void attackButtonOnAction(ActionEvent event) throws IOException {
getBattle().playerAttackAction();
}

@FXML
public void guardButtonOnAction(ActionEvent event) throws IOException {
getBattle().playerGuardAction();
}

@FXML
public void continueButtonOnAction(ActionEvent event) throws IOException {
Parent characterView = null;
try {
characterView =
FXMLLoader.load(getClass().getResource("/sample/views/endingScene.fxml"));
} catch (IOException e) {
e.printStackTrace();
}
Scene characterViewScene = new Scene(characterView);
Stage characterViewStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
characterViewStage.hide();
characterViewStage.setScene(characterViewScene);
characterViewStage.show();
}

c. BattleController

package sample.controllers;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import sample.models.Battle;
import sample.models.Entity;
import sample.models.EntityType;

public class BattleController {


@FXML
private Label enemyTalks;

@FXML
private Label playerTalks;

@FXML
protected Button attackButton;

@FXML
protected Button guardButton;

@FXML
protected Button continueButton;

private Battle battle;


public Battle getBattle() {
return battle;
}
public void setBattle(Battle battle) {
this.battle = battle;
}

private void entityTalk(EntityType type, String message) {


Entity entity = type == EntityType.PLAYER ? battle.getPlayer() : battle.getEnemy();
Label label = type == EntityType.PLAYER ? playerTalks : enemyTalks;

int health = entity.getHealth();


int guardPercentage = (int) (entity.getGuardPercentage() * 100);
String name = entity.getName();
String guardingText = entity.getGuarding()
? " - Guarding (-" + guardPercentage + "% damage)"
: "";

label.setText(name + " - Health: " + health + guardingText + "\n" + message);


}

public void playerTalks(String message) {


entityTalk(EntityType.PLAYER, message);
}

public void enemyTalks(String message) {


entityTalk(EntityType.ENEMY, message);
}

public void onPlayerAttack() {


attackButton.setDisable(true);
guardButton.setDisable(true);
}

public void onPlayerTurn() {


attackButton.setDisable(false);
guardButton.setDisable(false);
}

public void onPlayerWin() {


continueButton.setDisable(false);
}
}

d. characterViewController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Node;
import sample.models.Context;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
public class characterViewController implements Initializable {
@FXML
private Label namelabel;

@FXML
private Button lanjutbutton;

@Override
public void initialize(URL url, ResourceBundle rb) {
namelabel.setText(Context.getInstance().getPlayer().getName());
}

@FXML
public void lanjutbuttonOnAction(ActionEvent event) throws IOException {
Parent characterView =
FXMLLoader.load(getClass().getResource("/sample/views/story.fxml"));
Scene characterViewScene = new Scene(characterView);
Stage characterViewStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
characterViewStage.hide();
characterViewStage.setScene(characterViewScene);
characterViewStage.show();
}
}

e. Controller
package sample.controllers;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public class Controller {


@FXML
private Button exitbutt;

public void setexitbuttOnAction(ActionEvent event)


{
Stage primarystage = (Stage) exitbutt.getScene().getWindow();
primarystage.close();
}
}

f. creditController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import javafx.scene.Node;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class creditController implements Initializable {


@FXML
private Button kembalibutton;

@Override
public void initialize(URL url, ResourceBundle rb) { }

@FXML
public void kembalibuttonOnAction(ActionEvent event) throws IOException {
Parent credit =
FXMLLoader.load(getClass().getResource("/sample/views/mainScene.fxml"));
Scene creditScene = new Scene(credit);
Stage creditSceneStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
creditSceneStage.hide();
creditSceneStage.setScene(creditScene);
creditSceneStage.show();
}
}

g. endingSceneController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Node;
import sample.models.Context;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class endingSceneController implements Initializable {


@FXML
private Button selesaiButton;

@FXML
private Label endingNarasi;

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

String name = Context.getInstance().getPlayer().getName();


endingNarasi.setText("Kamu berhasil mengalahkan Wizard itu\n" +
"sebagai bukti kemenangan kamu\n" +
"membawa tongkat milik Wizard itu.\n" +
"Dan beberapa barang berharga lainnya.\n" +
"\n" +
"Selamat atas kemenanganmu " + name + " !");
selesaiButton.setText("Kembali ke Menu");
}
@FXML
public void selesaiButtonOnAction(ActionEvent event) throws IOException {
Parent endScene =
FXMLLoader.load(getClass().getResource("/sample/views/mainScene.fxml"));
Scene endSceneScene = new Scene(endScene);
Stage endSceneStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
endSceneStage.hide();
endSceneStage.setScene(endSceneScene);
endSceneStage.show();
}

h. lootedController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Node;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class lootedController implements Initializable {


@FXML
private Button ohButton;
@FXML
private Label narasiCerita;

@Override
public void initialize(URL url, ResourceBundle rb) {
narasiCerita.setText("Kamu menemukan secarik kertas di tas gendong milik\n" +
"Goblin yang menyerangmu tadi.\n" +
"\n" +
"'Dari pohon Beringin belok ke kanan'\n" +
"\n" +
"Kamu pun mencari sebuah pohon Beringin.");
ohButton.setText("Aku ingat ada Beringin di dekat sungai.");
}

@FXML
public void ohButtonOnAction(ActionEvent event) throws IOException {
Parent looted =
FXMLLoader.load(getClass().getResource("/sample/views/story3.fxml"));
Scene lootedScene = new Scene(looted);
Stage lootedStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
lootedStage.hide();
lootedStage.setScene(lootedScene);
lootedStage.show();
}

i. mainSceneController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.Node;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class mainSceneController implements Initializable{

@FXML
private Button playbutton;
@FXML
private Button creditbutton;
@FXML
private Button exitbutton;

@Override
public void initialize(URL url, ResourceBundle rb) { }

@FXML
public void playbuttonOnAction(ActionEvent event) throws IOException {
Parent mainScene =
FXMLLoader.load(getClass().getResource("/sample/views/secondScene.fxml"));
Scene mainSceneScene = new Scene(mainScene);
Stage mainSceneStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
mainSceneStage.hide();
mainSceneStage.setScene(mainSceneScene);
mainSceneStage.show();
}

@FXML
public void creditbuttonOnAction(ActionEvent event) throws IOException {
Parent mainScene =
FXMLLoader.load(getClass().getResource("/sample/views/credit.fxml"));
Scene mainSceneScene = new Scene(mainScene);
Stage mainSceneStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
mainSceneStage.hide();
mainSceneStage.setScene(mainSceneScene);
mainSceneStage.show();
}

@FXML
public void exitbuttonOnAction(ActionEvent event) throws IOException{
Stage primarystage = (Stage) exitbutton.getScene().getWindow();
primarystage.close();
}
}

j. secondScreenController
package sample.controllers;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javafx.scene.Node;
import sample.models.Context;

import java.io.IOException;
import java.net.URL;
import java.util.Optional;
import java.util.ResourceBundle;

public class secondSceneController implements Initializable {


@FXML
private Button okbutton;

@FXML
private TextField namefield;

@Override
public void initialize(URL url, ResourceBundle rb) { }

@FXML
public void okbuttonOnAction(ActionEvent event) throws IOException {
if (namefield.getText().isEmpty()) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error Dialog");
alert.setHeaderText(null);
alert.setContentText("Harap masukkan nama kamu!");

alert.showAndWait();
} else {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog");
alert.setHeaderText(null);
alert.setContentText("Apakah nama kamu adalah " + namefield.getText() + " ?");

Optional<ButtonType> result = alert.showAndWait();


if (result.get() == ButtonType.OK){
Context.getInstance().getPlayer().setName(namefield.getText());

Parent secondScene =
FXMLLoader.load(getClass().getResource("/sample/views/characterView.fxml"));

Scene secondSceneScene = new Scene(secondScene);


Stage secondSceneStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
secondSceneStage.hide();
secondSceneStage.setScene(secondSceneScene);
secondSceneStage.show();
}
}
}
}

k. story2Controller
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Node;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class story2Controller implements Initializable {


@FXML
private Button ohButton;
@FXML
private Label narasiCerita;

@Override
public void initialize(URL url, ResourceBundle rb) {
narasiCerita.setText("Tidak lama setelah Prajurit itu datang, kamu segera bersiap\n"
+
"dan pergi ke hutan tempat Wizard itu berada.");
ohButton.setText("Duna luar aku datang!");
}

public void StageGoblin(){


narasiCerita.setText("Kamu berjalan melewati sungai dan masuk kedalam hutan.\n"
+
"Kamu berhenti melangkah dan mulai mengamati lingkungan\n" +
"sekitar, lalu kamu melihat sebuah bayangan mendekatimu.\n" +
"\n" +
"KAMU DISERANG!\n");
ohButton.setText("Bersiap untuk menyerang");
}

@FXML
public void ohButtonOnAction( ) throws IOException {
StageGoblin();
ohButton.setOnAction(event -> {
Parent mission = null;
try {
mission =
FXMLLoader.load(getClass().getResource("/sample/views/attackGoblin.fxml"));
} catch (IOException e) {
e.printStackTrace();
}
Scene missionScene = new Scene(mission);
Stage missionStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
missionStage.hide();
missionStage.setScene(missionScene);
missionStage.show();
});
}
}

l. story3Controller
package sample.controllers;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Node;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class story3Controller implements Initializable {


@FXML
private Button ohButton;
@FXML
private Label narasiCerita;

@Override
public void initialize(URL url, ResourceBundle rb) {
narasiCerita.setText("Kamu berusaha mengingat dimana kamu\n" +
"pernah melihat pohon Beringin\n" +
"Kamu menyusuri pinggiran sungai sampai\n" +
"akhirnya kamu melihat sebuah pohon\n" +
"yang besar dan teduh.\n");
ohButton.setText("Ok, sekarang belok ke kanan");
}

public void stageWizard(){


narasiCerita.setText("Oops, sepertinya kamu tidak menemukan Wizard itu.\n" +
"Tapi...\n" +
"Wizard itu yang menemukan kamu!\n" +
"KAMU DISERANG!\n");
ohButton.setText("Ah, sangat mengejutkan.");
}
@FXML
public void ohButtonOnAction( ) throws IOException {
stageWizard();
ohButton.setOnAction(event -> {
Parent mission = null;
try {
mission =
FXMLLoader.load(getClass().getResource("/sample/views/attackWizard.fxml"));
} catch (IOException e) {
e.printStackTrace();
}
Scene missionScene = new Scene(mission);
Stage missionStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
missionStage.hide();
missionStage.setScene(missionScene);
missionStage.show();
});
}

m. storyController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Node;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class storyController implements Initializable {


@FXML
private Button ohButton;
@FXML
private Label narasiCerita;

@Override
public void initialize(URL url, ResourceBundle rb) {
narasiCerita.setText("Kamu mendengar suara ketukan, kamu pun pergi
menghampiri suara tersebut.\n" +
"Ketukan itu kembali terdengar dari pintu depan rumahmu.\n" +
"Setelah kamu membuka pintu, kamu melihat seorang prajurit berdiri dengan
selembar\n" +
"kertas ditangannya.\n");
ohButton.setText("Selamat pagi pak, ada yang bisa saya bantu?");

@FXML
public void ohButtonOnAction(ActionEvent event) throws IOException {
Parent storyController =
FXMLLoader.load(getClass().getResource("/sample/views/theMission.fxml"));
Scene storyControllerScene = new Scene(storyController);
Stage storyControllerStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
storyControllerStage.hide();
storyControllerStage.setScene(storyControllerScene);
storyControllerStage.show();
}
}

n. theMissionController
package sample.controllers;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Node;
import sample.models.Context;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class theMissionController implements Initializable {


@FXML
private Button lanjutkanButton;

@FXML
private Label narasiSatuLabel;

@Override
public void initialize(URL url, ResourceBundle rb) {
String name = Context.getInstance().getPlayer().getName();
narasiSatuLabel.setText("Selamat pagi, kamu yang bernama " + name + " ?\n" +
"Sayembara yang kamu ikuti sudah dimulai.\n" +
"Tugas kamu adalah memburu seorang Wizard.");
}

public void narasiKedua(){


narasiSatuLabel.setText("Wizard itu tinggal di kawasan hutan sebelah Timur,\n" +
"Wizard itu tentunya tidak ingin diganggu jadi\n" +
"berhati-hatilah dengan Goblin yang berjaga disana.\n");
}

@FXML
public void lanjutkanButtonOnAction( ) throws IOException {
narasiKedua();
lanjutkanButton.setOnAction(event -> {
Parent mission = null;
try {
mission =
FXMLLoader.load(getClass().getResource("/sample/views/story2.fxml"));
} catch (IOException e) {
e.printStackTrace();
}
Scene missionScene = new Scene(mission);
Stage missionStage = (Stage) ((Node)
event.getSource()).getScene().getWindow();
missionStage.hide();
missionStage.setScene(missionScene);
missionStage.show();
});
}
}

C. FakeMain
package sample;

public class FakeMain {


public static void main(String[] args) {
Main.main(args);
}
}

D. FXML (SceneBuilder)
a. attackGoblin.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.Rectangle?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-


Infinity" prefHeight="400.0" prefWidth="600.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.attackGoblinController">
<children>
<ImageView fitHeight="95.0" fitWidth="117.0" layoutX="488.0" layoutY="24.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../sprites/goblin.png" />
</image>
</ImageView>
<ImageView fitHeight="95.0" fitWidth="117.0" layoutX="46.0" layoutY="150.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../sprites/oc.png" />
</image>
</ImageView>
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636" height="95.0" layoutX="46.0"
layoutY="24.0" stroke="BLACK" strokeType="INSIDE" width="441.0" />
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636" height="95.0" layoutX="145.0"
layoutY="150.0" stroke="BLACK" strokeType="INSIDE" width="441.0" />
<Label id="goblinTalks" fx:id="enemyTalks" layoutX="65.0" layoutY="40.0"
text="Label" />
<Label id="playerTalks" fx:id="playerTalks" layoutX="160.0" layoutY="165.0"
text="Label" />
<Button id="attackButton" fx:id="attackButton" onAction="#attackButtonOnAction"
layoutX="221.0" layoutY="261.0" mnemonicParsing="false" prefHeight="25.0"
prefWidth="159.0" text="Serang" />
<Button id="guardButton" fx:id="guardButton" onAction="#guardButtonOnAction"
layoutX="221.0" layoutY="294.0" mnemonicParsing="false" prefHeight="25.0"
prefWidth="159.0" text="Bertahan" />
<Button id="continueButton" fx:id="continueButton"
onAction="#continueButtonOnAction" layoutX="221.0" layoutY="327.0"
mnemonicParsing="false" prefHeight="25.0" prefWidth="159.0" text="Lanjutkan" />
</children>
<stylesheets>
<URL value="@../styles/darkTheme.css" />

</stylesheets>
</AnchorPane>

b. attackWizard.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.Rectangle?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-


Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.attackWizardController">
<children>
<ImageView fitHeight="95.0" fitWidth="117.0" layoutX="488.0" layoutY="24.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../sprites/wizard.png" />
</image>
</ImageView>
<ImageView fitHeight="95.0" fitWidth="117.0" layoutX="46.0" layoutY="150.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../sprites/oc.png" />
</image>
</ImageView>
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636" height="95.0" layoutX="46.0"
layoutY="24.0" stroke="BLACK" strokeType="INSIDE" width="441.0" />
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636" height="95.0" layoutX="143.0"
layoutY="150.0" stroke="BLACK" strokeType="INSIDE" width="441.0" />
<Label id="wizardTalks" fx:id="enemyTalks" layoutX="60.0" layoutY="34.0"
text="Label" />
<Label id="playerTalks" fx:id="playerTalks" layoutX="160.0" layoutY="160.0"
text="Label" />
<Button id="attackButton" fx:id="attackButton" onAction="#attackButtonOnAction"
layoutX="234.0" layoutY="263.0" mnemonicParsing="false" prefHeight="25.0"
prefWidth="159.0" text="Serang" />
<Button id="guardButton" fx:id="guardButton" onAction="#guardButtonOnAction"
layoutX="234.0" layoutY="296.0" mnemonicParsing="false" prefHeight="25.0"
prefWidth="159.0" text="Bertahan" />
<Button id="continueButton" fx:id="continueButton"
onAction="#continueButtonOnAction" layoutX="221.0" layoutY="327.0"
mnemonicParsing="false" prefHeight="25.0" prefWidth="159.0" text="Lanjutkan" />
</children>
<stylesheets>
<URL value="@../styles/darkTheme.css" />

</stylesheets>
</AnchorPane>

c. characterView.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"


minWidth="-Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.characterViewController">
<children>
<ImageView fitHeight="150.0" fitWidth="200.0" layoutX="238.0" layoutY="14.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../sprites/oc.png" />
</image>
</ImageView>
<Label layoutX="222.0" layoutY="244.0" text=" Rapier +20 Atk" />
<Button id="lanjutbutton" fx:id="lanjutbutton" layoutX="260.0" layoutY="340.0"
mnemonicParsing="false" onAction="#lanjutbuttonOnAction"
onMouseClicked="#lanjutbuttonOnAction" text="Continue" />
<Label layoutX="204.0" layoutY="280.0" text="Magic Robe +30
Def" />
<Label id="namelabel" fx:id="namelabel" layoutX="295.0" layoutY="200.0"
text="Label" />
</children>
<stylesheets>
<URL value="@../styles/darkTheme.css" />

</stylesheets>
</AnchorPane>

d. credit.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"


minWidth="-Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.creditController">
<children>
<Label layoutX="265.0" layoutY="38.0" text="Developer Team">
<font>
<Font name="Bookman Old Style Bold" size="69.0" />
</font>
</Label>
<Label layoutX="250.0" layoutY="74.0" text="Syarial Akbar Muzaki" />
<Label layoutX="263.0" layoutY="95.0" text="Filia Sekar Murty" />
<Label layoutX="254.0" layoutY="116.0" text="Dirga Nugrah Putra" />
<Label layoutX="287.0" layoutY="175.0" text="UI Design" />
<Label layoutX="250.0" layoutY="207.0" text="Syarial Akbar Muzaki" />
<Label layoutX="263.0" layoutY="268.0" text="Character Design" />
<Label layoutX="264.0" layoutY="301.0" text="Filia Sekar Murty" />
<Button id="kembalibutton" fx:id="kembalibutton" layoutX="270.0"
layoutY="353.0" mnemonicParsing="false" onAction="#kembalibuttonOnAction"
onMouseClicked="#kembalibuttonOnAction" text="Kembali" />
</children>
<stylesheets>
<URL value="@../styles/darkTheme.css" />

</stylesheets>
</AnchorPane>

e. endingScene.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.shape.Rectangle?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-


Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
stylesheets="@../styles/darkTheme.css" xmlns="http://javafx.com/javafx/11.0.1"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.endingSceneController">
<children>
<ImageView fitHeight="420.0" fitWidth="626.0" pickOnBounds="true"
preserveRatio="true">
<image>
<Image url="@../../sprites/endGame.png" />
</image>
</ImageView>
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#3636368f" height="200.0"
layoutX="258.0" layoutY="26.0" stroke="BLACK" strokeType="INSIDE"
width="351.0" />
<Label id="endingNarasi" fx:id="endingNarasi" layoutX="285.0" layoutY="54.0"
text="Label" />
<Button id="selesaiButton" fx:id="selesaiButton" layoutX="342.0" layoutY="242.0"
mnemonicParsing="false" onAction="#selesaiButtonOnAction"
onMouseClicked="#selesaiButtonOnAction" opacity="0.63" text="Button" />
</children>
</Pane>

f. looted.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.shape.Rectangle?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-


Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
stylesheets="@../styles/darkTheme.css" xmlns="http://javafx.com/javafx/11.0.1"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.lootedController">
<children>
<ImageView fitHeight="400.0" fitWidth="643.0" pickOnBounds="true"
preserveRatio="true">
<image>
<Image url="@../../sprites/Loot.png" />
</image>
</ImageView>
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636d3" height="200.0"
layoutX="18.0" layoutY="45.0" stroke="BLACK" strokeType="INSIDE" width="442.0"
/>
<Button id="ohButton" fx:id="ohButton" layoutX="153.0" layoutY="264.0"
mnemonicParsing="false" onAction="#ohButtonOnAction"
onMouseClicked="#ohButtonOnAction" opacity="0.84" />
<Label id="narasiCerita" fx:id="narasiCerita" layoutX="32.0" layoutY="75.0"
text="Label" />
</children>
</Pane>

g. mainScene.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"


minWidth="-Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.mainSceneController">
<children>
<ImageView fitHeight="231.0" fitWidth="271.0" layoutX="207.0" layoutY="24.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../sprites/voidText.png" />
</image>
</ImageView>
<Button id="playbutton" fx:id="playbutton" layoutX="268.0" layoutY="206.0"
mnemonicParsing="false" onAction="#playbuttonOnAction"
onMouseClicked="#playbuttonOnAction" prefHeight="33.0" prefWidth="109.0"
text="Play" />
<Button id="creditbutton" fx:id="creditbutton" layoutX="268.0" layoutY="249.0"
mnemonicParsing="false" onAction="#creditbuttonOnAction"
onMouseClicked="#creditbuttonOnAction" prefHeight="33.0" prefWidth="109.0"
text="Credit(s)" />
<Button id="exitbutton" fx:id="exitbutton" layoutX="268.0" layoutY="292.0"
mnemonicParsing="false" onAction="#exitbuttonOnAction"
onMouseClicked="#exitbuttonOnAction" prefHeight="33.0" prefWidth="109.0"
text="Exit" />
</children>
<stylesheets>
<URL value="@../styles/darkTheme.css" />

</stylesheets>
</AnchorPane>

h. secondScene.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"


minWidth="-Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.secondSceneController">
<children>
<TextField id="namefield" fx:id="namefield" layoutX="167.0" layoutY="163.0"
onAction="#okbuttonOnAction" onInputMethodTextChanged="#okbuttonOnAction"
prefHeight="37.0" prefWidth="293.0" />
<Label layoutX="24.0" layoutY="35.0" text="Kamu terbangun di suatu ruangan
yang begitu gelap." />
<Label layoutX="24.0" layoutY="65.0" text="Kamu melihat selembar kertas, setelah
kamu amati ternyata itu adalah kertas sayembara." />
<Label layoutX="24.0" layoutY="93.0" text="Di ujung kertas tersebut tertulis :" />
<Label layoutX="214.0" layoutY="125.0" text="&quot;Harap Tuliskan Namamu
disini&quot;" textAlignment="CENTER" />
<Button id="okbutton" fx:id="okbutton" layoutX="286.0" layoutY="223.0"
mnemonicParsing="false" onAction="#okbuttonOnAction"
onMouseClicked="#okbuttonOnAction" text="OK" />
</children>
<stylesheets>
<URL value="@../styles/darkTheme.css" />
</stylesheets>
</AnchorPane>

i. story.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-


Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.storyController">
<Label id="narasiCerita" fx:id="narasiCerita" layoutX="18.0" layoutY="45.0" />
<Button id="ohButton" fx:id="ohButton" layoutX="134.0" layoutY="255.0"
mnemonicParsing="false" onAction="#ohButtonOnAction"
onMouseClicked="#ohButtonOnAction" />
<stylesheets>
<URL value="@../styles/darkTheme.css" />

</stylesheets>
</Pane>

j. story2.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.shape.Rectangle?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-


Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.story2Controller">
<stylesheets>
<URL value="@../styles/darkTheme.css" />
</stylesheets>
<children>
<ImageView fitHeight="400.0" fitWidth="643.0" pickOnBounds="true"
preserveRatio="true">
<image>
<Image url="@../../sprites/walk.png" />
</image>
</ImageView>
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636d3" height="200.0"
layoutX="18.0" layoutY="45.0" stroke="BLACK" strokeType="INSIDE" width="442.0"
/>
<Button id="ohButton" fx:id="ohButton" layoutX="153.0" layoutY="264.0"
mnemonicParsing="false" onAction="#ohButtonOnAction"
onMouseClicked="#ohButtonOnAction" opacity="0.84" />
<Label id="narasiCerita" fx:id="narasiCerita" layoutX="32.0" layoutY="75.0"
text="Label" />
</children>
</Pane>

k. story3.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.shape.Rectangle?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-


Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
stylesheets="@../styles/darkTheme.css" xmlns="http://javafx.com/javafx/11.0.1"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.story3Controller">
<children>
<ImageView fitHeight="400.0" fitWidth="643.0" pickOnBounds="true"
preserveRatio="true">
<image>
<Image url="@../../sprites/river.png" />
</image>
</ImageView>
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636d3" height="200.0"
layoutX="18.0" layoutY="45.0" stroke="BLACK" strokeType="INSIDE" width="442.0"
/>
<Button id="ohButton" fx:id="ohButton" layoutX="153.0" layoutY="264.0"
mnemonicParsing="false" onAction="#ohButtonOnAction"
onMouseClicked="#ohButtonOnAction" opacity="0.84" />
<Label id="narasiCerita" fx:id="narasiCerita" layoutX="32.0" layoutY="75.0"
text="Label" />
</children>
</Pane>

l. theMission.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.Rectangle?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"


minWidth="-Infinity" prefHeight="400.0" prefWidth="626.0" styleClass="background"
xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="sample.controllers.theMissionController">
<children>
<ImageView fitHeight="128.0" fitWidth="118.0" layoutX="485.0" layoutY="24.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../sprites/knight.png" />
</image>
</ImageView>
<Button id="lanjutkanButton" fx:id="lanjutkanButton" layoutX="245.0"
layoutY="289.0" mnemonicParsing="false" onAction="#lanjutkanButtonOnAction"
onMouseClicked="#lanjutkanButtonOnAction" prefHeight="25.0" prefWidth="154.0"
text="Lanjutkan" />
<Rectangle arcHeight="5.0" arcWidth="5.0" fill="#363636" height="224.0"
layoutX="41.0" layoutY="24.0" stroke="BLACK" strokeType="INSIDE" width="435.0"
/>
<Label id="narasiSatuLabel" fx:id="narasiSatuLabel" layoutX="58.0"
layoutY="48.0" text="Label" />
</children>
<stylesheets>
<URL value="@../styles/darkTheme.css" />

</stylesheets>
</AnchorPane>
2.4 Membuat file .jar VoidGame.JAR
1. Membuat class FakeMain.java

2. Membuat artifacts
Klik file  project structures  pilih Artifacts  klik simbol (+)  pilih JAR  pilih from modules
with dependencies  klik simbol (+) di bawah Output Layout  klik

file
Lalu cari dan copy semua file dari bin di folder JavaFX, klik apply, lalu klik OK
Lalu klik “Build”  Build Artifacts

File JAR akan muncul di folder out

2.5 Hasil Implementasi


 Main Menu
 Gameplay
 Turn based battle
 Ending
BAB III
KESIMPULAN
3.1 Kesimpulan
Pemrograman Berorientasi Objek atau Object Oriented Programming (OOP) merupakan sebuah teknik
pemrograman yang berorientasikan Objek. Pada OOP, fungsi dan variabel berada dalam sebuah objek atau class
yang dapat saling berinteraksi, sehingga membentuk sebuah program.
Game adalah sebuah inovasi yang dibuat untuk mengenalkan dunia digital dan interaksi unik antara
program kepada publik, melalui pengalaman yang menyenangkan. Permainan digital akan selalu berkembang
mengikutin trend dan desain terbaik, bahasa yang digunakan akan lebih bermacam dan aplikasi pendukungnya
akan lebih banyak.

3.2 Saran
Mengembalikan permaianan dengan metode turn based RPG dengan tampilan dan alur yang menarik.
DAFTAR PUSTAKA
Ryisnow, A Beginner’s Text Adventure Game Creation in Java, 30 April 2017, dari
https://ryisnow.net/2017/04/30/a-beginners-text-adventure-game-creation-in-java/

Pakanon Pantisawat, James Brucker, MonsterBattle, 21 Desember 2017, dari


https://github.com/pknn1/MonsterBattle

Anda mungkin juga menyukai