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

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

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

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

Q&A

解決済

3回答

2406閲覧

Buttonの、アクションの書き方について

akirasada1972

総合スコア41

Java

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

0グッド

0クリップ

投稿2018/06/24 00:00

“ゲーム開始”のボタンを押すと、ゲームが始まるようにしたいのですが、できません。

java

1 package luna.sexydesign; 2 3 import javax.swing.*; 4 import java.awt.*; 5 import java.awt.event.*; 6 7 class Subthread extends Thread { 8 9 private ScreenToucher toucher1; 10 11 public Subthread(ScreenToucher toucher1) { 12 this.toucher1 = toucher1; 13 } 14 15 @Override 16 public void run() {// TODO Auto-generated constructor stub 17 try { 18 sleep(2000); 19 } catch (InterruptedException e) { 20 // TODO Auto-generated catch block 21 e.printStackTrace(); 22 } 23 // SwingUtilities.invokeLater(() -> 24 toucher1.setPanel4(); 25 } 26 } 27 28 public class ScreenToucher extends JFrame { 29 30 int i = 0; 31 static int width = 500; 32 static int height = 500; 33 private MyPanel1 p1; 34 35 public static void main(String args[]) { 36 37 ScreenToucher frame = new ScreenToucher("Screen Toucher"); 38 frame.setVisible(true); 39 } 40 41 ScreenToucher(String title) { 42 setTitle(title); 43 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 44 setBounds(100, 100, width, height); 45 46 p1 = new MyPanel1(); 47 48 JPanel p2 = new JPanel(); 49 p2.setBackground(Color.gray); 50 51 JButton btn = new JButton("ゲーム開始"); 52 btn.addActionListener(new ClickAction()); 53 p2.add(btn); 54 55 add(p1, BorderLayout.NORTH); 56 add(p2, BorderLayout.CENTER); 57 58 } 59 60 public void setCount(int count) { 61 p1.setCount(count); 62 } 63 64 public void setPanel4(){ 65 MyPanel4 p4 = new MyPanel4(); 66 add(p4, BorderLayout.CENTER); 67 } 68 69 } 70 71 class MyPanel1 extends JPanel { 72 73 int i; 74 75 private JLabel l1; 76 77 MyPanel1() { 78 JPanel p1 = new JPanel(); 79 80 l1 = new JLabel(); 81 p1.setBackground(Color.green); 82 Integer j = new Integer(i); 83 String text = j.toString(); 84 l1.setText(text); 85 p1.add(l1); 86 87 add(p1); 88 } 89 90 public void setCount(int count) { 91 l1.setText(Integer.toString(count)); 92 } 93 94 } 95 96 class MyPanel3 extends JPanel { 97 98 static int width = 500; 99 static int height = 500; 100 static int i = 0; 101 static int r = 60; 102 static int x; 103 static int y; 104 105 final static Color bc = Color.black; 106 final static Color dc = Color.green; 107 108 private ScreenToucher toucher2; 109 110 public MyPanel3(ScreenToucher toucher2) { 111 setBackground(Color.black); 112 this.toucher2 = toucher2; 113 MouseListener(); 114 repaint(); 115 } 116 117 void MouseListener() { 118 addMouseListener(new MouseAdapter() { 119 public void mousePressed(MouseEvent e) { 120 double mouseX = e.getX(); 121 double mouseY = e.getY(); 122 if (mouseX > x && mouseX < x + 2 * r) { 123 if (mouseY > y && mouseY < y + 2 * r) { 124 repaint(); 125 toucher2.setCount(Count()); 126 } 127 } 128 } 129 }); 130 } 131 132 protected void paintComponent(Graphics g) { 133 super.paintComponent(g); 134 x = (int) (Math.random() * width); 135 y = (int) (Math.random() * height) + 30; 136 if ((x < width - 2 * r) && (y < height - 2 * r)) { 137 g.setColor(dc); 138 g.fillOval(x, y, r, r); 139 } else { 140 repaint(); 141 } 142 } 143 144 int Count() { 145 i += 100; 146 return i; 147 } 148 149 } 150 151 class MyPanel4 extends JPanel { 152 153 public MyPanel4() { 154 setBackground(new Color(0,0,0,100)); 155 } 156 157 public void paintComponent(Graphics g) { 158 super.paintComponent(g); 159 g.setColor(Color.white); 160 g.drawString("GAME OVER", 100, 200); 161 } 162 } 163 164 class ClickAction implements ActionListener { 165 166 @Override 167 public void actionPerformed(ActionEvent e) { 168 /** 169 Subthread thread = new Subthread(this); 170 thread.start(); 171 172 MyPanel3 p3 = new MyPanel3(p1); 173 add(p3, BorderLayout.CENTER); 174 */ 175 } 176 177 } 178 179

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

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

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

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

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

guest

回答3

0

“ゲーム開始”のボタンを押すと、ゲームが始まるようにしたい

ClickAction#actionPerformedに何も記述していないからでは。。

ScreenToucherクラスのコンストラクタ内で、

Java

1public class ScreenToucher extends JFrame { 2 private MyPanel1 p1; 3 private Subthread thread; 4 ScreenToucher(String title) { 5 // 前略 6 add(p2, BorderLayout.CENTER); 7 thread = new Subthread(this); 8 // startはこの時点では行わない。 9 } 10 // ClickActionを内部クラスに変更して 11 class ClickAction implements ActionListener { 12 13 @Override 14 public void actionPerformed(ActionEvent e) { 15 thread.start(); 16 } 17 } 18}

Swingでゲーム作成は

1,画面の遷移
1-a,表示したい画面毎にJPanelまたはJLayeredPaneを継承したクラスを作成する
この時paintComponentをオーバーライドすると、画面項目の座標計算を自力で行う必要が発生するので、パフォーマンスがシビアに求められている部分以外はできるだけオーバーライドしない。
文字列を表示したい時はJLabelを使う。
1-b,遷移処理はCardLayoutactionPerformedを使う。
参考:カウントダウン後に画面遷移をしたいです
ボタンが押されると画像が上書きされるプログラムを作りたい

2,ゲームの制限時間や定期的に処理を行いたい時
SwingEDT(Event Dispatch Thread)の関係上、Threadクラスを使わず、javax.swing.TimerSwingWorkerを使う。
3,画面作成はWindowBuilderを使う。

この3ルールを意識すると開発しやすいと思います。


ゆるふわで質問文のコードを書き換えました。サンプルコードです、ご参考まで。

Java

1import javax.swing.JFrame; 2 3import javax.swing.*; 4import java.awt.*; 5import java.awt.event.*; 6 7// ゲームモード 8enum GameMode { 9 MENU, PLAY, OVER, 10} 11 12public class ScreenToucher extends JFrame implements ActionListener { 13 14 int i = 0; 15 // private finalにして代入を抑止する 16 private final static int width = 500; 17 private final static int height = 500; 18 private ScorePanel p1; 19 private GameMode mode = GameMode.MENU; 20 // CardLayoutを使って切り替え 21 private final JPanel gamePanel = new JPanel(new CardLayout()); 22 private Timer timer; // タイマー 23 24 public static void main(String args[]) { 25 // mainスレッドなので、SwingUtilities#invokeLaterを使う。 26 SwingUtilities.invokeLater(() -> { 27 ScreenToucher frame = new ScreenToucher("Screen Toucher"); 28 frame.setVisible(true); 29 }); 30 } 31 32 ScreenToucher(String title) { 33 setTitle(title); 34 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 35 setBounds(100, 100, width, height); 36 37 p1 = new ScorePanel(); 38 39 JPanel p2 = new JPanel(); 40 p2.setBackground(Color.gray); 41 42 JButton btn = new JButton("ゲーム開始"); 43 btn.addActionListener(this); 44 p2.add(btn); 45 // カードレイアウトに登録 46 gamePanel.add(p2, GameMode.MENU.name()); 47 gamePanel.add(new MyPanel3(this), GameMode.PLAY.name()); 48 gamePanel.add(new GameOverPanel(), GameMode.OVER.name()); 49 50 add(p1, BorderLayout.NORTH); 51 add(gamePanel, BorderLayout.CENTER); 52 // Subthreadクラスを削除して、javax.swing.Timerを使用 53 // 10000ms=10秒後 54 timer = new Timer(10000, (e) -> { 55 showPanel(GameMode.OVER); 56 // ゲームオーバー後になにかしたい時はtimerも意識する必要があります。 57 }); 58 // ここではtimer#startをしない。 59 // 最初はメニューを表示 60 showPanel(GameMode.MENU); 61 } 62 63 public void setCount(int count) { 64 p1.setCount(count); 65 } 66 67 public void showPanel(GameMode m) { 68 final CardLayout card = (CardLayout) gamePanel.getLayout(); 69 card.show(gamePanel, m.name()); 70 this.mode = m; // パネル表示時にゲームモードを変更 71 } 72 73 @Override 74 public void actionPerformed(ActionEvent arg0) { 75 switch (mode) { 76 case MENU: 77 // ゲーム開始ボタンをクリック時に画面遷移 78 showPanel(GameMode.PLAY); 79 // 制限時間タイマーを起動 80 timer.start(); 81 break; 82 default: 83 // ゲームオーバー時に何らかの処理をしたいなら、caseの条件を追加して同じような形で。 84 break; 85 } 86 } 87} 88 89// MyPanel1 → ScorePanelにクラス名を変更 90class ScorePanel extends JPanel { 91 92 int i; 93 94 private JLabel l1; 95 96 ScorePanel() { 97 JPanel p1 = new JPanel(); 98 99 l1 = new JLabel(); 100 p1.setBackground(Color.green); 101 Integer j = new Integer(i); 102 String text = j.toString(); 103 l1.setText(text); 104 p1.add(l1); 105 106 add(p1); 107 } 108 109 public void setCount(int count) { 110 l1.setText(Integer.toString(count)); 111 } 112 113} 114 115// クラス名はクリッカーの方が良いかもです。 116class MyPanel3 extends JPanel { 117 118 static int width = 500; 119 static int height = 500; 120 static int i = 0; 121 static int r = 60; 122 static int x; 123 static int y; 124 125 final static Color bc = Color.black; 126 final static Color dc = Color.green; 127 128 private ScreenToucher toucher2; 129 130 public MyPanel3(ScreenToucher toucher2) { 131 setBackground(Color.black); 132 this.toucher2 = toucher2; 133 MouseListener(); 134 repaint(); 135 } 136 137 void MouseListener() { 138 addMouseListener(new MouseAdapter() { 139 public void mousePressed(MouseEvent e) { 140 double mouseX = e.getX(); 141 double mouseY = e.getY(); 142 if (mouseX > x && mouseX < x + 2 * r) { 143 if (mouseY > y && mouseY < y + 2 * r) { 144 repaint(); 145 toucher2.setCount(Count()); 146 } 147 } 148 } 149 }); 150 } 151 152 protected void paintComponent(Graphics g) { 153 super.paintComponent(g); 154 x = (int) (Math.random() * width); 155 y = (int) (Math.random() * height) + 30; 156 if ((x < width - 2 * r) && (y < height - 2 * r)) { 157 g.setColor(dc); 158 g.fillOval(x, y, r, r); 159 } else { 160 repaint(); 161 } 162 } 163 164 int Count() { 165 i += 100; 166 return i; 167 } 168 169} 170 171// MyPanel4 →GameOverPanelに名前を変更 172class GameOverPanel extends JPanel { 173 174 public GameOverPanel() { 175 setBackground(new Color(0, 0, 0, 100)); 176 } 177 178 public void paintComponent(Graphics g) { 179 super.paintComponent(g); 180 g.setColor(Color.white); 181 g.drawString("GAME OVER", 100, 200); 182 } 183} 184 185

あとクラス間でイベントの通知をしたい時はPropertyChangeListenerが使えます。
参考:他のクラスからJFrameのラベルのテキストを変更


カウントを初期化

Java

1public class ScreenToucher extends JFrame implements ActionListener { 2 public void addCount() { 3 p1.addCount(); 4 } 5} 6 7class ScorePanel extends JPanel { 8 // privateに変数名をiからscoreに変更 9 private int score = 0; 10 // finalで代入を抑止 11 private final JLabel l1; 12 13 ScorePanel() { 14 JPanel p1 = new JPanel(); 15 l1 = new JLabel(); 16 p1.setBackground(Color.green); 17 // 1行に 18 l1.setText(Integer.toString(score)); 19 p1.add(l1); 20 add(p1); 21 } 22 // addCountを追加 23 public void addCount() { 24 score += 100; 25 l1.setText(Integer.toString(score)); 26 } 27 // setCountで内部の変数を同期 28 public void setCount(int count) { 29 score = count; 30 l1.setText(Integer.toString(score)); 31 } 32 33} 34 35class MyPanel3 extends JPanel { 36 void MouseListener() { 37 addMouseListener(new MouseAdapter() { 38 public void mousePressed(MouseEvent e) { 39 // 前略 40 repaint(); 41 // Count()メソッドと変数:iは削除。 42 toucher2.addCount(); 43}

投稿2018/08/20 00:42

編集2018/08/20 20:41
umyu

総合スコア5846

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

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

akirasada1972

2018/08/20 19:54

ゲーム開始ボタンを、上に持っていき、ゲームを。もう一度できるようにしたのですが、得点を”0”に直すことができません。どのタイミングで、カウントを初期化したらよいのでしょうか? import javax.swing.JFrame; import javax.swing.*; import java.awt.*; import java.awt.event.*; // ゲームモード enum GameMode { MENU, PLAY, OVER, } public class ScreenToucher extends JFrame implements ActionListener { int i = 0; // private finalにして代入を抑止する private final static int width = 500; private final static int height = 500; private ScorePanel p1; private GameMode mode = GameMode.MENU; // CardLayoutを使って切り替え private final JPanel gamePanel = new JPanel(new CardLayout()); private Timer timer; // タイマー public static void main(String args[]) { // mainスレッドなので、SwingUtilities#invokeLaterを使う。 SwingUtilities.invokeLater(() -> { ScreenToucher frame = new ScreenToucher("Screen Toucher"); frame.setVisible(true); }); } ScreenToucher(String title) { setTitle(title); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, width, height); p1 = new ScorePanel(); JPanel p2 = new JPanel(); p2.setBackground(Color.gray); JButton btn = new JButton("ゲーム開始"); btn.addActionListener(this); p1.add(btn); // カードレイアウトに登録 gamePanel.add(p2, GameMode.MENU.name()); gamePanel.add(new MyPanel3(this), GameMode.PLAY.name()); gamePanel.add(new GameOverPanel(), GameMode.OVER.name()); add(p1, BorderLayout.NORTH); add(gamePanel, BorderLayout.CENTER); // Subthreadクラスを削除して、javax.swing.Timerを使用 // 10000ms=10秒後 timer = new Timer(10000, (e) -> { showPanel(GameMode.OVER); // ゲームオーバー後になにかしたい時はtimerも意識する必要があります。 }); // ここではtimer#startをしない。 // 最初はメニューを表示 showPanel(GameMode.MENU); } public void setCount(int count) { p1.setCount(count); } public void showPanel(GameMode m) { final CardLayout card = (CardLayout) gamePanel.getLayout(); card.show(gamePanel, m.name()); this.mode = m; // パネル表示時にゲームモードを変更 } @Override public void actionPerformed(ActionEvent arg0) { switch (mode) { case MENU: // ゲーム開始ボタンをクリック時に画面遷移 showPanel(GameMode.PLAY); // 制限時間タイマーを起動 timer.start(); break; case OVER: showPanel(GameMode.PLAY); timer.start(); break; default: // ゲームオーバー時に何らかの処理をしたいなら、caseの条件を追加して同じような形で。 break; } } } // MyPanel1 → ScorePanelにクラス名を変更 class ScorePanel extends JPanel { int i; private JLabel l1; ScorePanel() { JPanel p1 = new JPanel(); l1 = new JLabel(); p1.setBackground(Color.green); Integer j = new Integer(i); String text = j.toString(); l1.setText(text); p1.add(l1); add(p1); } public void setCount(int count) { l1.setText(Integer.toString(count)); } } // クラス名はクリッカーの方が良いかもです。 class MyPanel3 extends JPanel { static int width = 500; static int height = 500; static int r = 60; static int i = 0; static int x; static int y; final static Color bc = Color.black; final static Color dc = Color.green; private ScreenToucher toucher2; public MyPanel3(ScreenToucher toucher2) { setBackground(Color.black); this.toucher2 = toucher2; MouseListener(); repaint(); } void MouseListener() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { double mouseX = e.getX(); double mouseY = e.getY(); if (mouseX > x && mouseX < x + 2 * r) { if (mouseY > y && mouseY < y + 2 * r) { repaint(); toucher2.setCount(Count()); } } } }); } protected void paintComponent(Graphics g) { super.paintComponent(g); x = (int) (Math.random() * width); y = (int) (Math.random() * height) + 30; if ((x < width - 2 * r) && (y < height - 2 * r)) { g.setColor(dc); g.fillOval(x, y, r, r); } else { repaint(); } } int Count() { i += 100; return i; } } // MyPanel4 →GameOverPanelに名前を変更 class GameOverPanel extends JPanel { public GameOverPanel() { setBackground(new Color(0, 0, 0, 100)); } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.white); g.drawString("GAME OVER", 100, 200); } }
umyu

2018/08/20 20:19 編集

@akirasada1972さんへ ニアピン賞というか少し惜しいです。 こんな感じにスコアのクリア処理を入れるといいです。 case OVER: setCount(0); // ←この行がないです。 showPanel(GameMode.PLAY); timer.start(); break; あとこの欄は他の回答者の目に付きづらいので、やりたいことと今どういう状態(コンパイルエラー/実行エラー/その他)なのかを明確にして質問文を編集していただけると助かります。 ペイントでラフ画面を書いて質問文に追記するのも一つの手かと。
umyu

2018/08/20 20:43

@akirasada1972さんへ 回答編集しましたこんな感じです。 そのまま使うのではなく、どうして動くのかをSystem.out.printlnをactionPerformedやTimerの所に入れて動作確認してみてくださいな。
guest

0

まずゲームが開始しているかbooleanかなんかで変数を作り、
ボタンが押されたら変数の値をゲーム開始と同じ状態にし、
paintComponentの中にif文を入れ、描画すればいいかと。
ただ、これからボタンが増える可能性を考えると、確かどっかにどのボタンが押されたのか判定する関数があったはず・・・
(知識不足ですいません。わからなかったら返信ください。)

投稿2018/08/18 00:11

yukkuri

総合スコア624

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

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

akirasada1972

2018/08/19 22:37

ボタンで、閉じることは、できるのですが、画面を、書き直すことが、できません。 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ScreenToucher { public static void main(String args[]) { JFrame frame = new JFrame("ScreenToucher"); ButtonPanel bpanel = new ButtonPanel(); frame.getContentPane().add(bpanel); frame.setSize(500,550); frame.setVisible(true); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } } class ButtonPanel extends JPanel { JButton b1 = new JButton("Start"); JLabel l =new JLabel("0"); JButton b2 = new JButton("End"); MyPanel p = new MyPanel(); public ButtonPanel() { setBackground(Color.white); JPanel p1 = new JPanel(); p1.setPreferredSize(new Dimension(500,50)); p1.setLayout(new GridLayout(1,3,20,10)); JPanel p2 = new JPanel(); p2.setPreferredSize(new Dimension(500,500)); p1.add(b1); p1.add(l); p1.add(b2); p2.setLayout(new GridLayout(1,1)); p2.add(p); add(p1, BorderLayout.NORTH); add(p2, BorderLayout.CENTER); b1.addActionListener(new Listener1()); b2.addActionListener(new Listener2()); } public class Listener1 implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource() == b1){ p = new MyPanel(); } } } public class Listener2 implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource() == b2) System.exit(0); } } } class MyPanel extends JPanel { static int width = 500; static int height = 500; static int i = 0; static int r = 60; static int x; static int y; final static Color bc = Color.black; final static Color dc = Color.green; public MyPanel() { setBackground(Color.black); MouseListener(); repaint(); } void MouseListener() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { double mouseX = e.getX(); double mouseY = e.getY(); if (mouseX > x && mouseX < x + 2 * r) { if (mouseY > y && mouseY < y + 2 * r) { repaint(); } } } }); } protected void paintComponent(Graphics g) { super.paintComponent(g); x = (int) (Math.random() * width); y = (int) (Math.random() * height) + 30; if ((x < width - 2 * r) && (y < height - 2 * r)) { g.setColor(dc); g.fillOval(x, y, r, r); } else { repaint(); } } int Count() { i += 100; return i; } }
yukkuri

