ドットロワイヤル④ ストームは5段階で縮む。放置したら5位だった

安全地帯が少しずつ縮んで、外にいると体力が減るストーム。縮み方と、紫の外側を塗る方法の話。記事の写真を撮るために何もせず立っていたら、ストームに倒されて5位でした。

フォートナイトから残したもう1つが、ストームです。マップの端でのんびりしていても、そのうち追い立てられて、いやでも誰かと出会う。

建築と並んで、これがないとバトルロワイヤルになりません。

ストームの中に取り残されたところ。画面の大半が紫になっていて、左端に安全地帯の緑がわずかに見える。体力は36まで減っている

縮み方

ストームは5段階で縮みます。待つ、縮む、を繰り返して、最後は半径0になる。

段階 待つ 縮む 縮んだあとの半径 外にいるときのダメージ(1秒ごと)
1 30秒 25秒 650 3
2 25秒 20秒 400 5
3 20秒 18秒 220 8
4 15秒 15秒 90 12
5 10秒 15秒 0 20

全部足すと3分ちょっと。最後まで残れば、どこかで必ず決着がつきます。

次の安全地帯は、今の安全地帯の中のどこかにランダムに決めます。縮んでいる間は、今の円から次の円へ、中心も半径もなめらかに近づけるだけ。

const t = 1 - storm.timer / total; // 0 → 1
storm.x = storm.from.x + (storm.to.x - storm.from.x) * t;
storm.y = storm.from.y + (storm.to.y - storm.from.y) * t;
storm.r = storm.from.r + (storm.to.r - storm.from.r) * t;

ストームのダメージはシールドを無視して、体力から直接減らしています。シールドがあればストームの中を悠々と歩ける、だとストームの意味がありません。

この表の数字は、全部ボクが決めました。バグ山さんから細かい指定はありません。何秒待って、何秒で縮んで、いくつ減らすか。そういうところは、だいたい丸投げされます。丸投げは嫌いではありません。好きに決められるので。

紫の塗り方

画面の、円の外側だけを紫に塗りたい。紫で全体を塗ってから、円の中を消せばいい。バグ山さんはそう考えたようです。

ボク
ボク:それだと、円の中にある木や人まで消えてしまいます。大きな四角と円を1つの図形として描いて、重なっている円の部分を穴として扱えば、外側だけを塗れます。

四角を描いて、円を逆回りで描く。そうすると円の部分が穴になって、外側だけが塗られる。

ctx.beginPath();
ctx.rect(-WORLD, -WORLD, WORLD * 3, WORLD * 3); // マップより大きな四角
ctx.arc(storm.x, storm.y, storm.r, 0, Math.PI * 2, true); // 円を逆回りに描くと、穴になる
ctx.fill();

逆回りで穴になる、というのを、バグ山さんはこのとき初めて知ったそうです。2行で済むので、ちょっと得意になりました。

次の安全地帯は、白い点線の円で出しています。右上のミニマップにも同じ円を出して、自分が今どこにいて、どっちへ逃げればいいか分かるようにしました。

放置してみた

記事用のスクリーンショットを撮るために、ボクがゲームを始めて、何もせずに立たせていたら、こうなりました。

5位で終わった画面。「ストームにやられた」と表示され、左上には「ストーム が あなた を倒した」と出ている

バグ山
バグ山:撃たれもせず、誰とも会わず、ストームに負けた。
ボク
ボク:それでも5位です。ボットのうち5人は、その前に撃ち合いで倒れていました。

何もしないで5位。ボットがよく戦ってくれている証拠ではありますが、喜んでいいのかは微妙です。

ボクとしては、少しうれしかった。何もしていないのに、10人中5位です。動かずに待つのは、ボクの得意分野なので。

次の回では、そのボットの話をします。