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

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

ただいまの
回答率

90.47%

  • Java

    14116questions

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

  • Android

    6631questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3790questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

配列初歩 ブロック崩しのブロックの配列がうまく描画されない android Java

解決済

回答 2

投稿 編集

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

androidでブロック崩しを作っています。
配列の知識が乏しく、ブロックが正常に描画されないためご教授いただけると幸いです。

下記にてBlockクラスの配列をblock[]として作成、
その後 値をそれぞれ入れました。

SurfaceView内のrunメソッド内にてforし、drawRectしています。
エラーはないのですが、ブロックが描画されません。

MainActivity

//ーーーーー中略ーーーーー

class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

        // スレッドクラス
        Thread mainLoop = null;
        // 描画用
        Paint paint = null;
        Paint paint2 = null;
        Paint paint3 = null;


        // 円のX,Y座標
        private int circleX = 50;
        private int circleY = 50;
        private int circle2X = 30;
        private int circle2Y = 30;
        // 円の移動量
        private int circleVx = 15;
        private int circleVy = 15;
        private int circle2Vx = 8;
        private int circle2Vy = 15;

        //今は6個だが、Block[ここに変数を入れて] 画面サイズによって表示できる個数を変えたい
        Block block[] = new Block[6];


        int view_w, view_h; //画面サイズ
        Resources res = this.getContext().getResources();
        Bitmap balor = BitmapFactory.decodeResource(res, R.drawable.balor);
        Bitmap sraimKing = BitmapFactory.decodeResource(res, R.drawable.sraim_king);


//ーーーーー中略ーーーーー

//コンストラクタ
        public CustomView(Context context) {
            super(context);
            // SurfaceView描画に用いるコールバックを登録する。
            getHolder().addCallback(this);
            // 描画用の準備
            paint = new Paint();
            paint2 = new Paint();
            paint3 = new Paint();
            //ボール
            paint.setColor(Color.GREEN);
            paint2.setColor(Color.CYAN);
            //ブロック
            paint3.setColor(Color.RED);



        }

//ーーーーー中略ーーーーー

@Override
        public void run(){

            while (true) {
                Canvas canvas = getHolder().lockCanvas();
                if (canvas != null)
                {
                    view_h = canvas.getHeight();
                    view_w = canvas.getWidth();

                    block[0]= new Block(view_w/10, view_h - view_h +300);
                    block[1]= new Block(view_w/10 + 100, view_h - view_h +300);
                    block[2]= new Block(view_w/10 + 200, view_h - view_h +300);
                    block[3]= new Block(view_w/10 + 300, view_h - view_h +300);
                    block[4]= new Block(view_w/10 + 400, view_h - view_h +300);
                    block[5]= new Block(view_w/10 + 500, view_h - view_h +300);

                // max720 1230
                    for(int i=0; i < 6;i+=1){

                        canvas.drawRect(block[i].x -40,block[1].y, block[i].x +40, block[i].y +20,paint3);

                }

//ーーーーー中略ーーーーー


Blockクラス

package com.example.canvastest;


public class Block {

    float x;
    float y;
    int margin = 10; //ブロックの間のマージン
    int i; //カウンター

    //コンストラクタ
    public Block (int _x,int _y){
        this.x = (float)_x;
        this.y = (float)_y;
    }

}


![イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

・スレッドはスタートしていますか?
・view_h - view_h + 300は常に300ですよね。
・for文の中の第二引数の配列の要素番号が1になっている。

また、drawRectの直前にログ出力処理を追加して各値を出力して見てください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/26 14:54

    view_h - view_h + 300
    画面サイズの違うスマホでも同じ位置に表示させたかったのですが、書き方が間違っていたようです。
    block[0]= new Block(view_w/10, view_h/10*3);
    このようにしました。

    forの第2引数、確かに1でした。。。

    ・スレッドはスタートしていますか?
     おそらくスタートしていると思います. surfaceCreatedの中でスレッドをnewし、スタートしています。デバッガで見ても、スレッドスタートされた後、@Override runの処理に正常にうつっているようです。

    >>drawRectの直前にログ出力処理を追加して各値

    block[3] Block@3847
    x=372 y=369(一定)
    block[4] Block@3850
    x=472 y=369
    このように一応値は入っているようです。

    キャンセル

  • 2016/04/26 15:32

    確かに、コードは問題なさそうですね。
    今度はpaint3をどのように初期化しているかを教えてください。

    キャンセル

  • 2016/04/26 16:47 編集

    ご回答ありがとうございます。

    CustomViewのメンバ変数にて
    Paint paint3 = null;

    CustomViewコンストラクタ内で
    paint3 = new Paint();
    paint3.setColor(Color.RED);

    としています。

    MainActivityに上記コード追加しました。

    キャンセル

  • 2016/04/26 17:06

    surfaceviewの背景をコメントアウトしてみたら、ブロックが表示されました。
    その代わりボール(画像でモンスターにしています)の挙動がおかしくなってしまいましたが。。。

    キャンセル

  • 2016/04/26 17:46

    yonaさんの意見を参考に、自己解決しました!

    解決方法
    canvas.drawColor(Color.BLACK);
    背景を描くメソッドをrunの一番上に持ってくる。
    その後にブロックやバー、ボール(モンスター)の描画メソッドを描く

    基本事項
    プログラムって絶対に上から下に処理していくので、背景描画処理などは最初に行う。

    キャンセル

0

yonaさんの意見を参考に、コード自体にエラーがないなら描画に問題があるんじゃね?と思い。

解決方法
canvas.drawColor(Color.BLACK);
背景を描くメソッドをrunの一番上に持ってくる。
その後にブロックやバー、ボール(モンスター)の描画メソッドを描く

基本事項
プログラムって絶対に上から下に処理していくので、背景描画処理などは最初に行う。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/26 17:24

    スライムの綴りはSlimeです。

    キャンセル

  • 2016/04/26 17:25

    回答が参考になったならばその回答をベストアンサーにし、この回答の内容はコメントに書くべきです。

    キャンセル

  • 2016/04/26 17:41 編集

    >>moredeepさん
    「べき」の根拠を教えて下さい。どこかで明文化されているでしょうか?

    キャンセル

  • 2016/04/26 17:50

    >>fuzzball さん
    スペルミスでした!
    >>moredeepさん
    直接的に「書く順序を入れ替えるだけで直る」ということを示したかったため自己解決をベストアンサーにしました。
    その間の悩んでいる過程やデバッグの過程はあくまで参考なのかな、と。
    念のためyonaさんのアンサーをベストアンサーにしました。

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Java

    14116questions

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

  • Android

    6631questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3790questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。