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

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

ただいまの
回答率

87.49%

AnimationTimer()による画面の分岐

解決済

回答 2

投稿 編集

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

score 9

  • 前提・実現したいこと
    AnimationTimer()でサイクルをループさせたい

1.1つ目のボタンの表示
2.ボタン1(画像)が5回押されたら3に移行
(ボタン1が押された時のみ画像が変化
3.ボタン2(画像)が5回押されたら1に戻る
(ボタン2が押された時のみ画像が変化

またゲームなどの画面切り替えの際にsceneを複数用意して条件によって切り替えるのか
scene1つだけ作りsceneの中身を条件によって変更していくのは
どちらが一般的な方法でしょうか?
贅沢な質問申し訳ありません

  • 対応するコード
package novelgame;

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.input.MouseEvent;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

public class test2 extends Application 
{
    int num = 1;
    int count = 1;
    double pw,pv= 0;
    Scene theScene1;
    Stage theStage1;
    GraphicsContext graphicsContext;
    Image image;
    Image image2;
    Image image3;
    Image image4;
    AudioClip plonkSound;
    static int width = 512;
    static int heigh = 256;

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

    @Override public void start(Stage theStage)
    {                    
        this.theStage1 = theStage;

                new AnimationTimer()
        {
    @Override
    public void handle(long now) 
            {
                 switch (num)
                {
                case 1:
                System.out.println(1);
                set();
                num = num + 1;
                case 2:
                System.out.println(2);
                botten1();
                break;
                case 3:
                System.out.println(3);
                botten2();
                break;                    
                }
            }
        };//;を追記

            theScene1.setOnMousePressed(
            new EventHandler<MouseEvent>()
            {
                public void handle(MouseEvent pe)
                {
                    pw=pe.getX();
                    pv=pe.getY();

                    System.out.println("Push  X=" + pw + "  Y=" + pv);
                }
            });

    }

    void set(){
        theStage1.setTitle("てすと");
        Image image = new Image(getClass().getResource("kimi.png").toExternalForm());
        Image image2 = new Image(getClass().getResource("kimi2.png").toExternalForm());
        Image image3 = new Image(getClass().getResource("manzi.png").toExternalForm());
        Image image4 = new Image(getClass().getResource("manzi2.png").toExternalForm());
        //画像サイズは全て100*150

        AudioClip plonkSound = new AudioClip(getClass().getResource("kimi.mp3").toExternalForm());

        Group root = new Group();
        Canvas canvas = new Canvas(width, heigh);
        GraphicsContext graphicsContext = canvas.getGraphicsContext2D();
        graphicsContext.drawImage(image, 100 , 100);
        root.getChildren().add(canvas);
        Scene theScene = new Scene(root);
        this.theScene1 = theScene;
        this.image = image;
        this.image2 = image2;
        this.image3 = image3;
        this.image4 = image4;
        this.graphicsContext = graphicsContext;
        this.plonkSound = plonkSound;
        theStage1.setWidth(280);
        theStage1.setHeight(280);
        theStage1.setScene(theScene1);
        theStage1.show();
    }

    void botten1(){
        while(true){
        graphicsContext.clearRect(0, 0, width, heigh);
        if(pw>100 && pw<250 && pv>100 && pv<200){
                       System.out.println("ボタン1が押されたよ");
                       graphicsContext.drawImage(image2, 100 , 100);
                       plonkSound.play();
                       count = count + 1;
                    }else{
                       graphicsContext.drawImage(image, 100 , 100);
                    }
        if(count == 5){
            num = 3;
            count = 1;
            break;
        }

        }
    }

        void botten2(){
        while(true){
        graphicsContext.clearRect(0, 0, width, heigh);
        if(pw>0 && pw<150 && pv>0 && pv<100){
                       System.out.println("ボタン2が押されたよ");
                       graphicsContext.drawImage(image4, 0 , 0);
                       System.out.println("音楽スタート");
                       count = count + 1;
                    }else{
                       graphicsContext.drawImage(image3, 0 , 0);
                    }

        if(count == 5){
            count = 1;
            num = 1;
            break;
        }
        }
    }  
}
  • 追記エラーメッセージ
    run:
    Exception in Application start method
    java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
    Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
    Caused by: java.lang.NullPointerException
    at novelgame.test2.start(test2.java:64)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    Exception running application novelgame.test2
    /Users/username/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1
    ビルド失敗(合計時間: 2秒)

  • 補足情報(言語/FW/ツール等のバージョンなど)
    macのNetBeans 8.2環境

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

コンパイルは通るのですが

コンパイルエラーが残っているプログラムを動かすことは普通しないだろうと誰もが思うはずなので一々かかなくても大丈夫なのですが・・・

実際はコードにコンパイルエラーがあります。セミコロンが1か所抜けています。

new AnimationTimer() {
  @Override
  public void handle(long now) {
    switch (num) {
      case 1:
        System.out.println(1);
        set();
        num = num + 1; // <==多分ここにbreakが抜けている気がします
      case 2:
        ...
    }
  }
}     // <====ここにセミコロンが抜けている

セミコロンを補ったコードで実行したのかも知れませんが、「質問文には最新のコード」を張り付けるように気を付けてください。さもないと発生している現象とコードが不一致になってしまうので読者を混乱させてしまいます。

実行するとエラーが起きてしまう

「エラーが起きてしまう」とだけしか書いていない質問は基本的にNGだと思います。最低でも何が起こっているか読者に伝わるように、エラーメッセージ(どの例外かが分かるもの)とスタックトレースを張り付けてください。

質問するときのヒントをよくご覧ください。


なお、コンパイルエラーを取り去った上で動かしたとすると、theScene1.setOnMousePressed(...)のところでNullPointerExceptionが発生すると思います。変数theScene1にSceneインスタンスが設定されていないからです。

その他にもおかしな点(バグ)が多数あるようですが、数が多いので今回指摘するのは控えます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/23 02:42

    具体性がなく困難を招いてしまって申し訳ありません
    質問者として当然のマナーが欠けていました
    それでも回答して頂きありがとうございます
    しばらく考えてから出直そうと思います

    キャンセル

check解決した方法

0

package novelgame;

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.input.MouseEvent;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

public class test5 extends Application 
{
    int num = 1;
    int count = 0;
    double px,py= 0;

    Stage theStage1;
    Image image;
    Image image2;
    Image image3;
    Image image4;
    AudioClip plonkSound;

    static int width = 512;
    static int heigh = 256;

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

    @Override public void start(Stage theStage)
    {   
        Group root1 = new Group();
        Group root2 = new Group();
        Group root3 = new Group();
        Group root4 = new Group();

        Scene theScene1 = new Scene(root1);
        Scene theScene2 = new Scene(root2);
        Scene theScene3 = new Scene(root3);
        Scene theScene4 = new Scene(root4);

        this.theStage1 = theStage;    
        theStage1.setWidth(280);
        theStage1.setHeight(280);
        theStage1.show();

        new AnimationTimer()
        {
    @Override
    public void handle(long now) 
            {
                switch (num)
                {
                case 1:
                set(root1,root2,root3,root4);
                break;

                case 2:
                botten1(theScene1,theScene2);
                break;

                case 3:
                botten2(theScene3,theScene4);
                break;
                }

                }
            }.start();

            theScene1.setOnMousePressed(
            new EventHandler<MouseEvent>()
            {
                public void handle(MouseEvent pe)
                {
                    px=pe.getX();
                    py=pe.getY();

                    System.out.println("Push  X=" + px + "  Y=" + py);
                }
            });

            theScene3.setOnMousePressed(
            new EventHandler<MouseEvent>()
            {
                public void handle(MouseEvent pe)
                {
                    px=pe.getX();
                    py=pe.getY();

                    System.out.println("Push  X=" + px + "  Y=" + py);
                }
            });
    }

        void set(Group root1,Group root2,Group root3,Group root4){
            num = num + 1;
            theStage1.setTitle("Sceneテスト");
            Image image = new Image(getClass().getResource("kimi.png").toExternalForm());
            Image image2 = new Image(getClass().getResource("kimi2.png").toExternalForm());
            Image image3 = new Image(getClass().getResource("manzi.png").toExternalForm());
            Image image4 = new Image(getClass().getResource("manzi2.png").toExternalForm());
            this.image = image;
            this.image2 = image2;
            this.image3 = image3;
            this.image4 = image4;
            //画像サイズは全て100*150

            AudioClip plonkSound = new AudioClip(getClass().getResource("kimi.mp3").toExternalForm());
            this.plonkSound = plonkSound;

            Canvas canvas1 = new Canvas(width, heigh);
            GraphicsContext graphicsContext1 = canvas1.getGraphicsContext2D();
            graphicsContext1.drawImage(image, 100 , 100);
            root1.getChildren().add(canvas1);

            Canvas canvas2 = new Canvas(width, heigh);
            GraphicsContext graphicsContext2 = canvas2.getGraphicsContext2D();
            graphicsContext2.drawImage(image2, 100 , 100);
            root2.getChildren().add(canvas2);

            Canvas canvas3 = new Canvas(width, heigh);
            GraphicsContext graphicsContext3 = canvas3.getGraphicsContext2D();
            graphicsContext3.drawImage(image3, 0 , 0);
            root3.getChildren().add(canvas3);

            Canvas canvas4 = new Canvas(width, heigh);
            GraphicsContext graphicsContext4 = canvas4.getGraphicsContext2D();
            graphicsContext4.drawImage(image4, 0 , 0);
            root4.getChildren().add(canvas4);
        }

        void botten1(Scene theScene1,Scene theScene2){
//            pw = 110;
//            pv = 110;
        if(px>100 && px<250 && py>100 && py<200){
            px = 0;
            py = 0;
            System.out.println("ボタン1が押されたよ");
            theStage1.setScene(theScene2);
            count = count + 1;
        }else{
            theStage1.setScene(theScene1);
        }

        if(count == 3){
            count = 0;
            num = 3;
            System.out.println("ボタン2へ移動");
        }
        }

        void botten2(Scene theScene3,Scene theScene4){
//            pw = 10;
//            pv = 10;
        if(px>0 && px<150 && py>0 && py<100){
            px = 0;
            py = 0;
            System.out.println("ボタン2が押されたよ");
            System.out.println("音楽スタート");
            plonkSound.play();
            theStage1.setScene(theScene4);
            count = count + 1;
        }else{
            theStage1.setScene(theScene3);
        }

        if(count == 3){
            count = 0;
            num = 2;
            System.out.println("ボタン1へ移動");
        }
        }

}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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