前提・実現したいこと
現在2Dアクションゲームを作成しています。
今は障害物となるブロックを表示するためにマップクラスを作っています。
2次元配列でブロック画像を配置しようとしてるのですが、その途中で詰まってしまったので、アドバイスをいただきたいです。
本に記載されているプログラムを参考にしながら作成しています。
そのプログラムでは、2次元配列のそれぞれの要素にblockオブジェクトを作成し、それぞれに乱数でtypeとして0か1の値を渡しています。typeが0の時はグレーの正方形、typeが1の時はブラックの正方形を表示します。
私が実現したいことは、このブラックの正方形の代わりにブロックの画像を表示させることです。
該当のソースコード
java
1/* 22次元配列を利用し、ランダムに黒、グレーの正方形を表示する 3(本に記載されていた元のプログラムです) 4*/ 5package com.example.test; 6 7import android.graphics.Bitmap; 8import android.graphics.Canvas; 9import android.graphics.Color; 10import android.graphics.Paint; 11import android.graphics.Rect; 12 13import java.util.Random; 14 15public class Map1 { 16 private final int blockSize; 17 private int horizontalBlockCount; 18 private int verticalBlockCount; 19 20 private final Block[][] blockArray; 21 22 public Map1(int width, int height, int blockSize){ 23 this.blockSize = blockSize; 24 this.horizontalBlockCount = width / blockSize; 25 this.verticalBlockCount = height / blockSize; 26 27 blockArray = createMap(0); 28 } 29 30 private Block[][] createMap(int seed){ 31 Random rand = new Random(seed); 32 33 Block[][] array = new Block[verticalBlockCount][horizontalBlockCount]; 34 35 for(int y=0; y < verticalBlockCount; y++){ 36 for(int x=0; x<horizontalBlockCount; x++){ 37 int type = rand.nextInt(2); 38 int left = x * blockSize + 1; 39 int top = y * blockSize + 1; 40 int right = left + blockSize - 2; 41 int bottom = top + blockSize - 2; 42 array[y][x] = new Block(type, left, top, right, bottom); 43 } 44 } 45 return array; 46 } 47 48 void draw (Canvas canvas){ 49 int yLength = blockArray.length; 50 for(int y = 0; y < yLength; y++){ 51 int xLength = blockArray[y].length; 52 for(int x= 0; x < xLength; x++){ 53 blockArray[y][x].draw(canvas); 54 } 55 } 56 } 57 58 static class Block{ 59 private static final int TYPE_FLOOR = 0; 60 private static final int TYPE_WALL = 1; 61 62 private static final int COLOR_FLOOR = Color.GRAY; 63 private static final int COLOR_WALL = Color.BLACK; 64 65 private final int type; 66 private final Paint paint; 67 68 final Rect rect; 69 70 private Block(int type, int left, int top, int right, int bottom){ 71 this.type= type; 72 paint = new Paint(); 73 74 75 switch(type){ 76 case TYPE_FLOOR: 77 paint.setColor(COLOR_FLOOR); 78 break; 79 case TYPE_WALL://この部分を黒の正方形ではなく、ブロック画像に変えたい 80 paint.setColor(COLOR_WALL); 81 break; 82 } 83 rect = new Rect(left, top, right, bottom); 84 } 85 86 private void draw(Canvas canvas){ 87 canvas.drawRect(rect,paint); 88 } 89 } 90 } 91
試したこと
以下のように、画像を読み込みtypeが1の時はcanvasに画像を追加するように変更しました。
しかし、画像は表示されず、黒のままでした。
java
1package com.example.test; 2 3import android.graphics.Bitmap; 4import android.graphics.Canvas; 5import android.graphics.Color; 6import android.graphics.Paint; 7import android.graphics.Rect; 8 9import java.util.Random; 10 11public class Map1 { 12 private final int blockSize; 13 private int horizontalBlockCount; 14 private int verticalBlockCount; 15 private static Bitmap blockBitmap;//追加 16 17 18 private final Block[][] blockArray; 19 20 public Map1(int width, int height, int blockSize, Bitmap blockBitmap){//変更 21 this.blockSize = blockSize; 22 this.horizontalBlockCount = width / blockSize; 23 this.verticalBlockCount = height / blockSize; 24 this.blockBitmap = blockBitmap; 25 26 blockArray = createMap(0); 27 } 28 29 private Block[][] createMap(int seed){ 30 Random rand = new Random(seed); 31 32 Block[][] array = new Block[verticalBlockCount][horizontalBlockCount]; 33 34 for(int y=0; y < verticalBlockCount; y++){ 35 for(int x=0; x<horizontalBlockCount; x++){ 36 int type = rand.nextInt(2); 37 int left = x * blockSize + 1; 38 int top = y * blockSize + 1; 39 int right = left + blockSize - 2; 40 int bottom = top + blockSize - 2; 41 array[y][x] = new Block(type, left, top, right, bottom); 42 } 43 } 44 return array; 45 } 46 47 void draw (Canvas canvas){ 48 int yLength = blockArray.length; 49 for(int y = 0; y < yLength; y++){ 50 int xLength = blockArray[y].length; 51 for(int x= 0; x < xLength; x++){ 52 blockArray[y][x].draw(canvas); 53 } 54 } 55 } 56 57 static class Block{ 58 private static final int TYPE_FLOOR = 0; 59 private static final int TYPE_WALL = 1; 60 61 private static final int COLOR_FLOOR = Color.GRAY; 62 private static final int COLOR_WALL = Color.BLACK; 63 64 private final int type; 65 private final Paint paint; 66 private final Canvas canvas; 67 68 final Rect rect; 69 70 private Block(int type, int left, int top, int right, int bottom){ 71 this.type= type; 72 paint = new Paint(); 73 canvas = new Canvas(); 74 75 76 switch(type){ 77 case TYPE_FLOOR: 78 paint.setColor(COLOR_FLOOR); 79 break; 80 case TYPE_WALL: 81 canvas.drawBitmap(blockBitmap,0,0, paint);//追加 82 break; 83 } 84 rect = new Rect(left, top, right, bottom); 85 } 86 87 private void draw(Canvas canvas){ 88 canvas.drawRect(rect,paint); 89 } 90 } 91 } 92
drawメソッドは変更していないため、ここの記述に問題があると考えているのですが、どのように変えたら良いかわかりません。
ご教授お願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/09 07:19
2019/06/09 11:47 編集
2019/06/09 12:00