トップへ
敵との当たり判定を作る
敵とぶつかったら、自分が死ぬ
敵をダブルクリックして、次のように入力します。
extends SpriteChar;
vx=2; // 進行方向
a=newAnimation(); // AnimationAdapterを作成
a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
while (1) {
if (crashTo($snowMan)) $snowMan.die(); // 自機とぶつかったら自機が死ぬ
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();
}
新しく追加した部分について説明します:
crashToメソッド
このメソッドは、指定したオブジェクト(この例では$snowMan)とこのオブジェクト(敵)がぶつかっているかを判定します。ぶつかっている場合if文の中身が実行されます。
dieメソッド
オブジェクトを殺す(消す)ときに呼び出します。この場合$snowManを消すことになります。
これで、敵が自機($snowMan)に触れると、自機が死ぬ処理ができました
自機が敵を踏みつけたら、敵が死ぬ
ここでは、「敵を踏みつける」という動作を次のように決めます
1. 自機と敵が触れている
2. 自機はその敵より少し上にいる(8ドットくらい)
3. 自機は下方向に速度をもっている
このうち、
1. 自機と敵が触れている
という判定先ほど次の部分で行いました。
if (crashTo($snowMan)) $snowMan.die(); // 自機とぶつかったら自機が死ぬ
そこで、1. が成り立ったときに、 2. と 3. が成り立ったら敵が死に、そうでなければ、自機が死ぬようにします。
extends SpriteChar;
vx=2; // 進行方向
a=newAnimation(); // AnimationAdapterを作成
a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
while (1) {
if (crashTo($snowMan)) {
// 自機とぶつかったら
if ( $snowMan.y < y-8 && $snowMan.vy>0 ) {
// 自機は敵より少し上にいて、下方向に速度をもっているならば
die(); // 敵が死ぬ
} else {
$snowMan.die(); // そうでなければ自機が死ぬ
}
}
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();
}
実行してみましょう。
敵に横から当たると、自分が消えてしまいますが、
敵を上から踏むと敵が消えます。
敵踏みつけたとき、自分が跳ね上がる
多くのジャンプアクションでは、敵を踏みつけた後自分が跳ねるようになっています。

この処理をやってみましょう。
敵をダブルクリックし、次のように変更します。
extends SpriteChar;
vx=2; // 進行方向
a=newAnimation(); // AnimationAdapterを作成
a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
while (1) {
if (crashTo($snowMan)) {
// 自機とぶつかったら
if ( $snowMan.y < y-8 && $snowMan.vy>0 ) {
// 自機は敵より少し上にいて、下方向に速度をもっているならば
die(); // 敵が死ぬ
$snowMan.vy=-5; // 自機がはねあがる
} else {
$snowMan.die(); // そうでなければ自機が死ぬ
}
}
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();
}
敵が死んだとき、自機のvy (縦方向の速度) を負の値に設定することで、跳ね上がる処理を行うことができます。