前提・実現したいこと
javaとjavafxを用いて、ドラクエのようなRPGを作っています。戦闘画面でお互いの攻撃ターンが進んでいくのをwhile文の繰り返しで表現しようとしたのですが、実行がうまくいきませんでした。
Mainクラスの真ん中あたりのwhile文のとこだけを消すと実行できるので、もしかしたら無限ループになってるのかなとも思ったのですが、そうだとしてもループになってしまう理由も分かりませんでした。
実行がうまくいかない理由を教えていただけませんでしょうか。よろしくお願いします。
発生している問題・エラーメッセージ
ウインドウだけは表示されるのですが、中身は何もなくエラーメッセージすら表示されず、ウインドウを閉じようとすると「OpenJDK Platform binaryは応答していません」と表示され強制終了するしかなくなります。
該当のソースコード
Java
1package application; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.scene.input.KeyEvent; 7import javafx.scene.layout.Pane; 8import javafx.scene.layout.VBox; 9import javafx.stage.Stage; 10 11public class Main extends Application { 12 public static void main(String[] args) { 13 launch(args); 14 } 15 16 private Scene sc1, sc2, sc3; 17 BattleScreenController bsc = new BattleScreenController();// = new BattleScreenController(); 18 ClearScreenController csc = new ClearScreenController(); 19 Hero hero = new Hero(); 20 Enemy enemy = new Enemy(); 21 boolean fin = false; 22 23 @Override 24 public void start(Stage primaryStage) { 25 26 try { 27 VBox root1 = (VBox) FXMLLoader.load(getClass().getResource("Sample.fxml")); 28 sc1 = new Scene(root1); 29 30// Pane root2 = (Pane)FXMLLoader.load(getClass().getResource("BattleScreen.fxml")); 31 FXMLLoader fxmlLoader1 = new FXMLLoader(getClass().getResource("BattleScreen.fxml")); 32 Pane root2 = (Pane) fxmlLoader1.load(); 33 sc2 = new Scene(root2); 34 bsc = (BattleScreenController) fxmlLoader1.getController(); 35 36 FXMLLoader fxmlLoader2 = new FXMLLoader(getClass().getResource("ClearScreen.fxml")); 37 VBox root3 = (VBox) fxmlLoader2.load(); 38 sc3 = new Scene(root3); 39 csc = (ClearScreenController) fxmlLoader2.getController(); 40 41 primaryStage.setScene(sc1); 42 primaryStage.show(); 43 sc1.setOnKeyPressed(e -> primaryStage.setScene(sc2)); 44 bsc.textSet1(); 45 46 while (!fin) { 47 sc2.setOnKeyPressed(e -> keyPressed1(e)); 48 if (enemy.getHp() <= 0 || hero.getHp() <= 0) { 49 fin = true; 50 } 51 52 } 53 54 if (enemy.getHp() <= 0) { 55 primaryStage.setScene(sc3); 56 csc.textSet1(); 57 } else if (hero.getHp() <= 0) { 58 primaryStage.setScene(sc3); 59 csc.textSet2(); 60 } 61 62 } catch (Exception exception) { 63 exception.printStackTrace(); 64 } 65 } 66 67 private void keyPressed1(KeyEvent e) { 68 switch (e.getCode()) { 69 case ENTER: 70 bsc.turn(); 71 break; 72 case BACK_SPACE: 73 bsc.textSet2(); 74 break; 75 default: 76 bsc.textSet0(); 77 break; 78 } 79 } 80}
Java
1package application; 2 3import java.net.URL; 4import java.util.InputMismatchException; 5import java.util.ResourceBundle; 6 7import javax.management.StringValueExp; 8 9import javafx.fxml.FXML; 10import javafx.scene.control.Label; 11import javafx.scene.layout.VBox; 12 13public class BattleScreenController { 14 Hero hero = new Hero(); 15 Enemy enemy = new Enemy(); 16 @FXML 17 private ResourceBundle resources; 18 19 @FXML 20 private URL location; 21 22 @FXML 23 private VBox textA; 24 25 @FXML 26 private Label sentence3; 27 28 @FXML 29 private Label sentence4; 30 31 @FXML 32 private Label name; 33 34 @FXML 35 private Label hp; 36 37 @FXML 38 private Label sentence1; 39 40 @FXML 41 private Label sentence2; 42 43 @FXML 44 private Label enemyHp; 45 46 @FXML 47 private Label sentence5; 48 49 public void error(InputMismatchException e) { 50 sentence1.setText("型が違います:" + e); 51 } 52 53 public void textReset() { 54 sentence1.setText(" "); 55 sentence2.setText(" "); 56 sentence3.setText(" "); 57 sentence4.setText(" "); 58 } 59 60 public void textSet0() { 61 sentence1.setText("EnterかBackSpaceを押してください"); 62 sentence2.setText(" "); 63 sentence3.setText(" "); 64 sentence4.setText(" "); 65 } 66 67 public void textSet1() { 68 name.setText(hero.getName()); 69 hp.setText(" " + String.valueOf(hero.getHp()) + "/500"); 70 } 71 72 public void turn() { 73 enemy.damageC(hero.getAttack(), enemy.getDefence()); 74 sentence1.setText(String.valueOf(hero.getName()) + "の攻撃!!" + String.valueOf(hero.getName()) + "はマスターソードを天にかざした"); 75 sentence2.setText(String.valueOf(enemy.getName()) + "に" + String.valueOf(enemy.getRcvDamage()) + "ダメージ!!"); 76 hero.damageC(enemy.getAttack(), hero.getDefence()); 77 sentence3.setText(String.valueOf(enemy.getName()) + "の攻撃!!" + String.valueOf(enemy.getName()) + "は燃えさかる火炎をはいた"); 78 sentence4.setText(String.valueOf(hero.getName()) + "に" + String.valueOf(hero.getRcvDamage()) + "ダメージ!!"); 79 hp.setText(String.valueOf(hero.getHp()) + "/500"); 80 sentence5.setText("EnterかBackSpaceを押してください"); 81 } 82 83 public void textSet2() { 84 sentence1.setText(String.valueOf(hero.getName()) + "は逃げ出した"); 85 sentence2.setText("しかしまわりこまれてしまった!!"); 86 sentence3.setText(String.valueOf(hero.getName()) + "は" + String.valueOf(enemy.getName()) + "のかぎづめで背中を一突きされた"); 87 hero.setHp(0); 88 hp.setText(String.valueOf(hero.getHp()) + "/500"); 89 sentence4.setText("GAME OVER!!"); 90 } 91 92 @FXML 93 void initialize() { 94 assert sentence3 != null : "fx:id=\"sentence3\" was not injected: check your FXML file 'BattleScreen.fxml'."; 95 assert sentence4 != null : "fx:id=\"sentence4\" was not injected: check your FXML file 'BattleScreen.fxml'."; 96 assert name != null : "fx:id=\"name\" was not injected: check your FXML file 'BattleScreen.fxml'."; 97 assert hp != null : "fx:id=\"hp\" was not injected: check your FXML file 'BattleScreen.fxml'."; 98 assert sentence1 != null : "fx:id=\"sentence1\" was not injected: check your FXML file 'BattleScreen.fxml'."; 99 assert sentence2 != null : "fx:id=\"sentence2\" was not injected: check your FXML file 'BattleScreen.fxml'."; 100 } 101} 102
Java
1package application; 2 3public class Hero { 4 private String name = "ゆうしゃ"; 5 private int hp = 500; 6 private int attack = 100; 7 private int defence = 50; 8 9 private int rcvDamage; 10 11 public void damageC(int attack, int defence) { 12 if (attack - defence > 0) { 13 rcvDamage = attack - defence; 14 } else if (attack - defence <= 0) { 15 rcvDamage = 1; 16 } 17 this.hp -= rcvDamage; 18 } 19 20 public String getName() { 21 return this.name; 22 } 23 24 public int getHp() { 25 return this.hp; 26 } 27 28 public void setHp(int hp) { 29 this.hp = hp; 30 } 31 32 public int getAttack() { 33 return this.attack; 34 } 35 36 public int getDefence() { 37 return this.defence; 38 } 39 40 public int getRcvDamage() { 41 return this.rcvDamage; 42 } 43 44} 45
Java
1package application; 2 3public class Enemy extends Object { 4 private String name = "魔王"; 5 private int hp = 300; 6 private int attack = 100; 7 private int defence = 50; 8 9 private int rcvDamage; 10 11 public void damageC(int attack, int defence) { 12 if (attack - defence > 0) { 13 rcvDamage = attack - defence; 14 } else if (attack - defence <= 0) { 15 rcvDamage = 1; 16 } 17 this.hp -= rcvDamage; 18 } 19 20 public String getName() { 21 return this.name; 22 } 23 24 public int getHp() { 25 return this.hp; 26 } 27 28 public void setHp(int hp) { 29 this.hp = hp; 30 } 31 32 public int getAttack() { 33 return this.attack; 34 } 35 36 public int getDefence() { 37 return this.defence; 38 } 39 40 public int getRcvDamage() { 41 return this.rcvDamage; 42 } 43 44} 45 46
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
テキストエディタとしてEclipse、GUIビルダーとしてscene builderを用いています。