Dosen Pengampu :
Adi Wahyu Pribadi, S.Si., M.Kom
Anggota Kelompok :
Filia Sekar Murty (4518210039)
Syahrial Akbar Muzaki (4518210012)
Dirga Nugrah Putra (4518210075)
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.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
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.
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.
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;
//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();
}
launch(args);
}
b. Context.java
package sample.models;
//Getter
private final Player player = new Player(100, 20, (float) 0.6, "Player");
c. Entity.java
package sample.models;
//Getter
//Setter
//Attack Bot
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;
e. Player.java
package sample.models;
public Player() {
super(100, 20, (float) 0.6, "Player");
}
//Getter
this.name = name;
}
}
f. Goblin.java
package sample.models;
g. Wizard.java
package sample.models;
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;
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;
continueButton.setDisable(false);
}));
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;
@FXML
private Label playerTalks;
@FXML
protected Button attackButton;
@FXML
protected Button guardButton;
@FXML
protected Button continueButton;
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;
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;
@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;
@FXML
private Label endingNarasi;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
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;
@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;
@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;
@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() + " ?");
Parent secondScene =
FXMLLoader.load(getClass().getResource("/sample/views/characterView.fxml"));
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;
@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!");
}
@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;
@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");
}
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;
@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;
@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.");
}
@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;
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?>
</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?>
</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?>
</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?>
</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?>
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?>
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?>
</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?>
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?>
</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?>
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?>
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?>
</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
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/