今回は一度にたくさんのアイテムを置く方法を紹介します。まずは、具体的にどんなものが作れるようになるのか見ていきましょう
①プレイヤーの行く手をはばむモンスターの群れ
②入口が1マスだけの壁を建てる
③ばくだんでできた迷路
それでは、それぞれの作り方を順番に紹介します
1.プレイヤーの行く手をはばむモンスターの群れ
モンスターの群れを作るには、こんなコードを使います
for (let y = 0; y <= 9; y++) {
// ここからスライム
const item1 = new RPGObject(('▼ スキン', Skin.スライム));
item1.family = ('▼ ファミリー', Family.ドクリツ);
item1.hp = 3;
item1.atk = 1;
item1.locate(8, y, 'map1');
item1.endless(async (self, count) => {
await self.attack(); // こうげきする
/*+ じどう*/
});
//ここまでスライム
}
これはfor文と言います。1行目のfor (let y = 0; y <= 14; y++) {
に注目してください
今回のこのコードは、「y=0から始まって1づつ増えてゆき、y=9になるまで、{ }
の中の処理を繰り返す」という意味です
{ }
の中の処理とは、2〜12行目のスライムを作っているコードのことです。つまりスライムが何度も作られることになります
こんな感じに↓
さて、なぜ縦一列に並ぶのでしょうか、理由はスライムの場所を表したコードにあります
item1.locate(8, y, 'map1');
これはスライムの場所を、左から8番目、上からy番目の位置に置くという意味です
先ほど言ったように、yは0から始まって、9まで1づつ増え続けるので、今回のコードは
「スライムを(8, 0)の場所に出す」
「スライムを(8, 1)の場所に出す」
「スライムを(8, 2)の場所に出す」
「スライムを(8, 3)の場所に出す」
「スライムを(8, 4)の場所に出す」
︙
「スライムを(8, 9)の場所に出す」
という処理を行っていたのです。本来ならスライムをゲームに15回追加して、15匹それぞれの場所のコードを書き換える必要があるのですが、for文を使うことで1度に15匹並べることができました
2.入口が1マスだけの壁を建てる
次は、for-of文を使って、1度にたくさんの壁を置くコードを紹介します
for (let x of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) {
// ここからふしぎなかべ
const item1 = new RPGObject(('▼ スキン', Skin.クレイ));
item1.locate(x, 3, 'map1');
// ここまでふしぎなかべ
}
前々回の記事で出てきた「配列」を使っています。[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
というのが配列です
このコードは「xには配列の値が1つづつ入り、最後の値が入るまで{ }
の処理を繰り返す」という意味になります
横に並んだ、ながーーい壁ができました。次はこの壁の1つを消して、入口を作ります
壁の場所を表すコードitem1.locate(x, 3, 'map1');
に注目。これは壁を「左からx番目、上から3番目の位置に置く」という意味のコードです
xには配列の値が1つづつ入ります。そのため、配列[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
の値の中から1つを消すと……
for (let x of [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14]) {
// ここからふしぎなかべ
const item1 = new RPGObject(('▼ スキン', Skin.クレイ));
item1.locate(x, 3, 'map1');
// ここまでふしぎなかべ
}
配列から7,
を消したので、その部分に入口ができました!
3.ばくだんでできた迷路
ここまで使ったfor文と配列を応用することで、迷路のようにアイテムを置くことができます
const 配列 = [
[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0],
[1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1],
[1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1],
[0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
];
for (let y = 0; y < 配列.length; y++) {
const 行 = 配列[y];
for (let x = 0; x < 行.length; x++) {
const 中身 = 行[x];
// ここからオブジェクトを出す処理
if (中身 === 1) {
// ここからじげんばくだん
const item1 = new RPGObject(('▼ スキン', Skin.ボム));
item1.family = ('▼ ファミリー', Family.マップ);
item1.locate(x, y, 'map1');
item1.setTimeout(() => {
const バクエン = item1.summon(('▼ スキン', Skin.バクエン));
バクエン.velocityY = -1;
バクエン.mod(Hack.createDamageMod(5)); // ダメージオブジェクトにする
バクエン.destroy(20);
item1.destroy();
}, 500); // 爆発までのフレーム数(30Fで1秒)
// ここまでじげんばくだん
}
// オブジェクトを出す処理ここまで
}
}
const 配列 = [
[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0],
[1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1],
[1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1],
[0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
];
このコードが配列です。マップのマス目の数だけ配列の値があります
1になっている所に爆弾が置かれるので、書き換えて迷路を作ってみましょう
爆弾のダメージを変えたいときはバクエン.mod(Hack.createDamageMod(5));
このコードの数字を書き換えます
また、爆発までの時間は}, 500); // 爆発までのフレーム数(30Fで1秒)
という行を見てください。この500という数字が爆発まで時間を表しています