2015/06/27

旅に出ます

日本国内ですが、本当に旅に出ます。
1週間ぐらいですが、その間、更新が止まると思います。

ちょっとリフレッシュと言うことで…

2015/06/26

繋がり判定(1)

HexaDropsで繋がりを判定するには、隣接する配列が同じ値かを確認していきます。
言うだけなら簡単ですが、実際には手間がかかります。

配列は2次元配列で画面のサイズと同一ですが、見た目上は半分ずれている状態です。
見た目がずれているだけで、配列上はやはり隣接しています。
下のような感じです。
例えば、(X:0,Y:0)の部分は表示位置としては同じような感じとなりますが、
(X:1,Y:0)の部分は表示上は半分ずれた状態となります。

隣接判定としては、(0,0)と(1,0)は表示上も隣接していることになりますので、
これが同じかどうかで判断できます。
上下に対してはズレがありませんので、こちらはそのまま(0:1)が同じ色なのかで判定できます。

今度は(1,0)の場合で考えてみます。
上下はズレがないので問題ありません。
左右は…ズレていますので、隣接判定は (0,0)、(2,0)、(0,1)、(2,1)の4箇所となります。
(1,0)の部分で考えた場合には合計6箇所ですが、同じ色と判定された箇所があった場合には、
更にその部分から隣接判定を行う必要があります。
同じような隣接判定ですので、隣接判定から隣接判定を呼び出すと上手くいきそうです。
これは再帰呼び出しを行うとできそうだと判断できます。

続きは、次回に…





Drops → HexaDrops

Dropsは四角形キャラクタで、縦・横・斜めに3つ以上並ぶと消えるコラムス型パズルゲームでした。

このキャラクタを六角形にしたものがHexaDropsになります。

六角形にした場合、横に3つ以上並ぶと消えるという場合には見難く直感的に並んだというのがわかりません。
ですので、HexaDropsでは、辺で3つ以上繋がった場合には消えるというルールに変更しました。
こうすると、繋がった判定はDropsのままでは使用できません。

繋がる先としては、上下と斜め方向になります。
Dropsと比較した場合には横方向がなくなりますので、一見すると楽になるように感じるかもしれません。


(画面は開発中のもので、Dropsの背景を使用しているのでずれて表示されています)

上記の画面では、一番下段の青3つが繋がっているように判定されるべきでしょう。
この時、3つが繋がると消えるでは、簡単に3つ繋げることができるので、
繋がったら消えるときの数も調整する必要があります。

これが、ゲームの難易度に直結します。

また、ゲーム画面では半分ずれて表示されています。
しかし配列で0.5というのはありません。
配列の数を倍にすると整数で扱うこともできますが、半分の配列が未使用状態になります。

考え方が古いので、こんな無駄は勿体無くて許せません。

偶数と奇数で表示位置をずらせば無駄にはなりませんが、今度は繋がる判定が面倒になるでしょう。

どうやって判定するのかは、次回に…

キャラクタの表示

Dropsのキャラクタは四角ですので、全角文字の四角(■)で終わらせることもできなくはありませんが、
グラデーションを付けたりするには、絵を作って表示させる必要があります。

絵を作るにはWindowsのペイントでもいいのですが、きれいなグラデーションを付けるのは結構苦労します。

GIMPを使うと簡単にグラデーションを付けた四角を作れますので、
これで作ってみましょう。

GIMPを起動して 46x46 サイズの画像を作成し、全範囲を選択して、ブレンドによりグラデーションの四角を作成します。(作ったものは、選択範囲の「角を丸める」により丸めています)



この画像をエクスポートにより、PNGファイルで保存します。
保存場所は プロジェクトの中の、以下のフォルダにすると、後々作業が行いやすくなります。
   \app\src\main\res\drawable

プログラムからこの画像を呼び出すために、以下の様な関数を作成しておきます。


public Bitmap read(Context context , String name)
{
    int ID = context.getResources().getIdentifier(name , "drawable" , context.getPackageName());
    return BitmapFactory.decodeResource(context.getResources(), ID);
}
 
これで、MainActivityから

private Bitmap char_bmp;
char_bmp = read(this , 画像ファイル名);

char_bmpに画像ファイルの内容が読み込まれます。
画像ファイル名で指定している部分は、拡張子を指定しません。
(例:画像ファイルがfile.pngの場合には、 "file" とだけ指定します)

これで、キャラクタの読み込みは終わりましたので、
表示するときには drawBitmap により表示できることとなります。

2015/06/23

miwについて

ランキングサーバ作成で使用した miw というファイラーですが、
結構全角文字を使用している部分が多くて、途中であっさりと挫折してしまいました。
(ソースを見るのが久々で、ソースを追えなくなっているのも大きいですが…)

C言語って、あんなに面倒だったっけ?

ビット演算、シフト演算、三項式を使いまくる使いまくる。

でも、defineはCの方がいいなぁとか思ったり…
こんなのとか…
#define     StrCpy(__TO , __FROM)   \
            {\
                char *__CP1 , *__CP2;\
                __CP1 = (char *)__TO;\
                __CP2 = (char *)__FROM;\
                while ((*__CP1++ = *__CP2++) != '\0') ;\
            }
こんなのとか…
#ifdef Debug
#define DebugPrint fprintf
#else
#define DebugPrint
#endif