最近テラメリテールではシステムばかり作っており…いや作ろうとしており、 絵をかいたりテキストを書いたりということはしていませんでした。でもこれは必要なことだから、 逃げずにやらなければ…!と、ここ数日間がんばっていたのです。

頑張っていた内容は「傾いた矩形同士の当たり判定」を作る、というもの。 例えば細長い障害物が風車のように回転していて、それを避けなければいけないというミッションがあれば 傾いた長方形と自機が接触したかどうかの判定が必要です。

画面に垂直な、傾いていない四角形同士の当たり判定は簡単だが傾いているとなると話はかなり変わってくる。 だからそれをありとあらゆる方法で、自分にできそうな方法で作ろうと四苦八苦したのでした。 数学はおろか算数も嫌いなヤツに、そんなことができるのだろうか…?!

結論としては、できました。その処理を作ることはできました。 弾(矩形)が立っていようと傾いていようと、自機(矩形)の辺と弾の辺が交差していれば当たっている、という判定はできました。 それがこちら。


自機と、弾のピクチャのそれぞれ4つの頂点の座標を取得し、そこから辺同士が交差しているかを比較。 画像に映っているのは例えば四角形ABCDと四角形EFGHの辺ABと辺EFを比較している分だけなので、 これを全ての辺同士のパターンで行えばOK。

写ってないけど「結果1」と「結果2」を最後にかけて、 その数値が負ならば辺が交差している(衝突している)、正ならば交差していない(当たってない)、という判定となります。

で、初めに「ピクチャの左上X座標」を取得して8つの変数に入れています。 1回の比較には8つ全部使わないのでこんな一気に取得しておいておく必要はないんだけど、 間違えたらどこが間違ってるのか分からなくなるのでまずは慎重に慎重にやっている図です。

ピクチャは「自由変形」ということができて、真四角のピクチャでも4つの頂点の座標を 動かすことによってびよーんと菱形にしたり上の2辺を裏返して三角形が縦に二つあるような、 砂時計のような形にだってできます。ただ「自由変形」を使うと処理が重くなるらしい。

で、「自由変形」時でなければピクチャの4つの頂点の座標が取得できないので 変形させてないけど「自由変形」させ、頂点の座標をまず取得しているというわけです。

先ほども言いましたが、このプログラムで自機の1辺、正方形ではない、傾いた四角形の ピクチャで作られた弾の1辺が交差しているかの処理はできました。 ではいざ、動かしてみると…。


絵がカオスですが、ここはテラメリテールのデバッグルームの一つです。 この処理どうやって作るんですかねと思ったらここに来て適当なキャラやピクチャを配置し、 へー、ウディタってこういう仕様なんですねとお勉強をするわけです。

大抵は処理や判定や動作のチェックに来るので、本編のマップで使っている適当な 画像を使います。この場合、「細長い四角形のピクチャ」を弾として扱ってテストするため、 ウォーターフェルの滝の画像を回転させて左端にある自機との当たり判定を調べました。

…だが、自機と滝の一辺が交差したらちゃんと交差した判定は出るのだが、 回転させて自機と重なっても…その前に、回転していても判定のための数値が全く 変化がないのである。何が起きているんだ…いや、何も起きていないのはなぜだ…?

ウディタのデバッグ機能、現在使用されているピクチャのプロパティを見てみて唖然。


これがプロパティの画面。一つ目のピクチャID「4101」は自機のハート。 二つ目のピクチャID「110000」が弾というか滝のピクチャです。 右に画面に対してどの位置にあるか、赤で示されているのが分かります。 数値としても座標や大きさ、最後にピクチャに処理を施したイベントまで書いてあります。 このデバッグ機能はとても分かりやすいですね。

さて、ゲーム画面では滝が右に傾いています。しかしピクチャの表示位置を見てみると、 全く傾いていないのです。

この滝はピクチャの「角度」の値を変えて傾けています。少しずつ角度の数値が増えていき、 360になったら0に戻る、という処理になっています。なのでゲーム画面ではずっと ぐるぐると回転をしているわけです。

…しかし、デバッグ画面で見てみるとピクチャは一切回転しない。 どのタイミングで見てみても、ひたすら直立不動で、「1度」も傾いていない。 ついでに、4つの頂点の座標もピクリとも動かない。滝はものすごく回っているのに。

理由はただ一つ。「ピクチャを回転させても、ピクチャの座標は変わらない」ということです。 「エフェクト(伸び縮みさせたり揺らしたりできる機能)」でピクチャを動かした場合、 その数値はピクチャの座標に影響はないということは知っていた。

ウディタ公式サイト様の「変数操作+」の説明ページにも 「※ここで取得できるピクチャの情報は、「画面処理」による補正を無視した値になりますので、注意してください」 とあるので、それは処理の高速化とか、そもそもウディタの処理の根底において大事なことなんだろう。

だが…「画面処理(エフェクト)」だけでなく、ピクチャ自体の数値も無視するとは…。 ピクチャの「拡大率」を変えてもちゃんとそれに応じた値を取得できるけど、 ピクチャの「角度」を変えた場合はピクチャは実質傾いていないことになるんですね…。

せっかく処理を作ったんだが、さすがにこれ以上立ち止まってはいられない。 無料で使わせていただいている「WOLF RPGエディター」様の仕様がそれならば、 それに従うほかないのである。文句あるなら自分でエディタを作れい、ということなんだ。

こうしてまた一つお利口になったところで血の涙を流しながら作った処理は没となり、 「傾いた矩形」を敵の弾に使うということはあきらめたのでした。少なくともウディタでは。

…まあ、まだ方法がないわけではないんだ。それは「ピクチャの回転も自由変形で行う」という方法。 ピクチャの4つの頂点をピクチャの中心座標に応じて同じ距離だけ回転させることにより、 それは実質ピクチャが回転していることになる。そして内部的にはピクチャは回転していなくても 「ピクチャの左上座標X」のような数値を直接変更し、直接取得するという方法はある。

だが、さすがにもういい。 傾いた矩形を使わなきゃいいんだ。どうしても使いたければ分割した正方形を斜めに並べるとかして ごまかすことすらできるだろうし、もういいや。傾いた矩形同士の衝突判定を作ることはできたんだし。 ただ、ウディタではピクチャの方が傾かなかったというだけで…。

(書き終わってからの追記⇒逆にピクチャの「角度」を取得し、 その数値を使って4つの頂点の座標を求めるという方法もあるか…でも、やっぱもういいや…)

というわけでやっとワンボーの攻撃を作ることを再開させたら、 「動いているときに当たる」攻撃が一瞬で作れました。うわお、簡単〜…。 これなら「動いていないときに当たる」攻撃もすぐだな…。

できないものは今はできないのだと斬捨て御免するのが一番!早く完成させるんだから! できないものはできない!そのツールでできることをするべきだ! そう、ポケモン緑のソフトでテトリスを作ろうとするようなものだ! それはできる人はできるらしいが!
2021年6月9日


◆目次に戻る◆






inserted by FC2 system