今回、javaの課題でもぐら叩きのゲームを作るというものがでてきました。
ソースコードを変えたり書き足したりでもっといいものにしろというものです。
私はこのソースコードにすこし書き足しました。
それが以下のものになります。
特になんですがMoguraBの部分です。
新しく表示時間の短いものを作成したのはいいのですが左上に表示されるスコアが更新されません。
スーパークラスとサブクラスでのメソッドの扱いがわるいのでしょうか?
おねがいします。
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MoguraPanel2 extends JPanel {
//もぐらたたきのターゲット
public class Mogura extends Canvas implements Runnable
{
//表示非表示を行うスレッド //新しいスレッドに変えると古いスレッドが停止する //run()ノif文参照 protected Thread thread; public Mogura(){ //MouseAdapterのmousePressed //processMouseEventを使うのに必要 enableEvents(MouseEvent.MOUSE_PRESSED); //初期化 init(); } //いったん非表示にして状態を初期化 //オブジェクト作成時とマウスでたたかれたときに使われる protected void init(){ //非表示 setVisible(false); //表示非表示スレッドを実行&threadに設定 //threadが上書きされ個々までのスレッドは停止する thread = new Thread(this); thread.start(); } //canvasクラスからのオーバーライド //MouseEventを扱うMouseAdapter以外のもうひとつの方法 //使うイベントをenableEventsで登録しておく //(コンストラクタ参照) protected void processMouseEvent(MouseEvent e){ //MousePressedの際に。 if(e.getID() == MouseEvent.MOUSE_PRESSED){ //得点を追加して(MoguraPanel2のメソッド) incScore(); //非表示にして状態を初期化 init(); } } //Runnableインターフェイスからのオーバーライド //表示非表示を繰り返す public void run(){ //無限ループ、threadが書き換わったら終了 for(;;){ int r=0; for ( int i = 0; i < 10; i++ ) { r = (int)(Math.random() * 3000) + 1; } try{ Thread.sleep(r); }catch(InterruptedException e){ e.printStackTrace(); } if(Thread.currentThread()!=thread){ break; } //見た目を設定して表示or非表示 //thread変数をチェック int r1=0,r2=0; for ( int i = 0; i < 10; i++ ) { r1 = (int)(Math.random() * 50) + 1; r2 = (int)(Math.random() * 50) + 1; } setBounds(r1*10,r2*10,50,50); setBackground(Color.RED); setVisible(!isVisible()); } } } //得点 protected int score = 0; public MoguraPanel2(){ //モグラたたきのエリアの設定 setPreferredSize(new Dimension(600,600)); //モグラいったいの配置 add(new Mogura()); add(new MoguraB()); add(new Mogura()); } //得点を得たときの挙動 protected void incScore(){ //得点更新 ++score; //得点表示更新 repaint(); } //Jpanelからのオーバーライド //中身の描写 public void paint(Graphics g){ //得点を表示 g.drawString("score:"+ score,10,10); //背景を描写 for(int i = 1;i <= 10; ++i){ g.drawOval(50-10*i, 50-10*i, 20*i, 20*i); } } public static void main(String[] args){ JFrame frame = new JFrame("Mogura"); frame.setContentPane(new MoguraPanel2()); frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } public class MoguraB extends Mogura{//得点が4点のMoguraBを作成 public MoguraB(){ //MouseAdapterのmousePressed //processMouseEventを使うのに必要 enableEvents(MouseEvent.MOUSE_PRESSED); //初期化 init(); } protected void processMouseEvent(MouseEvent e){ //MousePressedの際に。 if(e.getID() == MouseEvent.MOUSE_PRESSED){ //得点を追加して(MoguraPanel2のメソッド) incScore2(); //非表示にして状態を初期化 init(); } } protected void incScore2(){ //得点更新 score=score+4; //得点表示更新 repaint(); } public void run(){ //無限ループ、threadが書き換わったら終了 for(;;){ int r=0; for ( int i = 0; i < 10; i++ ) { r = (int)(Math.random() * 1000) + 1; } try{ Thread.sleep(r); }catch(InterruptedException e){ e.printStackTrace(); } if(Thread.currentThread()!=thread){ break; } //見た目を設定して表示or非表示 //thread変数をチェック int r1=0,r2=0; for ( int i = 0; i < 10; i++ ) { r1 = (int)(Math.random() * 50) + 1; r2 = (int)(Math.random() * 50) + 1; } setBounds(r1*10,r2*10,50,50); setBackground(Color.BLUE); setVisible(!isVisible()); } } }
}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/04 11:50
2015/07/04 11:53
2015/07/06 04:18