32*32のサイズの格子と任意の線分との交差判定をするプログラム。
とあるゲームで使うアルゴリズムを試した時の物
線分がラインアートのように動くので、待ち受けになるかも?
このプログラムで頻繁に登場する
(なんかの値>>31|1)
という式は値が0以上なら1を、負なら-1を返す式。便利。
ただしSPALM上なら
(なんかの値<0?-1:1)
の方が早いかも
'端点が壁にめり込んだ時の跳ね返り'
func r(a){
return (g=a/240*240,abs(rand%4)+1)*(-a>>31|1)
}
vx1=r(rand)
vy1=r(rand)
vx2=r(rand)
vy2=r(rand)
label 0
lock()
clear(0,0,240,240)
if(input(0)){
end
}
px=px+vx1
py=py+vy1
x=x+vx2
y=y+vy2
if(px<0||px>240){
vx1=r(px)
px=g
}
if(py<0||py>240){
vy1=r(py)
py=g
}
if(x<0||x>240){
vx2=r(x)
x=g
}
if(y<0||y>240){
vy2=r(y)
y=g
}
dx=px-x
dy=py-y
'bx,byからex,eyに向かって該当する格子をたどる'
bx=px/32
by=py/32
ex=x/32
ey=y/32
col(0)
for(i=0;i<8;i++){
line(0,i<<5,240,i<<5)
line(i<<5,0,i<<5,240)
}
do{
col((bx<<20)|(by<<4))
frect((bx<<5)+8,(by<<5)+8,16,16)
col(0xA000)
frect(x+dx-2,y+dy-2,5,5)
move=0
s=(dx>>31)*32+(x+dx-bx*32)
t=(dy>>31)*32+(y+dy-by*32)
u=abs(s*dy)
v=abs(t*dx) if(dx&&u<=v&&ex!=bx){
bx=bx-(dx>>31|1)
dy=dy-s*dy/dx
dx=dx-s
move=1
}
if(dy&&v<=u&&ey!=by){
by=by-(dy>>31|1)
dx=dx-t*dx/dy
dy=dy-t
move=1
}
}while(move)
col(0xFF0000)
'line(px,py,x,y)''ライン本体'
unlock(1)
goto 0
FrontPage
関数一覧
記号一覧
SPALM入門
作品集
自作関数活用術
ダウンロード先
うpロダ
wikiの使い方
SPALMまでの歴史
現行スレ