前回と似た質問で申し訳ないですが、わからないので質問させていただきます。
下のプログラムはシューティングゲームを作っている途中のプログラムです。
コード public class Part01 extends JFrame{ /** * メインクラス */ public static void main(String args[]){ new Part01(); } /** * コンストラクタ */ public Part01(){ /**フレームの初期化*/ super("Shooting Game"); setBounds(0, 0, 500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); /**パネルの生成*/ MyPanel myPanel = new MyPanel(); add(myPanel); /**初期化を行う*/ myPanel.initialization(); } } public class MyPanel extends JPanel implements Runnable{ Title title; //Titleクラス変数 Score score; //Scoreクラス変数 /** * コンストラクタ */ public MyPanel(){ /*title = new Title(); score = new Score();*/ Thread thread = new Thread(this); thread.start(); } /** * 初期化 */ public void initialization(){ //score.initMyScore(); } /** * メインループ */ @Override public void run(){ while(true){ System.out.println("12345"); repaint(); try{ Thread.sleep(500); } catch(InterruptedException e){ } } } /** * 描画 */ @Override protected void paintComponent(Graphics g){ super.paintComponent(g); System.out.println("6789"); g.setColor(Color.RED); g.fillRect(100, 100, 100, 100); } }
プログラム内容
Part01クラスでフレームを作り、そこにパネルを貼り付けている。
0.5秒ごとに再描画をして、赤い四角形を描画している。
今MyPanelクラスのコンストラクタでScoreクラスとTitleクラスをインスタンス化したのをコメントアウトしています。
これで実行すると四角形がきちんと描画され、0.5秒ごとに”12345”と”6789”も表示されます。
次にコメントアウトをやめて
title = new Title();
score = new Score();
を記述した状態で実行すると四角形と”6789”は表示されず、”12345”だけ0.5秒ごとに表示されました。つまりpaintComponentメソッドが動いていませんでした。
フレームをいじると四角形も”6789”も表示されます。
下にScoreクラスとTitleクラスを載せておきますが、これをインスタンス化しただけでpaintComponentメソッドが呼ばれなくなるのはどうしてなのでしょうか?
ScoreクラスとTitleクラスにpaintComponentメソッドを妨げるような記述があるからだと予想はできるのですが原因が何かわかりません。
わかる方がいればよろしくお願いします!
ScoreクラスとTitleクラス
コード public class Score{ int myScore; //スコア int highScore; //ハイスコア Color scoreColor; //スコア表示の色 Font scoreFont; //スコア表示のフォント /** * コンストラクタ */ public Score(){ myScore = 0; highScore = 0; scoreColor = Color.BLACK; scoreFont = new Font(Font.MONOSPACED, Font.BOLD, 10); } /** * MyScoreのセッター */ public void setMyScore(int myScore){ this.myScore = myScore; } /** * MyScoreのゲッター */ public int getMyScore(){ return myScore; } /** * 得点加算 * @param point 追加する得点 */ public void addMyScore(int point){ myScore += point; } /** * highScore更新 */ public void cmpareScore(){ if(myScore > highScore){ highScore = myScore; } } /** * MyScore描画 * @param g グラフィック変数 */ public void drawMyScore(Graphics g){ g.setColor(scoreColor); g.setFont(scoreFont); g.drawString("score:" + myScore, 30, 30); } /** * highScore描画 * @param g グラフィック変数 */ public void drawHighScore(Graphics g){ g.setColor(scoreColor); g.setFont(scoreFont); g.drawString("highScore:" + highScore, 420, 30); } /** * MyScoreの初期化 */ public void initMyScore(){ myScore = 0; } } public class Title{ Color titleColor; //タイトル表示の色 Font mainTitleFont; //メインタイトル表示のフォント Font subTitleFont; //サブタイトル表示のフォント int blinkCount; //アニメーション用点滅カウンタ /** * コンストラクタ */ public Title(){ titleColor = Color.BLACK; mainTitleFont = new Font(Font.MONOSPACED, Font.BOLD, 30); subTitleFont = new Font(Font.MONOSPACED, Font.BOLD, 15); } /** * ゲームスタートタイトル表示 * @param g グラフィック変数 */ public void drawGameStartTitle(Graphics g){ g.setColor(titleColor); g.setFont(mainTitleFont); g.drawString("Shooting", 150, 150); blinkCount++; /**点滅処理(偶数の場合のみ表示)*/ if(blinkCount % 2 == 0){ g.setFont(subTitleFont); g.drawString("hit SPACE key", 200, 350); } } /** * ゲームオーバータイトル表示 * @param g グラフィック変数 */ public void drawGameOverTitle(Graphics g){ g.setColor(titleColor); g.setFont(mainTitleFont); g.drawString("GAMEOVER", 150, 150); } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。