objimage命令自体の機能は
「これから設置するボタンは"ここの画像"を使って表示してね」
といった感じのものですので、今北隙間産業様のスクリプトですと
>>objimage 2, 0, 0, 0, ButtonY, 0, ButtonY*2
の後に該当ボタンを再設置する必要があります。
但しその方法ですと、再設置の際に画面のチラつきが発生すると思いますので
objimage命令の指し示す「ここの画像」自体を描き換える方法をお勧めします。
描き換えただけだと、ボタンが再描画されるまで表示は更新されませんが
一旦フォーカスを外し(当てて)、強制的に再描画させる事で解決できます。
ボタン画像の切り替え状態については、自前で変数管理するしか無い気がします。
原形留めてないソースですが、コメント付きの行が大体上述の部分です。
#module
#uselib "user32.dll"
#func _ScreenToClient "ScreenToClient" sptr,var
#func _GetCursorPos "GetCursorPos" var
#defcfunc RectFromCursor int p0, array p1, local a
dim a,3 :_GetCursorPos a :_ScreenToClient p0,a :a.2=-1
repeat length2(p1)
If(a.0<p1(0,cnt))||(a.1<p1(1,cnt))||(a.0>p1(2,cnt))||(a.1>p1(3,cnt)){}else{a.2=cnt}
loop
return a.2
#global
#const ButtonX 97
#const ButtonY 31
dim nBtn,2 ;カーソル下ボタン保持用
dim rBtn,6,2 ;ボタンの情報配列 [L,T,R,B,id,image]
rBtn(0,0)=100, 100, 100+ButtonX-1, 100+ButtonY-1, 0, 0
rBtn(0,1)=200, 100, 200+ButtonX-1, 100+ButtonY-1, 0, 0
;buffer 1, ButtonX*4, ButtonY*3
;pos ButtonX*2, 0 :picload "btn1.jpg", 1 ;ボタンの画像
;pos ButtonX*3, 0 :picload "btn2.jpg", 1 ;ボタンの画像
//ボタン画像作ってるだけです、確認用にscreen化
screen 1,ButtonX*4,ButtonY*3,8
title "btn-buf[ ボタン1 | ボタン2 | 画像1 | 画像2 ]"
color :boxf :gradf 1,1,ButtonX-2,ButtonY/2,1,$808080,$303030
i=$1fc01f,$c01f1f
repeat 3
gradf 2*ButtonX,(cnt\3)*ButtonY,ButtonX,ButtonY,1,i(0),i(0)>>1&$7f7f7f
gradf 3*ButtonX,(cnt\3)*ButtonY,ButtonX,ButtonY,1,i(1),i(1)>>1&$7f7f7f
i(0)+=$1f1f1f : i(1)+=$1f1f1f
loop
gmode 5,ButtonX,ButtonY,256
repeat 6 : pos (cnt/3+2)*ButtonX,(cnt\3)*ButtonY : gcopy 1,0,0 : loop
gmode 0,ButtonX,ButtonY*3 ;初期状態のボタン画像をコピー
repeat 2 : pos cnt*ButtonX,0 : gcopy 1,ButtonX*2,0 : loop
screen 0,320,240
objsize ButtonX, ButtonY
objimage 1,0,0,0,ButtonY,0,ButtonY*2 ;ボタン1の参照場所
pos 100,100 : button gosub "ボタン1",*sys_Button : rBtn(4,0)=stat ;判定用にID保持
objimage 1, ButtonX,0,ButtonX,ButtonY,ButtonX,ButtonY*2 ;ボタン2の参照場所≠ボタン1
pos 200,100 : button gosub "ボタン2",*sys_Button : rBtn(4,1)=stat ;判定用にID保持
objimage -1 ;誤作動防止の為
nBtn(0)=-1
repeat : await 1
gsel 0 : nBtn(1)=RectFromCursor(hwnd,rBtn)
if(nBtn(0)!=nBtn(1)){
nBtn(0)=nBtn(1)
switch nBtn(0)
case 0 : title "ボタン1の上" :swbreak
case 1 : title "ボタン2の上" :swbreak
default : title ""
swend
}
loop
*sys_Button
switch stat
case rBtn(4,0) : rBtn(5,0)^=1 ;bitフラグでボタン1画像切り替え
gsel 1 : pos 0, 0 : gcopy 1, (2+rBtn(5,0))*ButtonX, 0 ;画像変更
gsel 0 : title "ボタン1押した"
objsel rBtn(4,0)^1 : objsel rBtn(4,0) : swbreak ;瞬間的にフォーカス外し再描画
case rBtn(4,1) : rBtn(5,1)^=1 ;bitフラグでボタン2画像切り替え
gsel 1 : pos ButtonX, 0 : gcopy 1, (2+rBtn(5,1))*ButtonX, 0 ;画像変更
gsel 0 : title "ボタン2押した"
objsel rBtn(4,1)^1 : objsel rBtn(4,1) : swbreak ;瞬間的にフォーカス外し再描画
swend
return
余計なお世話の蛇足ですが、
処理をまたいだ「*@」ラベルは使わない方が良いと思います…