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

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

ただいまの
回答率

90.47%

  • Java

    14142questions

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

  • JavaFX

    406questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,390

ywotnf

score 10

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.effect.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<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">
   <children>
      <Rectangle arcHeight="5.0" arcWidth="5.0" fill="#838383" height="400.0" layoutX="425.0" stroke="#838383" strokeType="INSIDE" width="175.0" />
      <Rectangle arcHeight="5.0" arcWidth="5.0" height="400.0" stroke="BLACK" strokeType="INSIDE" width="425.0" />
      <Label layoutX="486.0" layoutY="14.0" prefHeight="43.0" prefWidth="78.0" text="Score" textFill="#1b92e8">
         <font>
            <Font name="Lao UI Bold" size="29.0" />
         </font>
         <effect>
            <Bloom />
         </effect>
      </Label>
   </children>
</AnchorPane>
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;

public class Game implements Runnable{

//キー入力
    int[] KEY = new int[3];
    public void KeyPress(KeyEvent e){
        keys(e,1);
    }
    public void KeyRelease(KeyEvent e){
        keys(e,0);
    }

    private void keys(KeyEvent e,int value){
String key = e.getCode().getName();

        if(key.equals("Right")){
            KEY[0] = value;
        }else if(key.equals("Left")){
            KEY[1] = value;
        }else if(key.equals("Space")){
            KEY[2] = value;
        }
    }


    AnchorPane root;
    Player player;

    public void GStart(AnchorPane pane){

        root = pane;
        player = new Player();
        root.getChildren().add(player);

        Thread th = new Thread(this);
        th.setDaemon(true);
        th.start();

    }


    @Override
    public void run() {

        do{
        action();
        try {Thread.sleep(1000/10);} catch (InterruptedException e){}

        }while(true);

    }

    private void action(){
        System.out.println(KEY[0]);

        if(KEY[0] == 1){
            double x =player.getX();
            x += 1;
            player.setX(x);
        }else if(KEY[1] == 1){
            double x =player.getX();
            x -= 1;
            player.setX(x);
        }

    }

}
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Main extends Application{

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

    @Override
    public void start(Stage stage) throws Exception {

        AnchorPane pane = FXMLLoader.load(getClass().getResource("/Frame.fxml"));
            Scene s = new Scene(pane);
            pane.requestFocus();

                Game g = new Game
                g.GStart(pane);

                stage.setScene(s);
                stage.show();


    }

}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

public void GStart(AnchorPane pane){
  root = pane;
  player = new Player();
  root.getChildren().add(player);

 root.setOnKeyPressed(new EventHandler<KeyEvent>() {
  @Override
    public void handle(KeyEvent t) {
      KeyPress(t);
   }
  });

  root.setOnKeyReleased(new EventHandler<KeyEvent>() {

    @Override
    public void handle(KeyEvent t) {
      KeyRelease(t);
    }
  });

}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/29 23:26

    変更してみましたが思いどうりには動きませんでした。
    情報が少なかったかもしれません。
    FXMLのコードを追記しました。
    あとPlayerクラスはRectangleクラスを継承してサイズと色を変更しているだけです。

    http://hirosk.hatenablog.com/entry/2013/12/25/015156
    http://www.harukitchen.com/rpg_programming/
    このサイトを参考にして作りました。

    スレッド?複数のスレッドが同時に変数を変更すると
    不具合が起きるということでしょうか?
    その場合どのようにすればいいか教えてください。

    キャンセル

  • 2016/04/29 23:35 編集

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

    キャンセル

  • 2016/04/30 10:22 編集

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

    キャンセル

  • 2016/04/30 11:41

    まずは解決したのであればよかったです。

    正直なところ、昔同じような目にあったときにこうしたら直ったというものを紹介しました。。

    >KeyPress等はどこで呼ばれていますか?
    FXML内にありましたね…。見逃していました。

    >原因は何だったのでしょうか?
    推測ですが、
    FXML内でkeyEventを検知した際に呼び出されるGame.KeyPressは、
    Main.startでnewされているgameインスタンスとは別物ではないでしょうか?

    そのため、game.KEYは変更されておらず、action()では値が変わっていなかったのではないかと思います。

    推測で申し訳ありませんが。

    キャンセル

  • 2016/04/30 12:18

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    14142questions

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

  • JavaFX

    406questions

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