こんにちわ。面白そうなことしてますね。
私は移動距離を割って繰り返し判定するような事しかしたことなかったです。
線形的な移動であればこの方法でもある程度の当たり判定がとれそうですね。
(本当はすり抜けて欲しいのに当たってしまう事もあるかも)
おそらく言語はjavascrptかと思いますが計算は単純なので、
Y軸の逆転と三項演算とタプルをHSPスタイルにすれば行けると思いますよ。
よろしかったら一例ですがどうぞ。
#module
; 参考: https://www.youtube.com/watch?v=FkD-intv7IE
#defcfunc collides double l1, double t1, double r1, double b1, double vx1, double vy1, double l2, double t2, double r2, double b2, double vx2, double vy2
; ☆三項演算子はifで分ける、タプルは個々に代入する
if vx1 < vx2 {
l = l2-r1 : r = r2-l1 : vx = vx2-vx1
} else {
l = l1-r2 : r = r1-l2 : vx = vx1-vx2
}
; ☆Y軸はマイナスなので入れ替える。
if vy1 < vy2 {
t = b2-t1 : b = t2-b1 : vy = vy2-vy1
} else {
t = b1-t2 : b = t1-b2 : vy = vy1-vy2
}
; ☆ |点が大きな矩形に含まれている |上の斜線よりも下 |下の斜線よりも上
return l < 0 & 0 < r + vx & b < 0 & 0 < t + vy & vx*t - vy*l > 0 & 0 > vx*b - vy*r
#global
#module
#deffunc boxs double l, double t, double r, double b
pos l,t : line r,t : line r,b : line l,b : line l, t : return
#deffunc check_rect var l, var t, var r, var b
if l > r : v = l : l = r : r = v
if t > b : v = t : t = b : b = v
return
#global
onclick gosub *ON_CLICK
msg.0 = "一個目の矩形の左上をクリックしてください"
msg.1 = "一個目の矩形の右下をクリックしてください"
msg.2 = "一個目の矩形の移動ベクトルをクリックしてください"
msg.3 = "二個目の矩形の左上をクリックしてください"
msg.4 = "二個目の矩形の右下をクリックしてください"
msg.5 = "二個目の矩形の移動ベクトルをクリックしてください"
msg.6 = "※結果を書き込む※"
msg.7 = "クリックで最初から"
hit_msg = "結果:衝突していません", "結果:!!!衝突しました!!!"
step = 0
*DRAW
redraw 1 : await 16 : redraw 0
rgbcolor $F9F9D7 : boxf
pos 0,0 : rgbcolor : mes msg.step
circle mousex-2, mousey-2, mousex+2, mousey+2
rgbcolor $FF
if step = 1 : boxs l1, t1, mousex, mousey
if step > 1 : boxs l1, t1, r1, b1
midx = (l1+r1)/2 : midy = (t1+b1)/2
if step = 2 : line mousex, mousey, midx, midy
if step > 2 : line vx1+midx, vy1+midy, midx, midy
rgbcolor $FF0000
if step = 4 : boxs l2, t2, mousex, mousey
if step > 4 : boxs l2, t2, r2, b2
midx = (l2+r2)/2 : midy = (t2+b2)/2
if step = 5 : line mousex, mousey, midx, midy
if step > 5 : line vx2+midx, vy2+midy, midx, midy
if step = 7 {
rgbcolor $AAAAFF
boxs l1+vx1, t1+vy1, r1+vx1, b1+vy1
line l1, t1, l1+vx1, t1+vy1 : line r1, b1, r1+vx1, b1+vy1
rgbcolor $FFAAAA
boxs l2+vx2, t2+vy2, r2+vx2, b2+vy2
line l2, t2, l2+vx2, t2+vy2 : line r2, b2, r2+vx2, b2+vy2
}
goto *DRAW
*ON_CLICK
switch step
case 0 : l1 = mousex : t1 = mousey : step++ : swbreak
case 1 : r1 = mousex : b1 = mousey : step++ : check_rect l1, t1, r1, b1 : swbreak
case 2 : vx1 = mousex - (l1+r1)/2 : vy1 = mousey - (t1+b1)/2 : step++ : swbreak
case 3 : l2 = mousex : t2 = mousey : step++ : swbreak
case 4 : r2 = mousex : b2 = mousey : step++ : check_rect l2, t2, r2, b2 : swbreak
case 5 : vx2 = mousex - (l2+r2)/2 : vy2 = mousey - (t2+b2)/2
msg.6 = hit_msg.collides(l1, t1, r1, b1, vx1, vy1, l2, t2, r2, b2, vx2, vy2)
step++ : swbreak
case 6 : step++ : swbreak
case 7 : step = 0 : swbreak
swend
return