![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
前回回答してくださった皆様、ありがとうございました。
現在、Javaで簡単なモグラ叩きゲームを作っており、リトライボタンを追加
しようと思っているのですが、なぜか上手くボタンが表示されません・・・何故で
しょうか?
また、マウスのクリック待ち時間(クリック制限時間)を作りたいのですが、どのようにすれば
よいでしょうか?
ソースは以下の通りです。(※字数制限に引っかかった、未使用のイベントなどは省略していますがご了承ください※)
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
class mole_hit extends Frame implements MouseListener, ActionListener, MouseMotionListener
{
int mole_point;//土竜の出現データ
int fore_mole_point;//土竜の前の出現データ
int mole_x, mole_y;//土竜の出現座標
int mouse_x, mouse_y;//マウスの座標
int life = 10;
long t = 1000;
MyCanvas mc = new MyCanvas();
public static void main(String[] args)
{
new mole_hit();
}
mole_hit()
{
super("土竜叩きゲーム");//フレーム名
setSize(700, 700);//フレームサイズ
setLayout(null);
if (life <= 0)//ライフが0以下になったら、
{//リトライボタンを表示
Button b = new Button("RETRY");
b.addActionListener(this);
b.setSize(50, 25);
b.setLocation(620, 620);
add(b);
}
mc.setSize(600, 600);//キャンバスサイズ
mc.setLocation(0, 0);//キャンバス配置座標
mc.addMouseListener(this);
mc.addMouseMotionListener(this);
add(mc);
setVisible(true);
addWindowListener(new Close()); //ウィンドウクローズ
}
/*** ボタン等のイベント ***/
public void actionPerformed(ActionEvent e)
{
life = 10;
mc.repaint();
}
/*** マウスボタンが押されたとき ***/
public void mousePressed(MouseEvent e)
{
mouse_x = e.getX();
mouse_y = e.getY();
System.out.println("(" + mouse_x + "," + mouse_y + ")");//マウス座標確認用
mc.repaint();
}
/*** キャンバス ***/
public class MyCanvas extends Canvas
{
/*** 描画ステータス ***/
public void paint(Graphics g)
{
super.paint(g);
int line_x, line_y;//ライン描画用変数
int hall_x, hall_y;//ホール描画
int i, j;//ループ用変数
Dimension size = getSize();//ウインドウのサイズを取得
Sleep s = new Sleep();//スリープ用メソッド
Random rnd = new Random();
Color brown = new Color(160, 0, 0);//茶色
/*** ライフがあるとき ***/
if (life > 0)
{
/***** 背景色を青にする *****/
g.setColor(Color.blue);
g.fillRect(0, 0, size.width, size.height);
/*** ボックスの背景色を設定 ***/
g.setColor(Color.green);
g.fill3DRect(100, 100, 300, 300, true);
/***** 縦軸・横軸を描画*****/
line_x = 100;
line_y = 100;
g.setColor(Color.red);
/*** 縦軸を描画 ***/
for (i = 0; i < 4; i++)
{
g.drawLine(line_x, 100, line_x, 400);
line_x += 100;
}
for (i = 0; i < 4; i++)
{
g.drawLine(100, line_y, 400, line_y);
line_y += 100;
}
/*** 土竜の出現するボックスを描画 ***/
g.setColor(Color.black);
hall_y = 130;
for (i = 0; i < 3; i++)
{
hall_x = 115;
for (j = 0; j < 3; j++)
{
g.fillOval(hall_x, hall_y, 75, 40);
hall_x += 100;
}
hall_y += 100;
}
do
{
fore_mole_point = rnd.nextInt(9);
}
while(mole_point == fore_mole_point);
mole_point = fore_mole_point;
switch(mole_point)
{
case 0:
mole_x = 125;
mole_y = 135;
break;
case 1:
mole_x = 225;
mole_y = 135;
break;
case 2:
mole_x = 325;
mole_y = 135;
case 3:
mole_x = 125;
mole_y = 235;
break;
case 4:
mole_x = 225;
mole_y = 235;
break;
case 5:
mole_x = 325;
mole_y = 235;
break;
case 6:
mole_x = 125;
mole_y = 335;
break;
case 7:
mole_x = 225;
mole_y = 335;
break;
case 8:
mole_x = 325;
mole_y = 335;
break;
default:
break;
}
g.setColor(brown);
g.fillOval(mole_x, mole_y, 50, 25);
if (mole_x <= mouse_x && mole_y <= mouse_y && mole_x + 50 >= mouse_x && mole_y + 25 >= mouse_y)
{
/*** 成功時アクション ***/
g.setColor(Color.red);
g.fillOval(mole_x, mole_y, 50, 25);
}
s.Sleep(500);
life--;
}
/*** ライフが無いとき ***/
if (life <= 0)
{
g.setColor(Color.red);
g.fillRect(0, 0, size.width, size.height);
g.setColor(Color.blue);
g.drawString("GAME-OVER(´・ω・`)", 250, 300);
}
}
}
}
No.2ベストアンサー
- 回答日時:
んー・・・コードが汚い。
。。ただ、ボタンを直したいだけなら↓をすれば動きますが、綺麗に書き直したほうがいいです。
paintの中で土竜の場所を決めると、ウィンドウを最小化して戻したら違う場所に移るし。
if (life <= 0)//ライフが0以下になったら、
{//リトライボタンを表示
Button b = new Button("RETRY");
b.addActionListener(this);
b.setSize(50, 25);
b.setLocation(620, 620);
add(b);
}
の部分を
if 無しで。 (lifeは最初に10にしてるんだから、中のコードは実行されないし)
resetButton = new Button("RETRY");
resetButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
life = 10;
mc.repaint();
resetButton.setVisible(false);
}
});
resetButton.setSize(50, 25);
resetButton.setLocation(620, 620);
resetButton.setVisible(false);
add(resetButton);
にして (& private Button resetButton; をメンバー変数にして)
MyCanvasのpaintで
/*** ライフが無いとき ***/
if (life <= 0)
{
resetButton.setVisible(true); ←を足す。
上手く動作しました!
自分のコード汚いんですか・・・今まで指摘された事なかったから
知らなかった
ご指摘有難うございます。以降気をつけて書いてみます・・・。
No.1
- 回答日時:
なんでコンストラクタでボタンを作っているのかが理解できませんが....
「上手くボタンが表示されません」というところ, もっと具体的に「どうなるつもりで書いてどう『上手く表示されない』のか」を書けませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
C#のGraphicsクラスについてです。
-
VB.NETのSendMessageを教えてく...
-
JAVAでの背景画像表示
-
AWTでテキストボックスの枠線を...
-
invokeLaterの逆に
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
パワーポイントのVBAでテキスト...
-
「インスタンス」の意味をわか...
-
mainメソッドのthrows節で設定...
-
複数の変数を宣言する時、同時...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBA 画像を貼り付ける...
-
3年間同じクラスになる確率
-
説明文書でのメソッド・変数の...
-
tryの終了
-
Java初級 引数に適用できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
JAVAでの背景画像表示
-
VB.NETのSendMessageを教えてく...
-
C# DataGridView のCellPaintin...
-
Labelコントロールの背景をグラ...
-
C# リストビューの特定のセルの...
-
画面のちらつきの原因が知りた...
-
canvasで表示されてる画像を1...
-
重なった要素上でのイベントで...
-
描画してもウィンドウをリサイ...
-
SwingとEDT(イベントディスパッ...
-
株価チャートソフトを作るのに
-
Javaで文字の角度を変えて表示...
-
JavaでのDirectXの使用
-
Androidで画像の中で指定した範...
-
アクセスで他アプリから復帰し...
-
C# テキストボックスについて
-
VS Treeview のデザイン変更
-
ドラッグして矩形を描くには
-
描画処理が実行されない
おすすめ情報