Block崩し block配列でSurfaceViewに描画されない
- 評価
- クリップ 0
- VIEW 1,201
SurfaceViewとcanvasを用いてブロック崩しをandroidにて作っています。
Blockクラスを作り、その配列を作成しています。
縦に10段で、横は画面サイズによって描画できる個数を変えようとしています。(ここがおかしいのかも)
若干冗長になってますが、forループで配列のインスタンスを作成(場所があってる?)、その後forループで描画しています。
アプリの実行をするとエラーが出ていませんが、ブロックが表示されません。
デバッグモードで実行し、下記forループ部分にブレイクポイントを設置すると、なぜかそこに進まなくなってしまっています。
それが原因で描画されていないのかな?と思います。
forループの部分
・Blockをnewしている部分と
・Blockを描画している部分
になぜかデバッグが進まない。
描画が正しくされない原因はなんでしょうか。
ご回答いただけますと幸いです。
package com.example.canvastest;
ーーー略ーーー
public class MainActivity extends AppCompatActivity {
class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
// スレッドクラス
Thread mainLoop = null;
// 描画用
Paint paint = null;
Paint paint2 = null;
Paint paint3 = null;
// 円のX,Y座標
private int circle2X = getWidth()/2;
private int circle2Y = getHeight()/10*4;
// 円の移動量
private int circle2Vx = 8;
private int circle2Vy = 15;
Block[] block,block2,block3,block4,block5,block6,block7,block8,block9,block10;
Bar bar;
int blockWidth = 40;//ブロックの半分の横の長さ
int blockHeight = 10;//ブロックの半分の高さ
int view_w, view_h; //画面サイズ
Resources res = this.getContext().getResources();
Bitmap sraimKing = BitmapFactory.decodeResource(res, R.drawable.sraim_king);
int margin =5;
int num =(view_w - 32 + margin)/(blockWidth*2 + margin);//横ブロックの個数. 端のmargin 16*2 margin一個足りないので足す。
int allNum = num * 10;//ブロック総個数
//コンストラクタ
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);
block = new Block[num];//配列の初期化
block2 = new Block[num];
block3 = new Block[num];
block4 = new Block[num];
block5 = new Block[num];
block6 = new Block[num];
block7 = new Block[num];
block8 = new Block[num];
block9 = new Block[num];
block10 = new Block[num];
for(int i = 0;i< num ;i++ )
{
block[i] = new Block(view_w/num + (blockWidth*2+ margin)*i, view_h/10);//x座標はブロックの半分*2+マージン分ずらす
block2[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin));
block3[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*2);
block4[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*3);
block5[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*4);
block6[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*5);
block7[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*6);
block8[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*7);
block9[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*8);
block10[i] = new Block (view_w/num + (blockWidth*2+ margin)*i, view_h/10 + (blockHeight*2 + margin)*9);
}
}
ーーー略ーーー
// SurfaceView生成時に呼び出されるメソッド。
@Override
public void surfaceCreated(SurfaceHolder holder) {
// スレッド開始
mainLoop = new Thread(this);
mainLoop.start();
// 背景
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.BLACK);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO 今回は何もしない。
}
@Override
public void run(){
while (true) {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null)
{
canvas.drawColor(Color.BLACK);
view_h = canvas.getHeight();
view_w = canvas.getWidth();
// バーを生成 view_w/2画面の半分
bar = new Bar( view_w/2 , view_h - 100 );
//ブロックの一つずつ初期化 y座標が異なるので、横画面いっぱいになったら下段に映る
// 円1を描画する
//canvas.drawCircle(circleX, circleY, 60, paint);
//円2を描画する
//canvas.drawCircle(circle2X,circle2Y,60,paint2);
canvas.drawBitmap(sraimKing,circle2X,circle2Y,paint2);
//長方形を描画する left top right bottom
canvas.drawRect( bar.x -100 , bar.y , bar.x + 100 , bar.y + 20 , paint3);
//ブロックの描画
for(int i = 0;i<num;i++)
{
Log.d("block.x","blockのx座標"+block[i].x);
Log.d("block.y","blockのy座標"+block[i].y);
canvas.drawRect(block[i].x -blockWidth,block[i].y -blockHeight, block[i].x +blockWidth, block[i].y + blockHeight, paint3);
canvas.drawRect(block2[i].x -blockWidth,block2[i].y -blockHeight, block2[i].x +blockWidth, block2[i].y + blockHeight, paint3);
canvas.drawRect(block3[i].x -blockWidth,block3[i].y -blockHeight, block3[i].x +blockWidth, block3[i].y + blockHeight, paint3);
canvas.drawRect(block4[i].x -blockWidth,block4[i].y -blockHeight, block4[i].x +blockWidth, block4[i].y + blockHeight, paint3);
canvas.drawRect(block5[i].x -blockWidth,block5[i].y -blockHeight, block5[i].x +blockWidth, block5[i].y + blockHeight, paint3);
canvas.drawRect(block6[i].x -blockWidth,block6[i].y -blockHeight, block6[i].x +blockWidth, block6[i].y + blockHeight, paint3);
canvas.drawRect(block7[i].x -blockWidth,block7[i].y -blockHeight, block7[i].x +blockWidth, block7[i].y + blockHeight, paint3);
canvas.drawRect(block8[i].x -blockWidth,block8[i].y -blockHeight, block8[i].x +blockWidth, block8[i].y + blockHeight, paint3);
canvas.drawRect(block9[i].x -blockWidth,block9[i].y -blockHeight, block9[i].x +blockWidth, block9[i].y + blockHeight, paint3);
canvas.drawRect(block10[i].x -blockWidth,block10[i].y -blockHeight, block10[i].x +blockWidth, block10[i].y + blockHeight, paint3);
}
// 円の座標を移動させる
circle2X += circle2Vx;
circle2Y += circle2Vy;
// 画面の領域を超えた?
if (circle2X < 0 || getWidth() < circle2X) circle2Vx *= -1;
if (circle2Y < 0 || getHeight() < circle2Y) circle2Vy *= -1;
getHolder().unlockCanvasAndPost(canvas);
}
}
}
}
}
public class Block {
//int arrayX[]; // ブロックのx座標
//int arrayY[]; // ブロックのy座標
float x;
float y;
//コンストラクタ
public Block (int _x,int _y){
this.x = (float)_x;
this.y = (float)_y;
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
view_hとかview_wはfor文の時点では0じゃないですか?
numが0ならfor文内の処理は実行されません。
デバッグ実行を行う際はどこの処理をたどっているかを確認するだけではなく、各値が自分の想定している値になっているかまで確認すべきです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
// ディスプレイのインスタンス生成
Display disp = wm.getDefaultDisplay();
Point size = new Point();
disp.getSize(size);
view_w =size.x;
view_h =size.y;
int num =(view_w - 32 + margin)/(blockWidth*2 + margin);
numの位置を、view_w view_hの後にし、view_w view_hにきちんと値を取得したものを入れた。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/28 18:21
ありがとうございます。