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

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

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

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

Q&A

解決済

2回答

1865閲覧

処理がうまく動かない

Alpa

総合スコア80

Java

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

0グッド

0クリップ

投稿2017/11/23 10:24

編集2017/11/25 09:52

###実現したいこと
上キーを押したときに-40Y座標を下げて
またJflagで落下させたい

これはアクションゲームを作っています

###該当のソースコード

import javax.swing.*;//swingのimport import java.awt.*;//awtのimport import java.awt.event.*;//awtのeventのimport public class action extends JFrame implements ActionListener{ static action Frame;//Frame JPanel Panel;//Panel JLabel Player;//プレイヤーの画像が入ったJLabel JLabel Block;//ブロックの画像が入ったJLabel ImageIcon PlayerIcon;//プレイヤーの画像読み込み ImageIcon BlockIcon;//ブロックの画像読み込み Timer timer; Timer Ktimer; int PlayerX = 20;//プレイヤーのX座標 int PlayerY = 40;//プレイヤーのY座標 static boolean Jflag = false;//ジャンプフラグ static boolean UKflag = false;//ジャンプキーフラグ static boolean LKflag = false;//左移動キーフラグ static boolean RKflag = false;//右移動キーフラグ static boolean Dflag = false;//デバックフラグ public static void main(String args[]){ Frame = new action(); Frame.setSize(900, 500);//ウィンドウのサイズ設定(X, Y) Frame.setTitle("アクションゲーム");//ウィンドウのタイトル Frame.setLocationRelativeTo(null);//ウィンドウを画面の中央に表示する Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//xで閉じるようにする Frame.setVisible(true);//ウィンドウを可視化 } action(){ timer = new Timer(10, this);//タイマー間隔設定 Ktimer = new Timer(10, this);//タイマー間隔設定 Panel = new JPanel(); Panel.setLayout(null);//レイアウトマネージャー無効化 PlayerIcon = new ImageIcon("./PlayerIcon.png");//プレイヤーの画像指定 BlockIcon = new ImageIcon("./BlockIcon.png");//ブロックの画像指定 Player = new JLabel(PlayerIcon);//プレイヤー画像設定 Player.setBounds(PlayerX, PlayerY, 20, 40);//プレイヤーの座標とサイズ設定 Block = new JLabel(BlockIcon);//ブロック画像設定 Block.setBounds(0, 442, 20, 20);//ブロックの座標とサイズ設定 Panel.add(Player);//プレイヤー画像追加 Panel.add(Block);//ブロック画像追加 Container contentPane = getContentPane();//??? contentPane.add(Panel, BorderLayout.CENTER);//??? timer.start();//タイマースタート } public void actionPerformed(ActionEvent e){//タイマーの処理 if(PlayerY <= 399){ Jflag = true;//ジャンプフラグをtrueにする }else{ Jflag = false;//ジャンプフラグをfalseにする } if(Jflag == true){//もしジャンプフラグがtrueなら PlayerY += 10;//プレイヤーのY座標を+10 Player.setBounds(PlayerX, PlayerY, 20, 40);//プレイヤーの座標再設定 Panel.repaint();//パネルを更新 if(PlayerY >= 399){ Jflag = false; timer.stop(); } } if(UKflag == true){ PlayerY -= 10;//プレイヤーのY座標を-10 Player.setBounds(PlayerX, PlayerY, 20, 40);//プレイヤーの座標再設定 Panel.repaint();//パネルを更新 if(PlayerY <= 359){ UKflag = false; Jflag = false; timer.stop(); } } } protected void processKeyEvent(KeyEvent e){//キー入力の処理 if(e.getID() == KeyEvent.KEY_PRESSED){ if(e.getKeyCode() == KeyEvent.VK_UP && Jflag == false){ UKflag = true; Jflag = true; timer.start(); System.out.println("UP"); } if(e.getKeyCode() == KeyEvent.VK_LEFT && Jflag == false){ LKflag = true; timer.start(); System.out.println("LEFT"); } if(e.getKeyCode() == KeyEvent.VK_RIGHT && Jflag == false){ RKflag = true; timer.start(); System.out.println("RIGHT"); } if(e.getKeyCode() == KeyEvent.VK_D && Dflag == true){ System.out.println("\nJflag:" + Jflag); System.out.println("UKflag:" + UKflag); System.out.println("LKflag:" + LKflag); System.out.println("RKflag:" + RKflag); System.out.println("Dflag:" + Dflag); System.out.println("PlayerX座標:" + PlayerX); System.out.println("PlayerY座標:" + PlayerY + "\n"); } if(e.getKeyCode() == KeyEvent.VK_S){ if(Dflag == false){ Dflag = true; System.out.println("デバック機能を有効にしました"); } } if(e.getKeyCode() == KeyEvent.VK_E){ Frame.dispose(); System.out.println("正常に終了しました"); } } } }

