2015/09/11

図形の描画

Androidで四角形を描画する場合には、drawRect(Rect rect , Paint paint)を使用するのですが、
Rectを設定・渡すのが面倒です。

そこで、drawRect(int x , int , y , int w , int h)のような関数を作成して、
比較的容易に四角形を書けるようにします。

public class drawObj
{
    private Paint           paint;

    public drawObj()
    {
        paint = new Paint();
    }

    public void drawRect(Canvas canvas , int x , int y , int w , int h , int col)
    {
        Rect rect = new Rect(x , y , x + w , y + h);
        if (canvas != null)
        {
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(col);
            canvas.drawRect(rect , paint);
        }
    }

}




最後の引数に色を指定できるようにすると、関数を呼び出すだけで色のついた四角形を表示することができます。

同じように、関数を用意して円を描くようにします。



    public void drawCircleFill(Canvas canvas , int x , int y , int w , int col)
    {
        if (canvas != null)
        {
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(col);
            canvas.drawCircle((float)x , (float)y , (float) w, paint);
        }
    }

今回のiReversiでは、デバッグの段階で配列を文字列で表示させて動作確認を行い、
四角形と円を書いて表示された状態での動作確認、石をイメージで作成してアニメーションさせる…
と言った手順を踏んでいました。

これらの関数は他でも使い回しが効きますので、このままプロジェクトに保存しておきます。
こうやって、段々とプロジェクトが肥大化していくわけです…


2015/09/07

Androidのsleep

ゲームのアプリを作る時には、アニメーションさせることが多々あります。
例えば、 / → | → \ → | → / を連続的に表示させると
棒が回転しているように見えます。
これが、アニメーションの基本です。

こんなことはご存知だと思いますが、ただ単にアニメーションさせると
早すぎて回転しているように見えず、縦棒(|)だけが見えるかもしれません。
縦棒が他のものに比べて表示が多いため、そのようにみえる可能性があります。

これを防ぐために、100ms(0.1秒)とか200ms(0.2秒)の間、処理を停止させると
綺麗に棒が回転しているようにみえるのですが、
処理を停止させるためにsleep命令を使用します。

ただし、AndroidのSleep命令では、処理停止中に割り込み処理が発生した場合に
sleep命令から例外が発生してしまうため、try{} によりsleepを囲む必要があります。

    try
    {
        Thread.sleep(100);
    }
    catch (Exception ex)
    {
    }

ただ、毎回毎回これを書くのは面倒ですから、関数化しておいたほうが楽になります

    public static void Sleep(int msec)
    {
        try
        {
            Thread.sleep(msec);
        }
        catch (Exception ex)
        {
        }
    }

こうしておけば、呼び出しも楽になります。
こういう小さいことでも関数化しておくと後で役に立つことがあります。
今回のiReversiでも、挟まれた石の反転を行う際など、様々な場面でSleep()として呼び出しています。