私はペイントソフトをつくっています。
その中で塗りつぶし処理の命令を自作したので、ここに載せます。
即席でC++(DLL)からHSP用に書き換えたので、改良の余地はあります。
そのまま書くと下に長くなってしまうので、コロンを使って改行を減らしています。
そのためかなり見づらいです。
言っておきますが、このスクリプトですとかなり遅いです。
#module
#deffunc paint int px,int py
_r=ginfo_r :_g=ginfo_g :_b=ginfo_b
cwnt=0 :pget px,py
r=ginfo_r :g=ginfo_g :b=ginfo_b
dim dx,ginfo_sx*ginfo_sy
dim dy,ginfo_sx*ginfo_sy
dim dxy,ginfo_sx,ginfo_sy
dx(0)=px :dy(0)=py :dxy(px,py)=1
cwnt++
repeat
x=dx(cnt) :y=dy(cnt)
if x+1<ginfo_sx {
if dxy(x+1,y)=0 {
dxy(x+1,y)=1 :pget x+1,y
if ginfo_r=r and ginfo_g=g and ginfo_b=b {
dx(cwnt)=x+1 :dy(cwnt)=y :cwnt++
}}}
if 0<=x-1 {
if dxy(x-1,y)=0 {
dxy(x-1,y)=1 :pget x-1,y
if ginfo_r=r and ginfo_g=g and ginfo_b=b {
dx(cwnt)=x-1 :dy(cwnt)=y :cwnt++
}}}
if y+1<ginfo_sy {
if dxy(x,y+1)=0 {
dxy(x,y+1)=1 :pget x,y+1
if ginfo_r=r and ginfo_g=g and ginfo_b=b {
dx(cwnt)=x :dy(cwnt)=y+1 :cwnt++
}}}
if 0<=y-1 {
if dxy(x,y-1)=0 {
dxy(x,y-1)=1 :pget x,y-1
if ginfo_r=r and ginfo_g=g and ginfo_b=b {
dx(cwnt)=x :dy(cwnt)=y-1 :cwnt++
}}}
if cnt=cwnt-1 :break
loop
color _r,_g,_b
repeat cwnt
pset dx(cnt),dy(cnt)
await
loop
return
#global
boxf 50,50,200,200
color 255
paint 100,100
dialog "Finish"