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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

2889閲覧

canvasで画像を表示する

entd270

総合スコア19

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2019/06/07 00:38

前提・実現したいこと

現在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メソッドは変更していないため、ここの記述に問題があると考えているのですが、どのように変えたら良いかわかりません。
ご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Block の表示は draw メソッドによって行われています.
draw メソッド内におきまして, type により drawRect か drawBitmap かを切り替えればよいのではないでしょうか.

投稿2019/06/09 06:46

jimbe

総合スコア12632

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

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

entd270

2019/06/09 07:19

ご回答ありがとうございます。 drawメソッド内を以下のように変更しました。 private void draw(Canvas canvas){ switch(type){ case TYPE_FLOOR: canvas.drawRect(rect,paint); break; case TYPE_WALL: canvas.drawBitmap(blockBitmap,0,0, paint); break; } } しかし、2次元の配列とは無関係に、画面の(0,0)の座標にブロック画像が1つ表示されるだけでした。 Blockクラス内でもcanvasに対してdrawBitmapしているので、その辺りが間違っていると思うのですが、いかがでしょうか。
jimbe

2019/06/09 11:47 編集

drawBitmap のドキュメントをお読みになっていらっしゃいますか. 各引数にはちゃんと意味があります. テキトウに書けば動作もテキトウになります. 座標に 0,0 を指定すれば画像を 0,0 に表示するのは仕様通りです. 元の正方形はなぜきちんと指定座標に表示されたのでしょうか. drawRect のドキュメントには正方形の座標の指定の仕方が書かれています. その為に Block のコンストラクタで準備もしています. それらを流用して drawBitmap の座標の指定にする必要があるのではないでしょうか. 先に追加された Block のコンストラクタ内の drawBitmap は何の意味もありませんので, 削除されたほうが安全かと思います. コンストラクタ内で生成している Canvas は draw メソッドの引数の Canvas とは無関係で, 表示になんの影響もありません.
entd270

2019/06/09 12:00

ご回答ありがとうございます。 勝手に、それぞれのブロックの(0,0)座標が支点になると思い込んでしまっていました。 ご指摘の通り、下のようにleftとtopを支点にしたところ思い通りに表示されました。本当に助かりました。おっしゃる通り、ドキュメントはあまり読んだことがなく、適当に書いてしまっていたので、今後は読もうと思います。 private Block(int type, int left, int top, int right, int bottom){ this.type= type; paint = new Paint(); this.left = left; this.top = top; switch(type){ case TYPE_FLOOR: paint.setColor(COLOR_FLOOR); break; } rect = new Rect(left, top, right, bottom); } private void draw(Canvas canvas){ switch(type){ case TYPE_FLOOR: canvas.drawRect(rect,paint); break; case TYPE_WALL: canvas.drawBitmap(blockBitmap,left,top, paint); break; } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問