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

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

ただいまの
回答率

91.24%

  • Java

    10890questions

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

  • Eclipse

    1328questions

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

  • Swing

    188questions

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

  • JFrame

    17questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 132

eamons

score 4

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

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座標のウインドウ高さに対する比率     
}
}    
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ngsvx

    2017/12/16 01:07

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

    キャンセル

  • LouiS0616

    2017/12/16 14:40

    『エラーが出る箇所』だけではちょっと物足りないです。エラーメッセージを書いてください。また、コードは工夫すれば見やすく表示できます。 https://teratail.com/help/question-tips#questionTips3-5-1

    キャンセル

回答 1

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/18 14:15

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

    キャンセル

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

ただいまの回答率

91.24%

関連した質問

  • 解決済

    別クラスの変数 配列型のクラス変数を使うには

    下記クラスの変数 width heightを同一パッケージ 別クラスで使用したいです。 Blockクラスの変数をMainActivityで使いたいです。 配列型にした場合、その

  • 解決済

    色のついたPanelの上にLabelの配置

    public class Picross extends JFrame implements ActionListener { int[][] questiona

  • 解決済

    java eclipseについて

    java eclipseでスライドパズルを作成しています。 9枚の画像で作成しており、現在は9枚の画像を実行するたびにランダムで表示するところまでいきました。 その後ですが9枚

  • 解決済

    IEをオートメーション出来るプログラミング言語(エクセルVBA以外)

    お世話になります。 タイトルの通りです。 IEをマクロで自動制御出来るプログラミング言語を知りたいです。 エクセルVBAで事は足りるのですが、エクセルが付いている事が

  • 解決済

    java外部ライブラリを使ったポップアップのやり方(Processing)

    Processingについての質問です。 javaのAPIを用いて、例えば画面をクリックしたときに、ポップアップでウインドウが出て「クリックされました」というような表示がされ

  • 解決済

    ボール跳ね返り処理について

    ヘディングのテキスト###前提・実現したいこと アクティブエリアを考慮してBallクラスのmoveメソッドでの跳ね返り処理のどこが不完全であるかを見つけ,ボールの跳ね返り処理正しく

  • 解決済

    パッドの導入/制御/判定

    Padクラスのmoveメソッド内でのパッドと壁およびボールとの衝突判定処理を追加し、以下2つのの条件のようにしたいのですが、ボールの衝突判定のif文はどのようにして、他をどのように

  • 受付中

    キー入力がされてない

    キーを入力したら左右に移動したりジャンプしたり させたいのですがキー入力がされていなかったのですが 原因がわかりません どうしたらいいでしょうか ご回答お願い致します impo

同じタグがついた質問を見る

  • Java

    10890questions

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

  • Eclipse

    1328questions

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

  • Swing

    188questions

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

  • JFrame

    17questions

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