【ウディタ】二点間直線上マスの取得

二つの座標の間に直線を引いた時、その直線に触れるマスを取得するコモンEvを作成しました。


例えば、斜め方向に攻撃する時に相手との間に障害物があるならそれに当たるとか、間にある全ての障害物ごと相手にも攻撃が当たる(レーザー系の武器とか?)、なんてものが作れそう。

デバッグ用にパネル表示してます

仕様

  1. 開始地点を青いユニット、終了地点を赤いユニットのマスとする
  2. 直線が通ったマスを、開始地点から近い順に返すコモンEv
  3. 直線の幅(太さ)は考えないものとする

方法①

まず開始地点と終了地点がこの関係だったとして

ウディタのゲーム画面は、数学で扱うグラフと同じようにX軸とY軸のある平面ですが、ただしY座標については真逆で、下に行くほど数字が大きくなりますのでご注意を。


手順1.マスの真ん中から線を引く


手順2.手順1で引いたx軸と並行な線と、直線の交点を含むマスを取得

※ 交点がマスとマスのちょうど境の場合は、x座標が大きい方のますを取得


手順3.このままだと以下の赤いマスが取得できていないので、補完処理が必要


で、注目するのがここ。

直線が各交点の直前に通った、マスの境目(x軸と並行な境界線)との交点と、その左側のマスの頂点との距離、つまりの距離が小さい正方形の辺の長さ(0.5)より大きいか、小さいかで補完するマスを特定できます。


うーん、でもこれだと何だか物凄く無駄な事をやっている気もする?

方法②

直線が通ったマスの境目(x軸と並行な境界線)との交点が、

  1. 頂点なら座標(x+1,y+1)
  2. 頂点でない、且つ交点を含むマスのx座標が直前のマスに比べ変化無しなら座標(x±0,y+1)
  3. 頂点でない、且つ交点を含むマスのxの座標が変化有りなら座標(x+1,y±0)と座標(x+1,y+1)

をそれぞれ取得

これでも判定できそうですね。




ここまでは、あくまで開始地点から見て目標がこのエリアにある場合の話

なので、処理はちょっと工夫が必要。


折角なので両方作ったんですが、処理的には方法②の方が行数少ないし補完処理が必要ないので簡潔。

それにしてもなんというか、ゴリ押しというか、もっと簡単な方法がある気がする...



方法①のイベントコード


方法②のイベントコード