2018/08/20 15:29

if(e.getSource() == b1){ p = new MyPanel(); } このifの中にadd( p ); すれば行けると思います。(ためしてないのでちがったらすいません。)
guest

0

自己解決

皆さんのアドバイスを、参考にして、無事完成させることが、できました。
ありがとうございましした。

java

1import javax.swing.JFrame; 2 3import javax.swing.*; 4import java.awt.*; 5import java.awt.event.*; 6 7// ゲームモード 8enum GameMode { 9 MENU, PLAY, OVER, 10} 11 12public class ScreenToucher extends JFrame { 13 14 int i = 0; 15 // private finalにして代入を抑止する 16 private final static int width = 500; 17 private final static int height = 500; 18 private GameMode mode = GameMode.MENU; 19 // CardLayoutを使って切り替え 20 private final JPanel gamePanel = new JPanel(new CardLayout()); 21 // finalで代入を抑止 22 public static JLabel l1; 23 private int score = 0; 24 25 public static Timer timer; // タイマー 26 27 JButton btn1 = new JButton("ゲーム開始"); 28 JButton btn2 = new JButton("ゲーム終了"); 29 30 public static void main(String args[]) { 31 // mainスレッドなので、SwingUtilities#invokeLaterを使う。 32 SwingUtilities.invokeLater(() -> { 33 ScreenToucher frame = new ScreenToucher("Screen Toucher"); 34 frame.setVisible(true); 35 }); 36 } 37 38 ScreenToucher(String title) { 39 40 setTitle(title); 41 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 42 setBounds(100, 100, width, height); 43 44 JPanel p1 =new JPanel(); 45 p1.setLayout(new GridLayout(1,3,20,10)); 46 47 JPanel p2 = new JPanel(); 48 p2.setBackground(Color.gray); 49 50 btn1.addActionListener(new Listener1()); 51 p1.add(btn1); 52 53 l1 = new JLabel(); 54 // 1行に 55 l1.setText("0"); 56 p1.add(l1); 57 58 btn2.addActionListener(new Listener2()); 59 p1.add(btn2); 60 61 // カードレイアウトに登録 62 gamePanel.add(p2, GameMode.MENU.name()); 63 gamePanel.add(new MyPanel3(this), GameMode.PLAY.name()); 64 gamePanel.add(new GameOverPanel(), GameMode.OVER.name()); 65 66 67 add(p1, BorderLayout.NORTH); 68 add(gamePanel, BorderLayout.CENTER); 69 70 // Subthreadクラスを削除して、javax.swing.Timerを使用 71 // 10000ms=10秒後 72 timer = new Timer(10000, (e) -> { 73 showPanel(GameMode.OVER); 74 }); 75 // ここではtimer#startをしない。 76 showPanel(GameMode.MENU); 77} 78 79 public void addCount() { 80 score += 100; 81 l1.setText(Integer.toString(score)); 82 } 83 84 // setCountで内部の変数を同期 85 void setCount(int count) { 86 score = count; 87 l1.setText(Integer.toString(score)); 88 } 89 90 public void showPanel(GameMode m) { 91 final CardLayout card = (CardLayout) gamePanel.getLayout(); 92 card.show(gamePanel, m.name()); 93 this.mode = m; // パネル表示時にゲームモードを変更 94 } 95 96 97 public class Listener1 implements ActionListener { 98 99 public void actionPerformed(ActionEvent e) { 100 101 if(e.getSource()==btn1) { 102 setCount(0); 103 showPanel(GameMode.PLAY); 104 timer.start(); 105 } 106 } 107 } 108 109 public class Listener2 implements ActionListener { 110 111 public void actionPerformed(ActionEvent e) { 112 113 if(e.getSource()==btn2) { 114 115 System.exit(0); 116 117 } 118 } 119 } 120} 121// クラス名はクリッカーの方が良いかもです。 122class MyPanel3 extends JPanel { 123 124 static int width = 500; 125 static int height = 500; 126 static int r = 60; 127 static int i = 0; 128 static int x; 129 static int y; 130 131 final static Color bc = Color.black; 132 final static Color dc = Color.magenta; 133 134 private ScreenToucher toucher; 135 // privateに変数名をiからscoreに変更 136 private int count = 0; 137 138 public MyPanel3(ScreenToucher toucher) { 139 setBackground(bc); 140 this.toucher = toucher; 141 MouseListener(); 142 repaint(); 143 } 144 145 void MouseListener() { 146 addMouseListener(new MouseAdapter() { 147 public void mousePressed(MouseEvent e) { 148 double mouseX = e.getX(); 149 double mouseY = e.getY(); 150 if (mouseX > x && mouseX < x + 2 * r) { 151 if (mouseY > y && mouseY < y + 2 * r) { 152 repaint(); 153 toucher.addCount(); 154 } 155 } 156 } 157 }); 158 } 159 160 protected void paintComponent(Graphics g) { 161 super.paintComponent(g); 162 x = (int) (Math.random() * width); 163 y = (int) (Math.random() * height) + 30; 164 if ((x < width - 2 * r) && (y < height - 2 * r)) { 165 g.setColor(dc); 166 g.fillOval(x, y, r, r); 167 } else { 168 repaint(); 169 } 170 } 171} 172 173// MyPanel4 →GameOverPanelに名前を変更 174class GameOverPanel extends JPanel { 175 176 public GameOverPanel() { 177 setBackground(new Color(0, 0, 0, 100)); 178 } 179 180 public void paintComponent(Graphics g) { 181 super.paintComponent(g); 182 g.setColor(Color.white); 183 g.drawString("GAME OVER", 100, 200); 184 } 185} 186

投稿2018/08/22 16:53

akirasada1972

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問