###試したこと
Jflagを↑を押したときにtrueにしたり
timerを止めてもう一度キーを押したときにスタートさせた

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

processKeyEvent の
if(e.getKeyCode() == KeyEvent.VK_UP && Jflag == false){

UKflag = true; Jflag = true; timer.start(); System.out.println("UP"); }

の部分でUkfkag もtrueになっていますが、

actionPerformed の中で
if(UKflag == true){  <---Ukflag = true なので抜ける

PlayerY -= 10;//プレイヤーのY座標を-10 Player.setBounds(PlayerX, PlayerY, 20, 40);//プレイヤーの座標再設定 Panel.repaint();//パネルを更新 if(PlayerY <= 359){ <----初期値によっては抜ける UKflag = false; Jflag = false; <---- Jflag =false になる timer.stop(); }

があるので、Jflagが一瞬だけtrue になり、そのあとまたすぐにfalseになるような気がしていますが、いかがでしょうか?

ちなみに、actionPerformed はどのタイミングで実行されるのでしょうか?

追伸
私もjavaでゲームを作成していますが、Threadを使っていないプログラムは初めて見るので、勉強になりました。

投稿2017/11/25 10:52

編集2017/11/25 10:54
jgamer

総合スコア30

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

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

Alpa

2017/11/25 11:25

Threadを使うとどのような得があるのでしょうか?
ngsvx

2017/11/25 11:49

jgamerさん >actionPerformed はどのタイミングで実行されるのでしょうか? Timerから定期的に呼び出されます。 miyabi6184さん >Threadを使うとどのような得があるのでしょうか? 今回はTimerを使って処理していますし、このコードでは大きな違いはないかと思います。 Timerもある意味スレッドの一種ですから。 しいて言うなら、コードの書き方が変わってくるということでしょうか。 Timerの場合はコールバックされる受動的なコードになり、 スレッドを使えば能動的なコードになります。 いずれにしても、タイマーなりスレッドなりを使わないと、GUIが固まります。 Swingはイベントの処理中に、別のイベントを処理できない(保留される)ためです。
guest

0

ベストアンサー

processKeyEvent自体が実行されているか確認はしましたか?

フォーカスの関係でprocessKeyEvent自体が実行されていないような気がしますけど。

投稿2017/11/24 13:05

ngsvx

総合スコア287

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

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

Alpa

2017/11/25 09:49

実行するためにはどのようにしたらいいですか?
ngsvx

2017/11/25 09:51

ですから、 「processKeyEvent自体が実行されているか確認」 が先ですって。
Alpa

2017/11/25 09:53

すいません 今から確認してきます
ngsvx

2017/11/25 09:54

あと、念の為に、processKeyEventには@overrideアノテーションを付けておいて下さい
Alpa

2017/11/25 09:56 編集

しっかりと実行されていました @overrideも付けました
ngsvx

2017/11/25 10:10

ちなみに、どうやって「実行されている」と確認しましたか? 念のためです。
Alpa

2017/11/25 10:12

コンソール出力でprocessKeyEventの中に書きました
ngsvx

2017/11/25 10:25

了解しました。 でしたら、おそらくロジックの問題でしょうから、 同じように、 if(e.getID() == KeyEvent.KEY_PRESSED){ の中や、 if(e.getKeyCode() == KeyEvent.VK_UP && Jflag == false){ の中などが意図した通り実行されているか確認して下さい。 意図した通りの実行でない場合、そのif文に関係する変数の内容を調べ、 それが何故意図した通りの内容になっていないか、コードを見直すことになります。 ※プログラムを作るというのは、デバッグ作業まで含めたものです。 ですのでデバッグは、基本的には自分で行うものです。 頑張って下さい。 あっ、聞いていただければアドバイスはしますので、そこはご安心を。
Alpa

2017/11/25 10:27

ありがとうございます 今から頑張っていろいろしてみます
Alpa

2017/11/25 11:27

うまく動きました 空中のJflagの使い方が間違えていました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問