質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3860閲覧

JavaFXでキーボード入力がうまくいきません

ywotnf

総合スコア16

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/04/29 02:36

編集2016/04/29 14:06

xml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.effect.*?> 4<?import javafx.scene.control.*?> 5<?import javafx.scene.text.*?> 6<?import javafx.scene.shape.*?> 7<?import java.lang.*?> 8<?import javafx.scene.layout.*?> 9 10<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onKeyPressed="#KeyPress" onKeyReleased="#KeyRelease" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Game"> 11 <children> 12 <Rectangle arcHeight="5.0" arcWidth="5.0" fill="#838383" height="400.0" layoutX="425.0" stroke="#838383" strokeType="INSIDE" width="175.0" /> 13 <Rectangle arcHeight="5.0" arcWidth="5.0" height="400.0" stroke="BLACK" strokeType="INSIDE" width="425.0" /> 14 <Label layoutX="486.0" layoutY="14.0" prefHeight="43.0" prefWidth="78.0" text="Score" textFill="#1b92e8"> 15 <font> 16 <Font name="Lao UI Bold" size="29.0" /> 17 </font> 18 <effect> 19 <Bloom /> 20 </effect> 21 </Label> 22 </children> 23</AnchorPane>

java

1import javafx.scene.input.KeyEvent; 2import javafx.scene.layout.AnchorPane; 3 4public class Game implements Runnable{ 5 6//キー入力 7 int[] KEY = new int[3]; 8 public void KeyPress(KeyEvent e){ 9 keys(e,1); 10 } 11 public void KeyRelease(KeyEvent e){ 12 keys(e,0); 13 } 14 15 private void keys(KeyEvent e,int value){ 16String key = e.getCode().getName(); 17 18 if(key.equals("Right")){ 19 KEY[0] = value; 20 }else if(key.equals("Left")){ 21 KEY[1] = value; 22 }else if(key.equals("Space")){ 23 KEY[2] = value; 24 } 25 } 26 27 28 AnchorPane root; 29 Player player; 30 31 public void GStart(AnchorPane pane){ 32 33 root = pane; 34 player = new Player(); 35 root.getChildren().add(player); 36 37 Thread th = new Thread(this); 38 th.setDaemon(true); 39 th.start(); 40 41 } 42 43 44 @Override 45 public void run() { 46 47 do{ 48 action(); 49 try {Thread.sleep(1000/10);} catch (InterruptedException e){} 50 51 }while(true); 52 53 } 54 55 private void action(){ 56 System.out.println(KEY[0]); 57 58 if(KEY[0] == 1){ 59 double x =player.getX(); 60 x += 1; 61 player.setX(x); 62 }else if(KEY[1] == 1){ 63 double x =player.getX(); 64 x -= 1; 65 player.setX(x); 66 } 67 68 } 69 70} 71

java

1 2import javafx.application.Application; 3import javafx.fxml.FXMLLoader; 4import javafx.scene.Scene; 5import javafx.scene.layout.AnchorPane; 6import javafx.stage.Stage; 7 8public class Main extends Application{ 9 10 public static void main(String[] args) { 11 launch(args); 12 } 13 14 @Override 15 public void start(Stage stage) throws Exception { 16 17 AnchorPane pane = FXMLLoader.load(getClass().getResource("/Frame.fxml")); 18 Scene s = new Scene(pane); 19 pane.requestFocus(); 20 21 Game g = new Game 22 g.GStart(pane); 23 24 stage.setScene(s); 25 stage.show(); 26 27 28 } 29 30}

JavaFXを使ってゲームを作っているのですが、キーボード入力がうまくいきません。
KeyPress()メソッドで変数が変更されているのにrun()メソッドでは変更されていません。

できるだけ詳しく教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Playerクラスというのは自作クラスでしょうか? そちらが悪さをしている可能性も捨てきれませんが、
以下の通りで動くようにならないでしょうか?

Java

1public void GStart(AnchorPane pane){ 2 root = pane; 3 player = new Player(); 4 root.getChildren().add(player); 5 6 root.setOnKeyPressed(new EventHandler<KeyEvent>() { 7 @Override 8 public void handle(KeyEvent t) { 9 KeyPress(t); 10 } 11 }); 12 13 root.setOnKeyReleased(new EventHandler<KeyEvent>() { 14 15 @Override 16 public void handle(KeyEvent t) { 17 KeyRelease(t); 18 } 19 }); 20 21}

もし駄目ならスレッドあたりが悪さをしている可能性もあります。

投稿2016/04/29 11:52

編集2016/04/29 14:40
kentei_syunrai

総合スコア946

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ywotnf

2016/04/29 14:26

変更してみましたが思いどうりには動きませんでした。 情報が少なかったかもしれません。 FXMLのコードを追記しました。 あとPlayerクラスはRectangleクラスを継承してサイズと色を変更しているだけです。 http://hirosk.hatenablog.com/entry/2013/12/25/015156 http://www.harukitchen.com/rpg_programming/ このサイトを参考にして作りました。 スレッド?複数のスレッドが同時に変数を変更すると 不具合が起きるということでしょうか? その場合どのようにすればいいか教えてください。
kentei_syunrai

2016/04/29 14:41 編集

KeyPress等はどこで呼ばれていますか? あと、root.setOnKeyPressedとroot.setOnKeyReleasedに変えても駄目ですか? #回答は修正しました。
ywotnf

2016/04/30 01:33 編集

コピーしてスレッドを開始したら動きました! ありがとうございます! 原因は何だったのでしょうか? 解決しましたが原因が分からないので最後に どこがダメだった、こうしたらいいなど教えてください!
kentei_syunrai

2016/04/30 02:41

まずは解決したのであればよかったです。 正直なところ、昔同じような目にあったときにこうしたら直ったというものを紹介しました。。 >KeyPress等はどこで呼ばれていますか? FXML内にありましたね…。見逃していました。 >原因は何だったのでしょうか? 推測ですが、 FXML内でkeyEventを検知した際に呼び出されるGame.KeyPressは、 Main.startでnewされているgameインスタンスとは別物ではないでしょうか? そのため、game.KEYは変更されておらず、action()では値が変わっていなかったのではないかと思います。 推測で申し訳ありませんが。
ywotnf

2016/04/30 03:18

本当にありがとうございました! 原因も大体わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問