【ウディタ】二点間直線上マスの取得
二つの座標の間に直線を引いた時、その直線に触れるマスを取得するコモンEvを作成しました。
例えば、斜め方向に攻撃する時に相手との間に障害物があるならそれに当たるとか、間にある全ての障害物ごと相手にも攻撃が当たる(レーザー系の武器とか?)、なんてものが作れそう。
※デバッグ用にパネル表示してます
仕様
- 開始地点を青いユニット、終了地点を赤いユニットのマスとする
- 直線が通ったマスを、開始地点から近い順に返すコモンEv
- 直線の幅(太さ)は考えないものとする
方法①
まず開始地点と終了地点がこの関係だったとして
ウディタのゲーム画面は、数学で扱うグラフと同じようにX軸とY軸のある平面ですが、ただしY座標については真逆で、下に行くほど数字が大きくなりますのでご注意を。
手順1.マスの真ん中から線を引く
手順2.手順1で引いたx軸と並行な線と、直線の交点を含むマスを取得
※ 交点がマスとマスのちょうど境の場合は、x座標が大きい方のますを取得
手順3.このままだと以下の赤いマスが取得できていないので、補完処理が必要
で、注目するのがここ。
直線が各交点の直前に通った、マスの境目(x軸と並行な境界線)との交点と、その左側のマスの頂点との距離、つまりとの距離が小さい正方形の辺の長さ(0.5)より大きいか、小さいかで補完するマスを特定できます。
うーん、でもこれだと何だか物凄く無駄な事をやっている気もする?
方法②
直線が通ったマスの境目(x軸と並行な境界線)との交点が、
- 頂点なら座標(x+1,y+1)
- 頂点でない、且つ交点を含むマスのx座標が直前のマスに比べ変化無しなら座標(x±0,y+1)
- 頂点でない、且つ交点を含むマスのxの座標が変化有りなら座標(x+1,y±0)と座標(x+1,y+1)
をそれぞれ取得
これでも判定できそうですね。
ここまでは、あくまで開始地点から見て目標がこのエリアにある場合の話
なので、処理はちょっと工夫が必要。
折角なので両方作ったんですが、処理的には方法②の方が行数少ないし補完処理が必要ないので簡潔。
それにしてもなんというか、ゴリ押しというか、もっと簡単な方法がある気がする...
方法①のイベントコード
WoditorEvCOMMAND_START
[103][0,1]<0>()("処理中IDの座標")
[124][4,0]<0>(1600010,4096,1600000,0)()
[124][4,0]<0>(1600011,4096,1600000,1)()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("初期化")
[122][2,1]<0>(1600009,0)("")
[121][4,0]<0>(1600040,0,0,0)()
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600031,9000118,0,0)()
[121][4,0]<0>(1600032,1600031,2,12288)()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("増加量")
[121][4,0]<0>(1600015,1600001,1600010,4096)()
[121][4,0]<0>(1600016,1600002,1600011,4096)()
[103][0,1]<0>()("傾き")
[121][4,0]<0>(1600012,0,0,0)()
[121][4,0]<0>(1600013,0,0,0)()
[121][4,0]<0>(1600014,1000,0,2048)()
[111][7,0]<0>(18,1600015,0,2,1600016,0,2)()
[401][1,0]<0>(1)()
[0][0,0]<1>()()
[401][1,0]<0>(2)()
[0][0,0]<1>()()
[420][1,0]<0>(0)()
[103][0,1]<1>()("メモ:計算簡素化した")
[121][4,0]<1>(1600024,1600016,1600014,8192)()
[121][4,0]<1>(1600012,1600024,1600015,12288)()
[103][0,1]<1>()(" ")
[121][4,0]<1>(1600024,1600014,1600014,8192)()
[121][4,0]<1>(1600013,1600024,1600012,12288)()
[0][0,0]<1>()()
[499][0,0]<0>()()
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600017,1600015,0,2048)()
[121][4,0]<0>(1600018,1600016,0,2048)()
[111][7,0]<0>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<0>(1)()
[121][4,0]<1>(1600019,1600017,0,0)()
[0][0,0]<1>()()
[401][1,0]<0>(2)()
[121][4,0]<1>(1600019,1600018,0,0)()
[0][0,0]<1>()()
[499][0,0]<0>()()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("ピクセル座標に変換")
[121][4,0]<0>(1600020,1600010,1600031,8192)()
[121][4,0]<0>(1600021,1600011,1600031,8192)()
[103][0,1]<0>()("マスの中心に座標を合わせる")
[121][5,0]<0>(1600020,1600032,0,65792,1)()
[103][0,1]<0>()(" ")
[121][5,0]<0>(1600020,1600014,0,66304,1)()
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600022,1600001,1600010,4096)()
[121][4,0]<0>(1600023,1600002,1600011,4096)()
[121][5,0]<0>(1600022,1,0,67328,1)()
[121][5,0]<0>(1600022,-1,0,67072,1)()
[103][0,1]<0>()(" ")
[106][0,1]<0>()("---二点間情報探索---")
[179][1,0]<0>(1600019)()
[111][7,0]<1>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<1>(1)()
[121][4,0]<2>(1600024,1600031,1600022,8192)()
[121][4,0]<2>(1600020,1600024,1600014,8448)()
[103][0,1]<2>()(" ")
[121][4,0]<2>(1600024,1600012,1600031,10240)()
[121][4,0]<2>(1600024,1600023,0,768)()
[121][4,0]<2>(1600021,1600024,0,256)()
[0][0,0]<2>()()
[401][1,0]<1>(2)()
[121][4,0]<2>(1600024,1600031,1600023,8192)()
[121][4,0]<2>(1600021,1600024,1600014,8448)()
[103][0,1]<2>()(" ")
[121][4,0]<2>(1600024,1600013,1600031,10240)()
[121][4,0]<2>(1600024,1600022,0,768)()
[121][4,0]<2>(1600020,1600024,0,256)()
[0][0,0]<2>()()
[499][0,0]<1>()()
[103][0,1]<1>()(" ")
[121][4,0]<1>(1600026,1600020,1600014,12288)()
[121][4,0]<1>(1600027,1600021,1600014,12288)()
[103][0,1]<1>()(" ")
[103][0,1]<1>()("マス座標に変換")
[121][5,0]<1>(1600026,1600031,0,66560,1)()
[103][0,1]<1>()(" ")
[99][1,0]<1>(0)()
[103][0,1]<1>()("補完処理")
[103][0,1]<1>()("最初の一回は記録を初期化")
[111][4,0]<1>(1,1600040,0,2)()
[401][1,0]<1>(1)()
[111][7,0]<2>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<2>(1)()
[121][4,0]<3>(1600042,1600011,0,0)()
[0][0,0]<3>()()
[401][1,0]<2>(2)()
[121][4,0]<3>(1600042,1600010,0,0)()
[0][0,0]<3>()()
[499][0,0]<2>()()
[121][4,0]<2>(1600040,1,0,0)()
[0][0,0]<2>()()
[499][0,0]<1>()()
[103][0,1]<1>()("変化量の小さいほうが1マス変化する度に補完処理")
[111][7,0]<1>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<1>(1)()
[121][4,0]<2>(1600041,1600027,0,0)()
[0][0,0]<2>()()
[401][1,0]<1>(2)()
[121][4,0]<2>(1600041,1600026,0,0)()
[0][0,0]<2>()()
[499][0,0]<1>()()
[111][4,0]<1>(1,1600041,1600042,5)()
[401][1,0]<1>(1)()
[103][0,1]<2>()(" ")
[103][0,1]<2>()("■■■■■変化ありの場合■■■■■")
[121][4,0]<2>(1600042,1600041,0,0)()
[103][0,1]<2>()(" ")
[103][0,1]<2>()("直前の格子点(マスの頂点)付近を直線がどう通過したのかで判定")
[111][7,0]<2>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<2>(1)()
[121][4,0]<3>(1600024,1600012,1600032,10240)()
[121][4,0]<3>(1600024,1600023,0,768)()
[121][4,0]<3>(1600025,1600021,1600024,4096)()
[0][0,0]<3>()()
[401][1,0]<2>(2)()
[121][4,0]<3>(1600024,1600013,1600032,10240)()
[121][4,0]<3>(1600024,1600022,0,768)()
[121][4,0]<3>(1600025,1600020,1600024,4096)()
[0][0,0]<3>()()
[499][0,0]<2>()()
[121][4,0]<2>(1600025,1600014,0,1024)()
[103][0,1]<2>()(" ")
[103][0,1]<2>()("格子点との距離")
[121][4,0]<2>(1600051,1600025,1600031,16384)()
[111][7,0]<2>(18,1600051,0,2,1600051,1600032,2)()
[401][1,0]<2>(1)()
[103][0,1]<3>()("マスの頂点を通過している")
[0][0,0]<3>()()
[401][1,0]<2>(2)()
[103][0,1]<3>()("隣り合うマスの頂点のちょうど真ん中を通過している")
[0][0,0]<3>()()
[420][1,0]<2>(0)()
[121][4,0]<3>(1600043,1600026,0,0)()
[121][4,0]<3>(1600044,1600027,0,0)()
[111][7,0]<3>(2,1600017,1600018,0,1600017,1600018,4)()
[401][1,0]<3>(1)()
[111][7,0]<4>(2,1600002,1600011,0,1600002,1600011,4)()
[401][1,0]<4>(1)()
[111][7,0]<5>(2,1600051,1600032,0,1600051,1600032,4)()
[401][1,0]<5>(1)()
[121][4,0]<6>(1600044,1600023,0,512)()
[0][0,0]<6>()()
[401][1,0]<5>(2)()
[121][4,0]<6>(1600043,1600022,0,512)()
[0][0,0]<6>()()
[499][0,0]<5>()()
[0][0,0]<5>()()
[401][1,0]<4>(2)()
[111][7,0]<5>(2,1600051,1600032,0,1600051,1600032,4)()
[401][1,0]<5>(1)()
[121][4,0]<6>(1600043,1600022,0,512)()
[0][0,0]<6>()()
[401][1,0]<5>(2)()
[121][4,0]<6>(1600044,1600023,0,512)()
[0][0,0]<6>()()
[499][0,0]<5>()()
[0][0,0]<5>()()
[499][0,0]<4>()()
[0][0,0]<4>()()
[401][1,0]<3>(2)()
[111][7,0]<4>(2,1600001,1600010,0,1600001,1600010,4)()
[401][1,0]<4>(1)()
[111][7,0]<5>(2,1600051,1600032,0,1600051,1600032,4)()
[401][1,0]<5>(1)()
[121][4,0]<6>(1600043,1600022,0,512)()
[0][0,0]<6>()()
[401][1,0]<5>(2)()
[121][4,0]<6>(1600044,1600023,0,512)()
[0][0,0]<6>()()
[499][0,0]<5>()()
[0][0,0]<5>()()
[401][1,0]<4>(2)()
[111][7,0]<5>(2,1600051,1600032,0,1600051,1600032,4)()
[401][1,0]<5>(1)()
[121][4,0]<6>(1600044,1600023,0,512)()
[0][0,0]<6>()()
[401][1,0]<5>(2)()
[121][4,0]<6>(1600043,1600022,0,512)()
[0][0,0]<6>()()
[499][0,0]<5>()()
[0][0,0]<5>()()
[499][0,0]<4>()()
[0][0,0]<4>()()
[499][0,0]<3>()()
[103][0,1]<3>()(" ")
[103][0,1]<3>()("記録(補完用)")
[106][0,1]<3>()("(\cself[43], \cself[44])")
[111][7,0]<3>(2,1600003,0,2,1600003,1,2)()
[401][1,0]<3>(1)()
[122][2,1]<4>(1600009,256)("\cself[43], \cself[44]<\n>")
[0][0,0]<4>()()
[401][1,0]<3>(2)()
[124][4,0]<4>(1600028,73728,1600043,1600044)()
[122][2,1]<4>(1600009,256)("\cself[28]<\n>")
[0][0,0]<4>()()
[499][0,0]<3>()()
[0][0,0]<3>()()
[499][0,0]<2>()()
[0][0,0]<2>()()
[499][0,0]<1>()()
[103][0,1]<1>()(" ")
[99][1,0]<1>(0)()
[103][0,1]<1>()("記録")
[106][0,1]<1>()("(\cself[26], \cself[27])")
[111][7,0]<1>(2,1600003,0,2,1600003,1,2)()
[401][1,0]<1>(1)()
[122][2,1]<2>(1600009,256)("\cself[26], \cself[27]<\n>")
[0][0,0]<2>()()
[401][1,0]<1>(2)()
[124][4,0]<2>(1600028,73728,1600026,1600027)()
[122][2,1]<2>(1600009,256)("\cself[28]<\n>")
[0][0,0]<2>()()
[499][0,0]<1>()()
[0][0,0]<1>()()
[498][0,0]<0>()()
[106][0,1]<0>()("---------------------")
WoditorEvCOMMAND_END
方法②のイベントコード
WoditorEvCOMMAND_START
[103][0,1]<0>()("処理中IDの座標")
[124][4,0]<0>(1600010,4096,1600000,0)()
[124][4,0]<0>(1600011,4096,1600000,1)()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("初期化")
[122][2,1]<0>(1600009,0)("")
[121][4,0]<0>(1600040,0,0,0)()
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600031,9000118,0,0)()
[121][4,0]<0>(1600032,1600031,2,12288)()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("増加量")
[121][4,0]<0>(1600015,1600001,1600010,4096)()
[121][4,0]<0>(1600016,1600002,1600011,4096)()
[103][0,1]<0>()("傾き")
[121][4,0]<0>(1600012,0,0,0)()
[121][4,0]<0>(1600013,0,0,0)()
[121][4,0]<0>(1600014,1000,0,2048)()
[111][7,0]<0>(18,1600015,0,2,1600016,0,2)()
[401][1,0]<0>(1)()
[0][0,0]<1>()()
[401][1,0]<0>(2)()
[0][0,0]<1>()()
[420][1,0]<0>(0)()
[103][0,1]<1>()("メモ:計算簡素化した")
[121][4,0]<1>(1600024,1600016,1600014,8192)()
[121][4,0]<1>(1600012,1600024,1600015,12288)()
[103][0,1]<1>()(" ")
[121][4,0]<1>(1600024,1600014,1600014,8192)()
[121][4,0]<1>(1600013,1600024,1600012,12288)()
[0][0,0]<1>()()
[499][0,0]<0>()()
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600017,1600015,0,2048)()
[121][4,0]<0>(1600018,1600016,0,2048)()
[111][7,0]<0>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<0>(1)()
[121][4,0]<1>(1600019,1600017,0,0)()
[0][0,0]<1>()()
[401][1,0]<0>(2)()
[121][4,0]<1>(1600019,1600018,0,0)()
[0][0,0]<1>()()
[499][0,0]<0>()()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("ピクセル座標に変換")
[121][4,0]<0>(1600020,1600010,1600031,8192)()
[121][4,0]<0>(1600021,1600011,1600031,8192)()
[103][0,1]<0>()("マスの中心に座標を合わせる")
[121][5,0]<0>(1600020,1600032,0,65792,1)()
[103][0,1]<0>()(" ")
[121][5,0]<0>(1600020,1600014,0,66304,1)()
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600022,1600001,1600010,4096)()
[121][4,0]<0>(1600023,1600002,1600011,4096)()
[121][5,0]<0>(1600022,1,0,67328,1)()
[121][5,0]<0>(1600022,-1,0,67072,1)()
[103][0,1]<0>()(" ")
[111][7,0]<0>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<0>(1)()
[121][4,0]<1>(1600024,1600032,1600022,8192)()
[121][4,0]<1>(1600020,1600024,1600014,8448)()
[103][0,1]<1>()(" ")
[121][4,0]<1>(1600024,1600012,1600032,10240)()
[121][4,0]<1>(1600024,1600023,0,768)()
[121][4,0]<1>(1600021,1600024,0,256)()
[0][0,0]<1>()()
[401][1,0]<0>(2)()
[121][4,0]<1>(1600024,1600032,1600023,8192)()
[121][4,0]<1>(1600021,1600024,1600014,8448)()
[103][0,1]<1>()(" ")
[121][4,0]<1>(1600024,1600013,1600032,10240)()
[121][4,0]<1>(1600024,1600022,0,768)()
[121][4,0]<1>(1600020,1600024,0,256)()
[0][0,0]<1>()()
[499][0,0]<0>()()
[121][4,0]<0>(1600043,1600010,0,0)()
[121][4,0]<0>(1600044,1600011,0,0)()
[106][0,1]<0>()("---二点間情報探索---")
[179][1,0]<0>(1600019)()
[111][7,0]<1>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<1>(1)()
[121][4,0]<2>(1600024,1600021,1600014,12288)()
[0][0,0]<2>()()
[401][1,0]<1>(2)()
[121][4,0]<2>(1600024,1600020,1600014,12288)()
[0][0,0]<2>()()
[499][0,0]<1>()()
[121][4,0]<1>(1600024,1600031,0,1280)()
[111][4,0]<1>(17,1600024,0,2)()
[401][1,0]<1>(1)()
[103][0,1]<2>()("頂点通過")
[121][4,0]<2>(1600043,1600022,0,256)()
[121][4,0]<2>(1600044,1600023,0,256)()
[0][0,0]<2>()()
[420][1,0]<1>(0)()
[121][4,0]<2>(1600026,1600020,1600014,12288)()
[121][4,0]<2>(1600027,1600021,1600014,12288)()
[103][0,1]<2>()(" ")
[103][0,1]<2>()("マス座標に変換")
[121][5,0]<2>(1600026,1600031,0,66560,1)()
[103][0,1]<2>()(" ")
[103][0,1]<2>()("変化量の小さいほうの座標が変化なし or 変化あり(+1)")
[111][7,0]<2>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<2>(1)()
[111][4,0]<3>(17,1600027,1600044,2)()
[401][1,0]<3>(1)()
[121][4,0]<4>(1600043,1600022,0,256)()
[0][0,0]<4>()()
[420][1,0]<3>(0)()
[121][4,0]<4>(1600044,1600023,0,256)()
[103][0,1]<4>()(" ")
[121][4,0]<4>(1600043,1600022,0,256)()
[0][0,0]<4>()()
[499][0,0]<3>()()
[0][0,0]<3>()()
[401][1,0]<2>(2)()
[111][4,0]<3>(17,1600026,1600043,2)()
[401][1,0]<3>(1)()
[121][4,0]<4>(1600044,1600023,0,256)()
[0][0,0]<4>()()
[420][1,0]<3>(0)()
[121][4,0]<4>(1600043,1600022,0,256)()
[103][0,1]<4>()(" ")
[121][4,0]<4>(1600044,1600023,0,256)()
[0][0,0]<4>()()
[499][0,0]<3>()()
[0][0,0]<3>()()
[499][0,0]<2>()()
[0][0,0]<2>()()
[499][0,0]<1>()()
[103][0,1]<1>()("記録")
[106][0,1]<1>()("(\cself[43], \cself[44])")
[111][7,0]<1>(2,1600003,0,2,1600003,1,2)()
[401][1,0]<1>(1)()
[122][2,1]<2>(1600009,256)("\cself[43], \cself[44]<\n>")
[0][0,0]<2>()()
[401][1,0]<1>(2)()
[124][4,0]<2>(1600028,73728,1600043,1600044)()
[122][2,1]<2>(1600009,256)("\cself[28]<\n>")
[0][0,0]<2>()()
[499][0,0]<1>()()
[103][0,1]<1>()(" ")
[111][7,0]<1>(2,1600017,1600018,1,1600017,1600018,4)()
[401][1,0]<1>(1)()
[121][4,0]<2>(1600024,1600031,1600022,8192)()
[121][4,0]<2>(1600020,1600024,1600014,8448)()
[103][0,1]<2>()(" ")
[121][4,0]<2>(1600024,1600012,1600031,10240)()
[121][4,0]<2>(1600024,1600023,0,768)()
[121][4,0]<2>(1600021,1600024,0,256)()
[0][0,0]<2>()()
[401][1,0]<1>(2)()
[121][4,0]<2>(1600024,1600031,1600023,8192)()
[121][4,0]<2>(1600021,1600024,1600014,8448)()
[103][0,1]<2>()(" ")
[121][4,0]<2>(1600024,1600013,1600031,10240)()
[121][4,0]<2>(1600024,1600022,0,768)()
[121][4,0]<2>(1600020,1600024,0,256)()
[0][0,0]<2>()()
[499][0,0]<1>()()
[0][0,0]<1>()()
[498][0,0]<0>()()
[106][0,1]<0>()("---------------------")
WoditorEvCOMMAND_END