Androidアプリ開発の5回目です。
今回はキャラの落下を実装していきます。
- 使用言語 java
- 開発ツール AndroidStudio
変更点
- Mapクラスに画面サイズ保持用のメンバ変数を追加(MainChar参照用)
- MainCharクラスのgetCharPointメソッドの処理を追加
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 viewX; //画面の横サイズ
private float viewY; //画面の縦サイズ
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;
this.viewX = viewX;
this.viewY = viewY;
dotX = viewX / COLUMNCOUNT;
dotY = viewY / ROWCOUNT;
paint = new Paint();
paint.setColor(Color.GREEN);
//MainCharクラスのインスタンス生成(初期設定値)
mainChar = new MainChar(this);
}
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(xx); //キャラの位置取得
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 getViewX() {
return viewX;
}
public void setViewX(float viewX) {
this.viewX = viewX;
}
public float getViewY() {
return viewY;
}
public void setViewY(float viewY) {
this.viewY = viewY;
}
public float getDotX() {
return dotX;
}
public void setDotX(float dotX) {
this.dotX = dotX;
}
public float getDotY() {
return dotY;
}
public void setDotY(float dotY) {
this.dotY = dotY;
}
public Stage getStage() {
return stage;
}
public void setStage(Stage stage) {
this.stage = stage;
}
public Paint getPaint() {
return paint;
}
public void setPaint(Paint paint) {
this.paint = paint;
}
public MainChar getMainChar() {
return mainChar;
}
public void setMainChar(MainChar mainChar) {
this.mainChar = mainChar;
}
public int getXx() {
return xx;
}
public void setXx(int xx) {
this.xx = xx;
}
public int getXxPlus() {
return xxPlus;
}
public void setXxPlus(int xxPlus) {
this.xxPlus = xxPlus;
}
public int[][] getMap() {
return map;
}
public void setMap(int[][] map) {
this.map = 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; //キャラの色
private int fallVel; //落下速度
Map map;
//コンストラクタ
public MainChar(Map map){
x = map.getViewX() / 2; //キャラ初期位置設定
y = map.getViewY() / 2; //キャラ初期位置設定
sizeX = map.getDotX() / 2; //キャラ初期サイズ設定
sizeY = map.getDotY() * 2; //キャラ初期サイズ設定
paint = new Paint();
paint.setColor(Color.RED); //キャラの色設定
this.map = map;
}
//キャラの位置を更新して衝突判定後に現在位置を戻す
float[] getCharPoint(int xx){
//現在位置からmap配列の要素番号の割り出し
int indexX = (int)(x / map.getDotX());
int indexY = (int)((y + sizeY) / map.getDotY());
if(map.getMap()[indexY][indexX + xx] == 0){
fallVel++;
y = y + fallVel;
}
float[] point = {x,y};
return point;
}
//以下getter setter
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;
}
}
これでキャラが自然落下するようになり、地面に衝突すると止まるようになります。
次回は上下左右で衝突判定が起こるように展開します。



コメント