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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

2249閲覧

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

masaakitsuyoshi

総合スコア102

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/04/25 10:31

編集2016/04/26 08:07

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

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

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

MainActivity

Java

1//ーーーーー中略ーーーーー 2 3class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable { 4 5 // スレッドクラス 6 Thread mainLoop = null; 7 // 描画用 8 Paint paint = null; 9 Paint paint2 = null; 10 Paint paint3 = null; 11 12 13 // 円のX,Y座標 14 private int circleX = 50; 15 private int circleY = 50; 16 private int circle2X = 30; 17 private int circle2Y = 30; 18 // 円の移動量 19 private int circleVx = 15; 20 private int circleVy = 15; 21 private int circle2Vx = 8; 22 private int circle2Vy = 15; 23 24 //今は6個だが、Block[ここに変数を入れて] 画面サイズによって表示できる個数を変えたい 25 Block block[] = new Block[6]; 26 27 28 int view_w, view_h; //画面サイズ 29 Resources res = this.getContext().getResources(); 30 Bitmap balor = BitmapFactory.decodeResource(res, R.drawable.balor); 31 Bitmap sraimKing = BitmapFactory.decodeResource(res, R.drawable.sraim_king); 32 33 34//ーーーーー中略ーーーーー 35 36//コンストラクタ 37 public CustomView(Context context) { 38 super(context); 39 // SurfaceView描画に用いるコールバックを登録する。 40 getHolder().addCallback(this); 41 // 描画用の準備 42 paint = new Paint(); 43 paint2 = new Paint(); 44 paint3 = new Paint(); 45 //ボール 46 paint.setColor(Color.GREEN); 47 paint2.setColor(Color.CYAN); 48 //ブロック 49 paint3.setColor(Color.RED); 50 51 52 53 } 54 55//ーーーーー中略ーーーーー 56 57@Override 58 public void run(){ 59 60 while (true) { 61 Canvas canvas = getHolder().lockCanvas(); 62 if (canvas != null) 63 { 64 view_h = canvas.getHeight(); 65 view_w = canvas.getWidth(); 66 67 block[0]= new Block(view_w/10, view_h - view_h +300); 68 block[1]= new Block(view_w/10 + 100, view_h - view_h +300); 69 block[2]= new Block(view_w/10 + 200, view_h - view_h +300); 70 block[3]= new Block(view_w/10 + 300, view_h - view_h +300); 71 block[4]= new Block(view_w/10 + 400, view_h - view_h +300); 72 block[5]= new Block(view_w/10 + 500, view_h - view_h +300); 73 74 // max720 1230 75 for(int i=0; i < 6;i+=1){ 76 77 canvas.drawRect(block[i].x -40,block[1].y, block[i].x +40, block[i].y +20,paint3); 78 79 } 80 81//ーーーーー中略ーーーーー 82

Blockクラス

java

1package com.example.canvastest; 2 3 4public class Block { 5 6 float x; 7 float y; 8 int margin = 10; //ブロックの間のマージン 9 int i; //カウンター 10 11 //コンストラクタ 12 public Block (int _x,int _y){ 13 this.x = (float)_x; 14 this.y = (float)_y; 15 } 16 17}

![イメージ説明

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

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

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

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

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

guest

回答2

0

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

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

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

投稿2016/04/26 08:19

masaakitsuyoshi

総合スコア102

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

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

fuzzball

2016/04/26 08:24

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

2016/04/26 08:25

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

2016/04/26 08:42 編集

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

2016/04/26 08:50

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

0

ベストアンサー

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

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

投稿2016/04/25 10:55

yona

総合スコア18155

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

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

masaakitsuyoshi

2016/04/26 05: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 このように一応値は入っているようです。
yona

2016/04/26 06:32

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

2016/04/26 07:48 編集

ご回答ありがとうございます。 CustomViewのメンバ変数にて Paint paint3 = null; CustomViewコンストラクタ内で paint3 = new Paint(); paint3.setColor(Color.RED); としています。 MainActivityに上記コード追加しました。
masaakitsuyoshi

2016/04/26 08:06

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

2016/04/26 08:46

yonaさんの意見を参考に、自己解決しました! 解決方法 canvas.drawColor(Color.BLACK); 背景を描くメソッドをrunの一番上に持ってくる。 その後にブロックやバー、ボール(モンスター)の描画メソッドを描く 基本事項 プログラムって絶対に上から下に処理していくので、背景描画処理などは最初に行う。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問