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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

493閲覧

選択切り替えを行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/01/17 17:06

編集2020/01/18 07:17

前提・実現したいこと

Javaを用いたシューティングゲームを作成しています。
今回質問したいのは、goMenuメソッド内にある
プレイキャラクターを選択する場面のプログラムについてです。以下内容。

キーボードの ← キーを押した場合はキャラ1が選択される
(chara_1.pngを描画し、プレイヤー画像をplayer_1.pngに設定する)
← キーを押した場合はキャラ2が選択される
(chara_2.pngを描画し、プレイヤー画像をplayer_2.pngに設定する)
どちらかキャラを選択した後にEnterキーを押すことでgoMainメソッドに移行する
Escキーをおすことで、選択前の画面に戻す
(chara_bg.jpgを描写する)

不出来で見づらいプログラムかもしれません。

発生している問題

実現したいことは
← キーを押した後に → キーを押すと選択キャラを切り替える
(chara_1.pngを描画し、プレイヤー画像をplayer_1.pngに設定したのを
chara_2.pngを描画し、プレイヤー画像をplayer_2.pngに設定するプログラムのとこまでジャンプする)
逆の捜査の場合は逆になるようにしたいのですが、
← キーの後に → キーを押した後は考えている通りになりますが、
→ キーの後に ← キーを押しても描写される画像が差し変わることがありません。

Settingクラス

Java

