前提・実現したいこと
Javaを使ってドラクエのようなRPGゲームを作ろうとしています。壁にぶつかってしまったので皆様の知恵をお借りしたいです。
UI開発にJavaFX(GUIビルダーとしてscene builder)を使っています。
今戦闘画面を作っていてプレイヤーの入力したキーによって画面にテキストを表示するということをやろうとしているのですが、原因のわからないNullPointerExceptionが出てきてしまいました。
このエラーの解決方法を教えていただきたいです。またプレイヤーの入力したキーによって画面にテキストを表示するのによい方法があったら教えていただきたいです。
ソースコードほぼ全文なのでとても長くなってしまいましたが、基本的にはBattleScreenクラスのところが一番関係していると思います。
発生している問題・エラーメッセージ
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Cannot invoke "javafx.scene.control.Label.setText(String)" because "this.hp" is null at application.BattleScreenController.textSet1(BattleScreenController.java:38) at application.Main.keyPressed(Main.java:41) at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) //省略
該当のソースコード
//import文を省略 public class Main extends Application { private Scene sc1, sc2; BattleScreenController bsc = new BattleScreenController(); @Override public void start(Stage primaryStage) { try { VBox root1 = (VBox)FXMLLoader.load(getClass().getResource("Sample.fxml")); sc1 = new Scene(root1); Pane root2 = (Pane)FXMLLoader.load(getClass().getResource("BattleScreen.fxml")); sc2 = new Scene(root2); primaryStage.setScene(sc1); primaryStage.show(); sc1.setOnKeyPressed(e -> primaryStage.setScene(sc2)); sc2.setOnKeyPressed(this::keyPressed); } catch(Exception exception) { exception.printStackTrace(); } } private void keyPressed(KeyEvent event) { switch (event.getCode()) { case ENTER: bsc.textSet1(); break; case BACK_SPACE: break; default: break; } } public static void main(String[] args) { launch(args); } }
BattleScreen
1//省略 2public class BattleScreenController { 3 Hero hero = new Hero(); 4 Enemy enemy = new Enemy(); 5 @FXML 6 private ResourceBundle resources; 7 8 @FXML 9 private URL location; 10 11 @FXML 12 private Label sentence3; 13 14 @FXML 15 private Label sentence4; 16 17 @FXML 18 private Label name; 19 20 @FXML 21 private Label hp; 22 23 @FXML 24 private Label sentence1; 25 26 @FXML 27 private Label sentence2; 28 29 public void textSet1 () { 30 enemy.damageC(hero.getAttack(), enemy.getDefence()); 31 hp.setText(String.valueOf(hero.getHp())); 32 sentence1.setText("ゆうしゃの攻撃!!"); 33 sentence2.setText("ゆうしゃはマスターソードを天にかざした"); 34 sentence3.setText("魔王に" + String.valueOf(hero.getAddDamage()) + "ダメージ!!"); 35 sentence4.setText("Press any key to continue"); 36 } 37 38 @FXML 39 void initialize() { 40 assert sentence3 != null : "fx:id=\"sentence3\" was not injected: check your FXML file 'BattleScreen.fxml'."; 41 assert sentence4 != null : "fx:id=\"sentence4\" was not injected: check your FXML file 'BattleScreen.fxml'."; 42 assert name != null : "fx:id=\"name\" was not injected: check your FXML file 'BattleScreen.fxml'."; 43 assert hp != null : "fx:id=\"hp\" was not injected: check your FXML file 'BattleScreen.fxml'."; 44 assert sentence1 != null : "fx:id=\"sentence1\" was not injected: check your FXML file 'BattleScreen.fxml'."; 45 assert sentence2 != null : "fx:id=\"sentence2\" was not injected: check your FXML file 'BattleScreen.fxml'."; 46 } 47}
Hero
1package application; 2 3public class Hero { 4 private int hp = 500; 5 private int attack = 100; 6 private int defence = 50; 7 8 private int addDamage; 9 10 public void damageC(int attack, int defence) { 11 int damage = 0; 12 if (attack - defence > 0) { 13 damage = attack - defence; 14 } else if (attack - defence <= 0) { 15 damage = 1; 16 } 17 this.hp -= damage; 18 this.addDamage = damage; 19 } 20 //getterやsetterを省略
```FXML <?xml version="1.0" encoding="UTF-8"?> <?import javafx.geometry.*?> <?import javafx.scene.image.*?> <?import javafx.scene.text.*?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?> <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.BattleScreenController"> <children> <VBox prefHeight="480.0" prefWidth="640.0"> <children> <VBox alignment="CENTER" prefHeight="119.0" prefWidth="640.0"> <children> <Label fx:id="name" text="なまえ"> <font> <Font size="26.0" /> </font> </Label> <HBox alignment="CENTER" prefHeight="53.0" prefWidth="507.0"> <children> <Label alignment="CENTER_RIGHT" text="HP:"> <font> <Font size="26.0" /> </font> </Label> <Label fx:id="hp" text="L"> <font> <Font size="26.0" /> </font> </Label> </children> </HBox> </children> </VBox> <ImageView fitHeight="240.0" fitWidth="560.0"> <image> <Image url="@../../../../Documents/プログラミング/キャラチップ/pipo-enemy46set/120x120/pipo-boss004.png" /> </image> <VBox.margin> <Insets left="40.0" right="40.0" /> </VBox.margin> </ImageView> <HBox prefHeight="124.0" prefWidth="640.0"> <children> <VBox alignment="CENTER" prefHeight="200.0" prefWidth="320.0"> <children> <Label text="1: コウゲキ"> <font> <Font size="29.0" /> </font> </Label> <Label text="2: ニゲル"> <font> <Font size="29.0" /> </font> </Label> </children> </VBox> <VBox alignment="CENTER" prefHeight="200.0" prefWidth="320.0"> <children> <Label fx:id="sentence1" alignment="CENTER" prefHeight="25.0" prefWidth="365.0" text="L"> <font> <Font size="20.0" /> </font> </Label> <Label fx:id="sentence2" alignment="CENTER" prefHeight="25.0" prefWidth="365.0" text="L"> <font> <Font size="20.0" /> </font> </Label> <Label fx:id="sentence3" alignment="CENTER" prefHeight="25.0" prefWidth="370.0" text="L"> <font> <Font size="20.0" /> </font> </Label> <Label fx:id="sentence4" alignment="CENTER" prefHeight="25.0" prefWidth="372.0" text="L"> <font> <Font size="20.0" /> </font> </Label> </children> </VBox> </children> </HBox> </children> </VBox> </children> </Pane>
試したこと
問題の大元がBattleScreenクラスのLabel型のhpやnameの定義の部分にあるだろうということまでは考えました。そこでhpやnameに対応する部分のFXMLファイルを調べたのですがやはりよくわかりませんでした。
補足情報(FW/ツールのバージョンなど)
省略しましたがEnemyクラスはHeroクラスと変数、メソッド共にほぼ同じ内容です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/11 04:03
2020/12/11 04:22
2020/12/11 05:24