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

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

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

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

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

Q&A

1回答

3500閲覧

ブロック崩し/ブロック形成

eamons

総合スコア12

JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

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

0グッド

0クリップ

投稿2017/12/15 13:50

編集2017/12/18 06:00

今回はブロック崩しのブロックを作りたいとおもっているのですが、困っています。ヒントをもらえないでしょうか。

public class Block { int iRow, iCol; // このブロックの行と列番号 int x, y; // ブロックの中心座標 static final double MARGIN = 0.1; // ブロック間の空白はウインドウ幅/nColの10% static final double YMIN = 0.1; // 上端y座標のウインドウ高さに対する比率 // 省略 }

public class Block { int iRow=3, iCol=5; // このブロックの行と列番号 int x, y; // ブロックの中心座標 public boolean collision(Ball ball) { // 側面への衝突は考慮しなくてよい. // 衝突したらtrueを,しなければfalseを返す if (!visible) return false; // すでに消えているので衝突しない // y成分の判定: ボール中心とブロック中心間の距離 < ボール半径とブロック高さ/2の和 ? if (Math.abs(ball.y - y) < ball.radius + height / 2) { // ブロックとの衝突判定 if (/* x成分の判定 */) { if (block[i][j].y<ball.y); // 上から衝突 else ; // 下から衝突 visible = false; // ブロックを消す return true; // 衝突した } } return false; // 衝突せず } public boolean draw(Graphics m_g, Dimension dim) { if (!visible) return; m_g.setColor(Color.ORANGE); } public void draw(){ } public Block(int i, int j){ } static final double MARGIN = 0.1; // ブロック間の空白はウインドウ幅/nColの10% static final double YMIN = 0.1; // 上端y座標のウインドウ高さに対する比率 } }

に変更したところ、
block[i][j] = new Block(i, j);のBlock(i, j)
if (block[i][j].collision(ball)) のcollision(ball)
public int draw(Graphics m_g, Dimension dim) の draw(Graphics m_g, Dimension dim)
のエラーはきえましたが

public boolean draw(Graphics m_g, Dimension dim) { if (!visible) return; m_g.setColor(Color.ORANGE); }

Blockのクラスのdrawのreturnが今度はエラーになります
エラーメッセージはThis method must return a result of type booleanです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
// BlockMain.java
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class BlockMain extends JFrame{
public static void main(String[] args) {
BlockMain w = new BlockMain();
w.setTitle("ブロック崩し?");
w.setSize(500, 500); //Window のサイズをセット
BlockCanvas bc = new BlockCanvas();
w.add(bc);
w.setVisible(true); //表示する
}
}

// BlockCanvas.java
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
@SuppressWarnings("serial")
public class BlockCanvas extends Canvas implements Runnable {
Ball ball = new Ball();
Pad pad = new Pad();
Blocks blocks=new Blocks();
Thread thread; // スレッドを使うためのインスタンスを宣言
Dimension dim; // 描画領域の大きさ

private Random R = new Random(); private Random G = new Random(); private Random B = new Random(); int num=25; BlockCanvas() { dim = getSize(); // 描画領域の大きさを調べる thread = new Thread(this); // スレッドを生成 thread.start(); // スレッドを開始 (run()が呼ばれる) setPreferredSize(dim); this.addMouseListener(pad); } // ダブルバッファリング public void paint(Graphics g) { Dimension dim = getSize(); // 描画領域の大きさを調べる super.paint(g); // アンチエイリアス ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); Image m_image = createImage(dim.width, dim.height);// 裏画面の画像イメージ Graphics m_g = m_image.getGraphics(); // 裏画面に付随するグラフィックスオブジェクト m_g.setColor(Color.white); m_g.fillRect(0, 0, dim.width, dim.height); ball.draw(m_g, dim); g.drawImage(m_image, 0, 0, this); // 裏画面を表画面にコピー pad.draw(g, dim); blocks.draw(g, dim); } @Override public void run() { while (true) { // このアプリの実行中は無限ループ dim = getSize(); // 描画領域の大きさを調べる try { Thread.sleep(50); } catch (InterruptedException e) { // 例外は受け流す } ball.move(dim); pad.move(dim, ball); repaint(); // 再描画要求 } } public class Ball { int x = 50, y = 100; // ボール中心の座標 int vx = 6, vy = 5; // ボールの速度ベクトル int s=1; static final double RADIUS = 0.02; // ボールの半径はウインドウの2% int radius; // ボールの半径 public void draw(Graphics g, Dimension dim) { radius = (int)(RADIUS * dim.width); for(int i=0; i<num; i++){ g.setColor(new Color(R.nextInt(255),G.nextInt(255),B.nextInt(255))); } g.fillOval(x - radius, y - radius, radius + radius, radius + radius); } public void move(Dimension dimension) { x += vx; if (x < radius) { x = radius; vx = -vx; } else if (x > (dimension.width - radius)) { x = dimension.width - radius; vx = -vx; } y += vy; if (y < radius) { y = radius; vy = -vy; } else if (y > (dimension.height - radius)) { y = dimension.height - radius; vy = -vy; } } } public class Pad implements MouseListener { int x = 100, y = 380; // パッドの中心座標 int vx = 0; // パッドの速度ベクトル static final double WIDTH = 0.25; // パッド幅のウインドウ幅に対する比率 static final double HEIGHT = 0.95; // パッド位置のy座標のウインドウ高さに対する比率 int width, height; // パッドの幅,高さ public void draw(Graphics m_g, Dimension dim) { width = (int)(WIDTH * dim.width); height = width / 8; y = (int)(HEIGHT * dim.height); m_g.fillRect(x - width / 2, y - height / 2, width, height); } public void move(Dimension dim, Ball ball) { x += vx; // パッドの移動 if (x < width/2) { x = width/2; vx = -vx; } else if (x > dim.width-width/2) { // 左または右に当たったらx方向速度の符号を反転させる x = dim.width- width/2; vx = -vx; } // 左右の壁との衝突判定を行う.当たった場合は壁に接した位置で止める if (ball.y <= y+(ball.radius+height/2)&&ball.y >= y-(ball.radius+height/2)) { // ラケットの位置より下か? if ((x-width/6)<=ball.x&& ball.x <= (x+width/6)) { // ラケット? ball.y = y-(ball.radius+height/2); ball.vy = -ball.vy; }else if ((x-width/2)+ball.radius<=ball.x&& ball.x < (x-width/6)) { // ラケット? ball.y = y-(ball.radius+height/2); int tmp=ball.vy; ball.vy = -ball.vx; ball.vx=tmp; }else if((x+width/6)<ball.x&& ball.x <= (x+width/2)+ball.radius){ int tmp=ball.vy; ball.vy = -ball.vx; ball.vx=tmp; } } } @Override public void mouseClicked(MouseEvent me) { } @Override public void mouseEntered(MouseEvent me) { } @Override public void mouseExited(MouseEvent me) { } @Override public void mousePressed(MouseEvent me) { int a = 8; if (me.getButton() == MouseEvent.BUTTON1) {// 左ボタンクリック? vx = -a; // 左向きに移動させる } else { vx = a; // 右向きに移動させる } } @Override public void mouseReleased(MouseEvent me) { vx = 0; // パッドを止める } } public class Blocks { int nRow = 3, nCol = 5; // nRow: 行数,nCol: 列数 Block block[][]; boolean visible = true; public Blocks() { block = new Block[nRow][nCol]; for (int i = 0; i < nRow; i++) { for (int j = 0; j < nCol; j++) { block[i][j] = new Block(i, j); } } } public int collision(Ball ball) { int numColl = 0; // 衝突回数 for (int i = 0; i < nRow; i++) { for (int j = 0; j < nCol; j++) { if (block[i][j].collision(ball)) numColl++; } } return numColl; } public int draw(Graphics m_g, Dimension dim) { int numDrawn = 0; // ブロックの描画回数.0なら面クリア. for (int i = 0; i < nRow; i++) { for (int j = 0; j < nCol; j++) { if (block[i][j].draw(m_g, dim)) m_g.setColor(Color.ORANGE); numDrawn++; } } return numDrawn; } public class Block { int iRow=3, iCol=5; // このブロックの行と列番号 int x, y; // ブロックの中心座標 public boolean collision(Ball ball) { // 側面への衝突は考慮しなくてよい. // 衝突したらtrueを,しなければfalseを返す if (!visible) return false; // すでに消えているので衝突しない // y成分の判定: ボール中心とブロック中心間の距離 < ボール半径とブロック高さ/2の和 ? if (Math.abs(ball.y - y) < ball.radius + height / 2) { // ブロックとの衝突判定 if (/* x成分の判定 */) { if (block[i][j].y<ball.y); // 上から衝突 else ; // 下から衝突 visible = false; // ブロックを消す return true; // 衝突した } } return false; // 衝突せず } public boolean draw(Graphics m_g, Dimension dim) { if (!visible) return; m_g.setColor(Color.ORANGE); } public void draw(){ } public Block(int i, int j){ } static final double MARGIN = 0.1; // ブロック間の空白はウインドウ幅/nColの10% static final double YMIN = 0.1; // 上端y座標のウインドウ高さに対する比率 } } }

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

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

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

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

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

ngsvx

2017/12/15 16:07

コンパイルエラーであるなら、エラー内容とエラー箇所をきちんと記述して下さい。また、コードが見難いのでインデントを行って下さい
guest

回答1

0

コードは`(バッククォート、Shift+@)3つで囲ってください。

バッククォート3つ
ここにコード
バッククォート3つ

マークダウン記法の説明をなるべくわかりやすいようにというだけで解答欄に書きましたが、一応回答っぽいものも書きます。

エラー内容がわからないので想像ですが、省略されているクラス'Block'に、必要な関数がないのではないですか?
public Block(int, int)は存在していますか?
public ??? collision(Ball)は存在していますか?(???はboolなりのif文に入れられる型)

投稿2017/12/16 17:59

moredeep

総合スコア1507

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

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

eamons

2017/12/18 05:15

できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問