Androidアプリ開発の4回目です。
今回はマップの広さに合わせて移動可能範囲を制限していきます。
これは条件式を1つ追加すればいいだけです。
- 使用言語 java
- 開発ツール AndroidStudio
変更点
- Mapクラスに移動制限用の条件分岐を追加
前回drawメソッドの中に追記した、横移動用の加算式に条件式を適用します。
package com.example.dbd.daybyday; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; public class Map { private final int ROWCOUNT = 20; //縦表示ドット数 private final int COLUMNCOUNT = 10; //横表示ドット数 private float dotX; //1ドットの横幅 private float dotY; //1ドットの縦幅 private Stage stage; //描画用にstageクラスの参照保持 private Paint paint; //色保持用 int xx; //横位置保持用 int xxPlus; //変数xx加算用 //表示マップの2次元配列 private int[][] map = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; //コンストラクタ //画面サイズを引数で受け取り、ドットサイズを設定 public Map(float viewX, float viewY,Stage stage){ this.stage = stage; dotX = viewX / COLUMNCOUNT; dotY = viewY / ROWCOUNT; paint = new Paint(); paint.setColor(Color.GREEN); } public void draw(){ while(true) { if(xx + xxPlus <= map[0].length - COLUMNCOUNT && xx + xxPlus >= 0) { //加算後の値がマップの範囲を超えなければ xx += xxPlus; //横移動 } Canvas canvas = stage.holder.lockCanvas(); //画面をロックして canvas.drawColor(Color.WHITE); //画面をクリア //描画ドット数繰り返す for (int y = 0; y < ROWCOUNT; y++) { for (int x = 0; x < COLUMNCOUNT; x++) { switch (map[y][x + xx]) { //xxが描画開始インデックスを調整 case 1: //配列の値が1の場合は float drawX = x * dotX; //描画開始位置のX座標を設定 float drawY = y * dotY; //描画開始位置の座標を設定 canvas.drawRect(drawX, drawY, drawX + dotX, drawY + dotY, paint); break; } } } stage.holder.unlockCanvasAndPost(canvas); //画面に変更反映 } } //以下はゲッター public int getROWCOUNT() { return ROWCOUNT; } public int getCOLUMNCOUNT() { return COLUMNCOUNT; } public float getDotX() { return dotX; } public float getDotY() { return dotY; } public int[][] getMap() { return map; } }
これでマップの端まで移動すると止まるようになりました。
次はいよいよキャラ移動を作成していきます。
そのための布石としてMainCharクラスを作成しておきます。
変更点
- MainCharクラスを作成
- キャラの初期位置と初期サイズを設定
- drawメソッドにキャラ描画処理を追加
package com.example.dbd.daybyday; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; public class Map { private final int ROWCOUNT = 20; //縦表示ドット数 private final int COLUMNCOUNT = 10; //横表示ドット数 private float dotX; //1ドットの横幅 private float dotY; //1ドットの縦幅 private Stage stage; //描画用にstageクラスの参照保持 private Paint paint; //色保持用 private MainChar mainChar; //キャラ描画用データ参照用 int xx; //横位置保持用 int xxPlus; //変数xx加算用 //表示マップの2次元配列 private int[][] map = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; //コンストラクタ //画面サイズを引数で受け取り、ドットサイズを設定 public Map(float viewX, float viewY,Stage stage){ this.stage = stage; dotX = viewX / COLUMNCOUNT; dotY = viewY / ROWCOUNT; paint = new Paint(); paint.setColor(Color.GREEN); //MainCharクラスのインスタンス生成(初期設定値) mainChar = new MainChar(viewX,viewY,dotX,dotY); } public void draw(){ while(true) { if(xx + xxPlus <= map[0].length - COLUMNCOUNT && xx + xxPlus >= 0) { //加算後の値がマップの範囲を超えなければ xx += xxPlus; //横移動 } Canvas canvas = stage.holder.lockCanvas(); //画面をロックして canvas.drawColor(Color.WHITE); //画面をクリア //描画ドット数繰り返す for (int y = 0; y < ROWCOUNT; y++) { for (int x = 0; x < COLUMNCOUNT; x++) { switch (map[y][x + xx]) { //xxが描画開始インデックスを調整 case 1: //配列の値が1の場合は float drawX = x * dotX; //描画開始位置のX座標を設定 float drawY = y * dotY; //描画開始位置の座標を設定 canvas.drawRect(drawX, drawY, drawX + dotX, drawY + dotY, paint); break; } } } float[] charPoint = mainChar.getCharPoint(); //キャラの位置取得 canvas.drawRect(charPoint[0],charPoint[1],charPoint[0] + mainChar.getSizeX(), charPoint[1] + mainChar.getSizeY(), mainChar.getPaint()); //キャラ描画 stage.holder.unlockCanvasAndPost(canvas); //画面に変更反映 } } //以下はゲッター public int getROWCOUNT() { return ROWCOUNT; } public int getCOLUMNCOUNT() { return COLUMNCOUNT; } public float getDotX() { return dotX; } public float getDotY() { return dotY; } public int[][] getMap() { return map; } }
package com.example.dbd.daybyday; import android.graphics.Color; import android.graphics.Paint; /** * Created by isechi on 2017/09/02. */ public class MainChar { private float x; //キャラ横位置 private float y; //キャラ縦位置 private float sizeX; //キャラ横サイズ private float sizeY; //キャラ縦サイズ private Paint paint; //キャラの色 //コンストラクタ public MainChar(float viewX, float viewY, float dotX, float dotY){ x = viewX / 2; //キャラ初期位置設定 y = viewY / 2; //キャラ初期位置設定 sizeX = dotX / 2; //キャラ初期サイズ設定 sizeY = dotY * 2; //キャラ初期サイズ設定 paint = new Paint(); paint.setColor(Color.RED); //キャラの色設定 } //以下getter setter float[] getCharPoint(){ float[] point = {x,y}; return point; } public float getX() { return x; } public void setX(float x) { this.x = x; } public float getY() { return y; } public void setY(float y) { this.y = y; } public float getSizeX() { return sizeX; } public void setSizeX(float sizeX) { this.sizeX = sizeX; } public float getSizeY() { return sizeY; } public void setSizeY(float sizeY) { this.sizeY = sizeY; } public Paint getPaint() { return paint; } public void setPaint(Paint paint) { this.paint = paint; } }
これで画面の中央にキャラ描画ができます。
次回はキャラの移動や重力適用を実装していきます。
コメント