迷路を右手法で攻略する(3) キャラクターを動かす

キャラクターを動かす前に、通路をブロック塀に変更してみましょう。20 × 20 ピクセルのブロックを用意しました。

これを block.jpg として data フォルダに保存しておきます。setup() の中で以下の1行を加えます。

E[1] = loadImage("block.jpg");

次に、main() の中の以下の2行をimage関数で置き換えます。

fill(0);
rect(i*20, j*20, 20, 20);
 ↓ 書き換え
image(E[1], i*20, j*20); 

これで以下のように壁がブロックに変わりました。少し迷路っぽくなったでしょうか。画像は後ほど追加していきましょう。

ではキャラクターを動かしてみましょう。手始めに、キャラクターが自分で方向を決め移動できるようにしてみます。
上下左右の4方向をランダムで決め、時計回りに、上(0)、右(1)、下(2)、左(3) に動くようにします。
この時、例えば右に動きたい時に右にブロックがあると動けませんので、右にブロックがないかを確かめます。現在のマスから見て右側は、 X が1多いことになりますので、map上ではmap[Y][X+1] と表すことができます。通行できる場合は値が 0 になっていますので、もし右側が0かを調べたい場合は if (map[Y][X+1] == 0) となります。
これまで書いていた image(E[0], 20, 20); を以下に書き換えます。方向を保存する dir という新しい変数を作成しています。
なお、random(4) とは、0 から 4 未満の値をランダムに作ります。ここで生成される値は float型 といって、少数の形です。今回は整数が必要なので、int(~) と囲むことで整数の int型 に変換しています。

image(E[0], 20, 20);
 ↓ 書き換え
int dir = int(random(4));
if ((dir == 0) && (map[Y-1][X] == 0))  Y--;
else if ((dir == 1) && (map[Y][X+1] == 0))  X++;
else if ((dir == 2) && (map[Y+1][X] == 0))  Y++;
else if ((dir == 3) && (map[Y][X-1] == 0))  X--;
image(E[0], X*20, Y*20);

すると、ふらふらと動き始めます。スピードが速すぎたら、setup() の中に例えば frameRate(12); などとしてフレームレートを下げておきます。デフォルトでは60fps(フレーム/秒)です。

Leave a Reply

Your email address will not be published. Required fields are marked *