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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

381閲覧

当たり判定後、ラベルの出力前に画面遷移してしまう。

entd270

総合スコア19

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2018/08/03 08:07

編集2018/08/03 08:08

前提・実現したいこと

javaでゲームを作っています。キャラクターをマウスで移動させ、障害物に当たったら、画面上に「GameOver」のラベルを出力させてタイトル画面に画面遷移させたいです。画面遷移にはPanelChange()というメソッドを作って、パネルを可視化したり、見えなくしたりを切り替えることで実現しています。キャラクター、障害物は画像であり、if文でキャラクター画像と障害物画像が重なったとき、GameOverのラベルをaddし、その後に、PanelChange()メソッドが動作するようなプログラムにしてあります。しかし、実際に実行すると、GameOverラベルが動作する前にPanelChangeが実行され、ラベルが出現する前にタイトル画面に戻ってしまいます。

該当のソースコード

if((charctorY<=brockY)){//画像が重なるとき getContentPane().add(label);//GameOverをaddする      PanelChange(); }

試したこと

if((charctorY<=brockY)){//画像が重なるとき         getContentPane().add(label);//GameOverをaddする  try { Thread.sleep(1000); } catch(InterruptedException error){ error.printStackTrace(); } PanelChange(); }

上記のようにadd後にsleepさせたりもしたのですが結局、時間経過までラベルは出力されず、時間経過後ラベルが出力されないまま、タイトル画面に戻ってしまいました。

また、画面遷移を行わない場合は当たり判定後ちゃんとラベルは出力されます。
ラベル出力して少しの時間(2秒ほど)を空けて、画面遷移を行うにはどうしたらよいのでしょうか。

ソースコードが非常に長く、分かりずらいと思ったため、関係のありそうな部分しか乗せていません。申し訳ありません。回答するうえでご質問がありましたら、なんでもお聞きください。どうぞよろしくお願いいたします。

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

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

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

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

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

m.ts10806

2018/08/03 12:21

自動ではなく「Game Overラベルをクリックしてタイトルに遷移」ではいかがでしょうか。
entd270

2018/08/03 15:04

いえ、GameOverという文字が、画面上に表示させた後、時間経過で、自動で画面遷移を行いたいです。
guest

回答1

0

ベストアンサー

勘違いしてそうな点をまずラベルを追加した段階で画面に表示されるわけではないです。
Swing側が描画するタイミングを決めます。
プログラマー側ができることは、Swingにレイアウトが変わった画面が更新されたなどを通知するのみです。

そしてJFramesetVisibleした後にSwingの画面コンポーネント(JLabelなど要するに全て)を追加した場合、
Swingのレイアウトマネージャにその旨(revalidate/repaint)を通知するはプログラマーの義務です。

ゲームオーバーの要件がよく分かりませんでしたが、画面にラベルを表示後に時間を空けて遷移したいのであれば、getContentPane().add(label);を使用せずに、
CardLayout Java初心者:カウントダウン後に画面遷移をしたいですを参考にCardLayoutjavax.swing.Timerをそちらを試してみてくださいな。

投稿2018/08/03 15:00

編集2018/08/03 15:07
umyu

総合スコア5846

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

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

entd270

2018/08/03 15:19

おかしい質問で申し訳ありませんでした。 おっしゃる通り、勘違いしていました。 しかし、ゲームオーバー画面というものは作らず、ゲーム画面に、 直接、当たり判定があった時にGameOverという文字を表示したいです。 説明が分かりづらくて申し訳ございません。 教えていただいたことを参考にもう一度考え直してみます。 ご回答ありがとうございました。
umyu

2018/08/03 15:25 編集

>entd270さんへ ゲーム画面に、直接、当たり判定があった時にGameOverという文字を表示したいです。 それでしたら、getContentPane().add(label);とした次の行にthis.revalidate();としてください。(勿論サイズ指定を忘れずに)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問