コマを表現するクラスPieceと、コマを動かす準備のメソッドをつくったので、いよいよタップでコマを動かしていきます。
ソースコード
https://github.com/et79/Game15
本当は、タッチしてスライドさせて動かすのが自然だと思うので、ゆくゆくはそういう操作感にしたいと思いますが、とりあえず今は、動かせるコマをタップすると、開いてるセルにコマが動く、という処理にします。
画面タッチイベント
画面タッチイベントメソッドonTouchEvent
をオーバーライドしていきます。
// 画面タッチイベント
@Override
public boolean onTouchEvent(MotionEvent event){
int action = event.getAction();
// 今は、指が画面から離れたタイミングで処理をしています
if(( action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP)
{
// 枠内を触った場合
if( gridRect.contains(event.getX(), event.getY()) )
{
// 座標から位置Idx取得
int clickPosIdx = getPosIdx(new Point((int)event.getX(), (int)event.getY()));
// コマが動かせる場合
if( isPieceMoveAble(clickPosIdx) )
{
// 動かす対象のコマを、空白セルの場所に移動
pieces.get(clickPosIdx).setPosIdx(emptyPosIdx);
// 空白セルを、動かしたコマの位置に移動
pieces.get(emptyPosIdx).setPosIdx(clickPosIdx);
// 空白セルの位置Idxを更新
emptyPosIdx = clickPosIdx;
// 位置Idxとアレーの並びを合わせる
Collections.sort(pieces, new PieceComparator());
invalidate(); // 再描画
}
}
// 枠外をタッチ
else
{
// 今はシャッフル実行
shufflePieces();
invalidate(); // 再描画
}
}
return true;
}
これで、
- 枠内で動かせるコマをクリックすれば、移動
- 枠外をクリックで、コマをシャッフル
という動作が実装できました。
後は、描画するだけです。
OnDrawの拡張
まず、格子を書くのはやめました。狭い範囲に線が密集するのは、あまり素敵ではなかったので。
コマの描画は、piecesアレーの要素に順次アクセスし、それぞれのインスタンスに対してdrawPieceを呼ぶコトで実現します。
@Override
public void onDraw(Canvas canvas){
// ペイントの基本設定
paint.setAntiAlias(true); // 線が滑らかになる
paint.setStrokeWidth(0); // 線幅なし
paint.setStyle(Paint.Style.FILL); // 塗りつぶしあり
// 外枠
paint.setColor(Color.parseColor("#b7b7b7"));
canvas.drawRoundRect( gridRect, 10, 10, paint);
// コマ描画
boolean fNumAllOk = true; // 数字の並び順があっているか?
// コマに順次アクセス
for( int i = 0; i < pieces.size(); i++ )
{
// 空白セル以外を描画
if( pieces.get(i).numIdx != 15 )
pieces.get(i).drawPiece(canvas);
// 数字と並びがあっているか?
if( pieces.get(i).numIdx != i )
fNumAllOk = false;
}
// タイトル
paint.setColor(Color.parseColor("#38949d"));
int titleSize = 100;
String mess = "15 Game";
// すべて順番に並んだら、"Done!!"を表示する
if( !isInit & fNumAllOk ) mess += " Done!!";
paint.setTextSize(titleSize);
// タイトルを書く
canvas.drawText(
mess,
gridOrg.x,
gridOrg.y - titleSize / 2,
paint );
isInit = false;
}
意外と、シンプルになりました。これで、GitHubにあるのと大体同じ状態です。よしよし。
次は、
- USBデバック環境を使った、実機でのテスト
- キャンバスサイズへのフィッティング
- 時間の計測
- 音対応
- 広告をつける
なんかをやって、最後にGoogle Playにアップロードしたら、ひとまずおしまいですね。もう少し、頑張ります。
コメント