トップへ
敵を作る
今回作る敵は次のような動きにします
地上を歩く
進行方向に壁(自分と同じ高さのブロック)があると引き返す
進行方向に床(自分の足元にあるブロック)がなくなっても引き返す
メニューの「オブジェクト」>「新規」選び、次のように入力します。

リソースキットから、Enemy1.bmpを追加します。
自機を作るを参考に、キャラクタパターンを設定します。

まず、次の2つの動きを作成します
地上を歩く
進行方向に壁(自分と同じ高さのブロック)があると引き返す
とりあえず
進行方向に床(自分の足元にあるブロック)がなくなっても引き返す
という処理はまだしなくていいように、壁と壁の間に敵を配置します。
このような地形がない場合、マップを作るを参考に壁を置いてください

敵オブジェクトをダブルクリックして次のように入力します。
extends SpriteChar;
vx=2; // 進行方向
while (1) {
if ($map.getAt(x+vx,y)==$pat_Block+0) { // 進行方向のマップパターンを調べ、ブロックのパターンだったら
updateEx(30); // 30フレーム待機
vx=-vx; // 進行方向を反転する
}
x+=vx; // 進行方向へ進む
update();
}
実行すると、敵が壁の間を往復します。
updateEx(n) は、nで指定されたフレーム数だけ待機するメソッドです。
向きを変える
自機と同様、進行方向に応じて向きを変えるには、変数fを使って次のようにします
extends SpriteChar;
vx=2; // 進行方向
while (1) {
if ($map.getAt(x+vx,y)==$pat_Block+0) { // 進行方向のマップパターンを調べ、ブロックのパターンだったら
updateEx(30); // 30フレーム待機
vx=-vx; // 進行方向を反転する
}
x+=vx; // 進行方向へ進む
if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転
update();
}
アニメーションをつける
自機のアニメーションを作ると同様、敵にもアニメーションをつけます。
extends SpriteChar;
vx=2; // 進行方向
a=newAnimation(); // AnimationAdapterを作成
a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
while (1) {
if ($map.getAt(x+vx,y)==$pat_Block+0) { // 進行方向のマップパターンを調べ、ブロックのパターンだったら
updateEx(30); // 30フレーム待機
vx=-vx; // 進行方向を反転する
}
x+=vx; // 進行方向へ進む
if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転
update();
}
これを実行すると、確かに敵のパターンが交互に表示されるのですが、壁に当たって止まっている間もアニメーションをしてしまいます。
待機中はアニメーションをしないようにするには、次のようにします。
extends SpriteChar;
vx=2; // 進行方向
a=newAnimation(); // AnimationAdapterを作成
a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
while (1) {
if ($map.getAt(x+vx,y)==$pat_Block+0) { // 進行方向のマップパターンを調べ、ブロックのパターンだったら
a.pause(); // 待機前にアニメーションを止める
updateEx(30); // 30フレーム待機
a.resume(); // 待機後にアニメーション再開
vx=-vx; // 進行方向を反転する
}
x+=vx; // 進行方向へ進む
if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転
update();
}
進行方向に床(自分の足元にあるブロック)がなくなっても引き返す
最後にこの処理を追加します。進行方向の斜め下を調べ、そこがブロックのパターンでなかったら引き返すようにすればよいので、次のようにします。
extends SpriteChar;
vx=2; // 進行方向
a=newAnimation(); // AnimationAdapterを作成
a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
while (1) {
if ($map.getAt(x+vx,y)==$pat_Block+0 || $map.getAt(x+vx,y+32)!=$pat_Block+0 ) {
// 進行方向のマップパターンがブロック、または斜め下がブロックでなかったら
a.pause(); // 待機前にアニメーションを止める
updateEx(30); // 30フレーム待機
a.resume(); // 待機後にアニメーション再開
vx=-vx; // 進行方向を反転する
}
x+=vx; // 進行方向へ進む
if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転
update();
}
敵を別の場所においてテストします。今度は両側が壁になっていないところに起きます。
まず敵を選択し、右クリックして「コピー」を選びます。

続いて、右クリックして「貼り付け」を選びます。新しい敵が複製されます
新しい敵を次のように配置します。

実行してみると、2匹とも敵が往復します。
なお、引き返しの部分の判定を詳しく解説すると、次のようになります。

次へ