LoginSignup
2
1

More than 5 years have passed since last update.

Android Studio で将棋もどき作ってみる(描画についてざっくり)

Posted at

初めに

現在進行形で作ってます、
最終目標はBluetoothを使って二人で対戦を考えてます。

きっかけ

私事ですが今ファイアー*ムブレムにハマってまして、それがどんな処理になっているんだろう?作ってみたい!
と思い作り始めました。

動作環境

android 6.0 以上 ムズカシイ仕組みは使っていないので動くはず。

基本設計

SurfaceViewを継承してGameViewを作成してます、主に(メインループや描画などはDixqさんのAndroidの館の「ゲーム イライラ棒アプリ作成」を参考にさせて頂いてます)
処理ごとにファイルを分けて書いてるのでデバッグがラクです。

配置されたユニットの描画について

あまりこういった戦略ゲーム(マスのユニットを進めていくゲーム)の製作記事がないので大変でした。
自軍ユニットはPlayerPieceList(ArrayList)を使用して管理、そのインデックスをcharMap[][]に代入してイベントが発生したらcharMap[][]をもとにPlayerPieceListを参照するようにしてます、
敵軍ユニットは別にEnemyPieceList(ArrayList)を、用意してそのときに敵軍はインデックス + 200charMap[][]に代入して区別するようにしてます。

さらに職種に応じた画像を出すためにJobMap[][]を用意して職種に応じた値を代入してます。
描画時にそれを参照して職種に合わせた画像を表示させます。

BtlCtrlにPlayerPieceList、EnemyPieceListが入ってます
一部抜粋

DrawPiece.java
@Override
    public void OnDraw(Canvas c) {
        int x, y;

        cnt++;
        //jobMapをもとにキャラを描画する
        for (x = 0; x < Map.Inst().mapSizeX; x++) {
            for (y = 0; y < Map.Inst().mapSizeY; y++) {

                //jobMapをもとにキャラを描画
                if (Map.Inst().charMap[x][y] >= 200) { //200より大きければ敵
                    if (Map.Inst().jobMap[x][y] == 1) { //敵剣士
                        //if(BtlCtrl.Inst().PlayerPieceList.get(Map.Inst().charMap[x][y])
                        //c.drawBitmap(image.enemySword[BtlCtrl.Inst().EnemyPieceList.get(Map.Inst().charMap[x][y] - 1 - 200).heading], image.rowSize * x, image.rowSize * y, paint);
                        if (cnt < 30) {
                            EnemyDraw(image.enemySword, x, y, 0, c, paint);
                        } else if (cnt < 60) {
                            EnemyDraw(image.enemySword, x, y, 1, c, paint);
                        } else {
                            EnemyDraw(image.enemySword, x, y, 0, c, paint);
                            cnt = 0;
                        }

public void EnemyDraw(Bitmap img[], int posX, int posY, int leg, Canvas c, Paint p){
            if(leg == 1){
                c.drawBitmap(img[BtlCtrl.Inst().EnemyPieceList.get(Map.Inst().charMap[posX][posY] - 200).heading + 1], (image.rowSize * posX) + Global.Inst().mapScrollX, (image.rowSize * posY) + Global.Inst().mapScrollY, p);
            }else{
                c.drawBitmap(img[BtlCtrl.Inst().EnemyPieceList.get(Map.Inst().charMap[posX][posY] - 200).heading - 1], (image.rowSize * posX) + Global.Inst().mapScrollX, (image.rowSize * posY) + Global.Inst().mapScrollY, p);

            }
        }


EnemyDrawのインデントがずれてしまった。。。

スクリーンショット

Screenshot_20180926-101725.jpg
表示されているメニューについても次回書こうと思ってます。

引っかかったところ

Androidではdpiの関係で画像を自動で拡大縮小するみたいで64*64ピクセルの画像を用意してもAndroid上では変わってしまうので必要な時に.GetWidthで画像サイズを取得して解決しました。

参考にさせて頂いたサイト

Androidの館「ゲーム イライラ棒アプリ作成」

終わりに

ぼちぼちLightning Talksっぽく書いていこうと思います。
下手な文章ですが最後まで読んでいただきありがとうございます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1