1public abstract class Setting { 2 public static final int TITLE = 10; 3 public static final int MENU = 11; 4 public static final int MAIN = 12; 5 public static final int CLEAR = 13; 6 public static final int OVER = 14; 7 /* public static final int ALLCLEAR = 1; */ 8 9 private int g_state; // ゲームステータスの作成 10 JFrame frame0; // 新しいウインドウの作成 11 private int count = 0; // リアルタイムカウントの設定 12 BufferStrategy bs; // ビデオメモリの設定 13 Sequencer midiseq = null; // サウンドの設定 14 15 16 public Setting(int w, int h, String title){ 17 frame0 = new JFrame(title); // 作成したウインドウを個別化 18 frame0.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // // 右上の×ボタンを押した場合の動作設定) 19 frame0.setBackground(Color.GRAY); // ウインドウの背景設定 20 frame0.setResizable(false); // サイズ変更が可能かどうか 21 22 frame0.setVisible(true); // ウインドウを表示する 23 Insets insets = frame0.getInsets(); // ウインドウの枠の幅データを取得 24 frame0.setSize(w + insets.left + insets.right, h + insets.top + insets.bottom); // ウインドウのサイズ設定 25 frame0.setLocationRelativeTo(null); // ウインドウ画面を中央表示 26 27 frame0.createBufferStrategy(2); // ダブルバッファリングを設定 28 bs = frame0.getBufferStrategy(); // バッファのインスタンスを取得 29 frame0.setIgnoreRepaint(true); // 用意されている標準の画面書き換えを無効にする 30 31 frame0.addKeyListener(new MyKeyAdapter()); 32 } 33 34 // 文字を中央揃えで表示 35 public void drawStringCenter(String str, int y, Graphics g) { 36 int fw = frame0.getWidth() / 2; 37 FontMetrics fm = g.getFontMetrics(); 38 int str_w = fm.stringWidth(str) / 2; 39 g.drawString(str, fw - str_w, y); 40 } 41 42 // 音声データの読み込み 43 Clip SoundYomikomi(String fname){ 44 Clip clip = null; 45 try { 46 AudioInputStream aistream = AudioSystem.getAudioInputStream(getClass().getResource(fname)); 47 DataLine.Info info = new DataLine.Info(Clip.class, aistream.getFormat()); 48 clip = (Clip)AudioSystem.getLine(info); 49 clip.open(aistream); 50 }catch (UnsupportedAudioFileException e){ 51 e.printStackTrace(); 52 }catch (IOException e){ 53 e.printStackTrace(); 54 }catch (LineUnavailableException e){ 55 e.printStackTrace(); 56 } 57 return clip; 58 } 59 void midiYomikomi(String fname){ 60 if(midiseq == null){ 61 try { 62 midiseq = MidiSystem.getSequencer(); 63 midiseq.open(); 64 }catch(MidiUnavailableException e){ 65 e.printStackTrace(); 66 } 67 } 68 try { 69 Sequence seq = MidiSystem.getSequence(getClass().getResource(fname)); 70 midiseq.setSequence(seq); 71 } catch (InvalidMidiDataException e) { 72 e.printStackTrace(); 73 } catch (IOException e) { 74 e.printStackTrace(); 75 } 76 } 77 78 void goTitle(){ 79 g_state = TITLE; 80 Timer time = new Timer(); 81 time.schedule(new MyTimerTask(), 10, 20); 82 } 83 void goMenu(){ 84 count = 200; 85 g_state = MENU; 86 } 87 void goMain(){ 88 initMain(); 89 g_state = MAIN; 90 } 91 void goClear(){ 92 initClear(); 93 count = 100; 94 g_state = CLEAR; 95 } 96 void goOver(){ 97 initOver(); 98 g_state = OVER; 99 } 100 101 abstract void initMain(); 102 abstract void initClear(); 103 abstract void initOver(); 104 105 // キーイベント初期設定 106 abstract void keyPressedMain(int c_code); 107 abstract void keyReleasedMain(int c_code); 108 109 // runメソッド構築 110 abstract void runTITLE(Graphics g); 111 abstract void runMENU(Graphics g); 112 abstract void runPROLOGUE(Graphics g); 113 abstract void runMAIN(Graphics g); 114 abstract void runEPILOGUE(Graphics g); 115 abstract void runCLEAR(Graphics g); 116 abstract void runOVER(Graphics g); 117 118 class MyKeyAdapter extends KeyAdapter{ 119 public void keyPressed(KeyEvent key) { 120 if(g_state == MENU){ 121 keyPressedMain(key.getKeyCode()); 122 } 123 } 124 public void keyReleased(KeyEvent key) { 125 int c_code = key.getKeyCode(); 126 switch(g_state){ 127 case TITLE: // タイトルからメニュー画面へ移行 128 if(c_code == KeyEvent.VK_SPACE){ 129 goMenu(); 130 } 131 break; 132 case OVER: // ゲームオーバー画面からリトライ 133 if(c_code == KeyEvent.VK_R){ 134 goMain(); 135 } 136 } 137 } 138 } 139 140 class MyTimerTask extends TimerTask{ 141 public void run() { 142 Graphics g = bs.getDrawGraphics(); 143 if(bs.contentsLost() == false){ 144 Insets insets = frame0.getInsets(); 145 g.translate(insets.left, insets.top); 146 147 switch(g_state){ 148 case TITLE: 149 runTITLE(g); 150 break; 151 case MENU: 152 runMENU(g); 153 break; 154 case MAIN: 155 runPROLOGUE(g); 156 runMAIN(g); 157 break; 158 case CLEAR: 159 runEPILOGUE(g); 160 runCLEAR(g); 161 count = count - 1; 162 if(count < 0){ 163 goMain(); 164 } 165 break; 166 case OVER: 167 runOVER(g); 168 break; 169 } 170 bs.show(); 171 g.dispose(); 172 } 173 } 174 } 175} 176

Main01クラス

Java

1public class Main01 extends Setting { 2 public static final int D_w = 800; //画面の幅 3 public static final int D_h = 800; //画面の高さ 4 public static final int E_rate = 50; 5 public static final int Time = 33000; //1ステージ 約30秒 6 7 BufferedImage b_img, p_img, e_img; 8 Player player; 9 boolean upkey, downkey, leftkey, rightkey, 10 enterkey, cancelkey, 11 slowkey, atkkey, sklkey, 12 entry, all; 13 double starttime; 14 int score, highscore, stagenum = 1; 15 Clip seClip1,seClip2,seClip3; 16 17 public Main01() { 18 super(D_w, D_h, "怪異 討伐"); 19 20 try { 21 b_img = ImageIO.read(getClass().getResource("title.jpg")); 22 e_img = ImageIO.read(getClass().getResource("shooting.png")); 23 }catch (IOException e){ 24 e.printStackTrace(); 25 } 26 seClip1 = SoundYomikomi("burst01.wav"); 27 seClip2 = SoundYomikomi("fm005.wav"); 28 seClip3 = SoundYomikomi("smoke03.wav"); 29 midiYomikomi("sw3.MID"); 30 31 goTitle(); 32 } 33 34 @Override 35 void keyPressedMain(int c_code) { 36 if (c_code == KeyEvent.VK_UP) { 37 upkey = true; 38 } 39 if (c_code == KeyEvent.VK_DOWN) { 40 downkey = true; 41 } 42 if (c_code == KeyEvent.VK_LEFT) { 43 leftkey = true; 44 } 45 if (c_code == KeyEvent.VK_RIGHT){ 46 rightkey = true; 47 } 48 if (c_code == KeyEvent.VK_ENTER){ 49 enterkey = true; 50 } 51 if (c_code == KeyEvent.VK_ESCAPE){ 52 cancelkey = true; 53 } 54 if (c_code == KeyEvent.VK_SHIFT){ 55 slowkey = true; 56 } 57 if (c_code == KeyEvent.VK_Z){ 58 atkkey = true; 59 } 60 if (c_code == KeyEvent.VK_X){ 61 sklkey = true; 62 } 63 } 64 65 @Override 66 void keyReleasedMain(int c_code) { 67 if (c_code == KeyEvent.VK_UP) { 68 upkey = false; 69 } 70 if (c_code == KeyEvent.VK_DOWN) { 71 downkey = false; 72 } 73 if (c_code == KeyEvent.VK_LEFT) { 74 leftkey = false; 75 } 76 if (c_code == KeyEvent.VK_RIGHT){ 77 rightkey = false; 78 } 79 if (c_code == KeyEvent.VK_SHIFT){ 80 slowkey = false; 81 } 82 if (c_code == KeyEvent.VK_ENTER){ 83 enterkey = false; 84 } 85 if (c_code == KeyEvent.VK_ESCAPE){ 86 cancelkey = false; 87 } 88 if (c_code == KeyEvent.VK_Z){ 89 atkkey = false; 90 } 91 if (c_code == KeyEvent.VK_X){ 92 sklkey = false; 93 } 94 } 95 96 @Override 97 void initMain() { 98 player = new Player((D_w/2 - 136), (D_h/2 + 300), p_img); 99 upkey = false; downkey = false; leftkey = false; rightkey = false; 100 enterkey = false; slowkey = false; atkkey = false; sklkey = false; 101 102 try { 103 b_img = ImageIO.read(getClass().getResource("back.jpg")); 104 } catch (IOException e) { 105 e.printStackTrace(); 106 } 107 } 108 109 @Override 110 void initClear() { 111 stagenum = stagenum + 1; 112 midiseq.stop(); 113 } 114 115 @Override 116 void initOver() { 117 if(score > highscore){ 118 highscore = score; 119 score = 0; 120 midiseq.stop(); 121 seClip3.setFramePosition(0); 122 seClip3.start(); 123 } 124 } 125 126 @Override 127 void runTITLE(Graphics g) { 128 g.drawImage(b_img, 0, 0, frame0); 129 } 130 131 @Override // 該当コード 132 void runMENU(Graphics g) { 133 try { 134 b_img = ImageIO.read(getClass().getResource("chara_bg.jpg")); 135 } catch (IOException e) { 136 e.printStackTrace(); 137 } 138 g.drawImage(b_img, 0, 0, frame0); 139 140 MENU: 141 if(leftkey == true){ 142 try { 143 b_img = ImageIO.read(getClass().getResource("chara_1.png")); 144 p_img = ImageIO.read(getClass().getResource("player_sanae.png")); 145 } catch (IOException e) { 146 e.printStackTrace(); 147 } 148 rightkey = false; 149 g.drawImage(b_img, 0, 0, frame0); 150 if(cancelkey == true){ 151 leftkey = false; rightkey = false; enterkey = false; cancelkey = false; 152 break MENU; 153 }else if(enterkey == true){ 154 goMain(); 155 } 156 }else if(rightkey == true){ 157 try { 158 b_img = ImageIO.read(getClass().getResource("chara_2.png")); 159 p_img = ImageIO.read(getClass().getResource("player_marisa.png")); 160 } catch (IOException e) { 161 e.printStackTrace(); 162 } 163 leftkey = false; 164 g.drawImage(b_img, 0, 0, frame0); 165 if(cancelkey == true){ 166 rightkey = false; leftkey = false; enterkey = false; cancelkey = false; 167 break MENU; 168 }else if(enterkey == true){ 169 goMain(); 170 } 171 } 172 } 173 174 @Override 175 void runPROLOGUE(Graphics g) { 176 g.drawImage(b_img, 0, 0, frame0); 177 g.setColor(Color.CYAN); 178 g.setFont(new Font("SansSerif", Font.BOLD, 60)); 179 drawStringCenter("討伐 開始!", 200, g); 180 181 runMAIN(g); 182 } // 該当コード 終 183 184 @Override 185 void runMAIN(Graphics g) { 186 player.draw(g, frame0); 187 } 188 189 /** 190 * @param args 191 */ 192 public static void main(String[] args) { 193 Main01 main = new Main01(); 194 } 195 196} 197

試したこと

ラベルやbreak文やcontinue文も使ってみたのですがうまくできませんでした。
(ラベルは使い方が間違っている気はします)

補足情報

使用開発ツール
Eclipse IDE 2019-09(システムライブラリーはJavaSE-1.8)

参考文献
・新・明解Java入門 著者名:柴田 望洋(著者)
・15歳からはじめるJAVAわくわくゲームプログラミング教室 著者名:大槻 有一郎

Main01クラスにvoid runEPILOGUE(Graphics g) / void runCLEAR(Graphics g) / void runOVER(Graphics g) メソッドの実装と、Playerクラスが無いのは文字数内に収まりきらないためです。

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

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

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

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

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

jimbe

2020/01/18 04:03 編集

Main01 クラスに void runEPILOGUE(Graphics g)/void runCLEAR(Graphics g)/void runOVER(Graphics g) メソッドの実装と, Player クラスが無いとコンパイルできません.
jimbe

2020/01/18 05:36

実行できないので見た感じですが, runMenu メソッドは, タイマーによって 20ms 毎に呼び出され, そのタイミングでキー判定・描画更新するという構造でしょうか.
退会済みユーザー

退会済みユーザー

2020/01/18 06:04

void runEPILOGUE(Graphics g)/void runCLEAR(Graphics g)/void runOVER(Graphics g) メソッドの実装と, Player クラスのほうも作成してあり、メソッドの方はオーバライド、Playerクラスの方も別クラスとして作成はしてあるのですが、この質問本文の文字数内に収まりきらなくてのせてないです…。 確かにそのあたりもないと実際のプログラムとして実行出来ないですよね。 すみません…!どうのせるべきでしょうか…。 runメソッドの構造はおっしゃるとおりです!
jimbe

2020/01/18 07:08

> この質問本文の文字数内に収まりきらなくてのせてないです いえ, そういうことであればご質問に明記しておいて頂ければ大丈夫です. 実行には他に画像等も必要ですので, 仕方ありません.
退会済みユーザー

退会済みユーザー

2020/01/18 07:13

そうですね、ありがとうございます、其方の方追記しておきます、 追記修正依頼、ありがとうございました!
guest

回答2

0

ベストアンサー

全く動かしていませんのでどうなるかですが...
initMenu メソッドを追加し, Main01 にフィールドを追加しました.
出来れば Main01 の追加分は別クラスとしたほうが良いかと思います.

Setting.java 追加修正

java

1 void goMenu(){ 2 //count = 200; 必要なさそうなので削除 3 initMenu(); //追加 4 g_state = MENU; 5 }

java

1 abstract void initMenu(); //追加 2 abstract void initMain(); 3 abstract void initClear(); 4 abstract void initOver();

Main01.java 追加修正

java

1 //以下 runMENU まで追加 2 private int selectIndex; 3 private BufferedImage chara[] = new BufferedImage[3]; 4 private BufferedImage player[] = new BufferedImage[3]; 5 6 @Override 7 void initMenu() { 8 selectIndex = 0; 9 try { 10 chara [0] = ImageIO.read(getClass().getResource("chara_bg.jpg")); 11 player[0] = null; 12 13 chara [1] = ImageIO.read(getClass().getResource("chara_1.png")); 14 player[1] = ImageIO.read(getClass().getResource("player_sanae.png")); 15 16 chara [2] = ImageIO.read(getClass().getResource("chara_2.png")); 17 player[2] = ImageIO.read(getClass().getResource("player_marisa.png")); 18 } catch (IOException e) { 19 e.printStackTrace(); 20 } 21 } 22 23 //全面修正 24 @Override 25 void runMENU(Graphics g) { 26 if(enterkey == true && selectIndex >= 1){ 27 p_img = player[selectIndex]; 28 goMain(); 29 } else if(cancelkey == true){ 30 selectIndex = 0; 31 } else if(leftkey == true){ 32 selectIndex = 1; 33 } else if(rightkey == true){ 34 selectIndex = 2; 35 } 36 g.drawImage(chara[selectIndex], 0, 0, frame0); 37 }

投稿2020/01/18 07:15

jimbe

総合スコア12632

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

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

退会済みユーザー

退会済みユーザー

2020/01/19 06:58

回答、ありがとうございます! そちらでも試してみます。 丁寧な回答ありがとうございます!
guest

0

breakラベルを使ってるんですね。
Javaでは非推奨な記述法なので自分では使いませんが、
恐らくMENUラベルのところを更に波括弧で囲えば動作すると思います。

java

1void runMENU(Graphics g) { 2・・・ 3MENU:{ 4 if(leftkey == true){ 5・・・ 6 } 7}

が、先に書いてる通りこれは非推奨な書き方なので個人的にはお勧めできません。

少なくともこの部分ではMENUラベル部分を別メソッド出しして、
breakの部分で自身のメソッドを呼び出すという形で実現できないでしょうか。

java

1void runMENU(Graphics g) { 2・・・ 3 selectionSwitch(g); 4} 5 6void selectionSwitch(Graphics g) { 7 if(leftkey == true){ 8・・・ 9 if(cancelkey == true){ 10 rightkey = false; leftkey = false; enterkey = false; cancelkey = false; 11 selectionSwitch(g); 12 }else if(enterkey == true){ 13 goMain(); 14 } 15 } 16・・・ 17}

投稿2020/01/17 21:48

yureighost

総合スコア2183

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

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

退会済みユーザー

退会済みユーザー

2020/01/18 06:06

回答ありがとうございます! 別メソッドを作って呼び出すのは良いかもしれません! 早速その方法を試してみます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問