|
|
2015/8/12(Wed) 21:26:54|NO.70673
2.61のクックブックの中のマップエディターで
MAPを埋めるウィンドゥと
チップを選択するウィンドゥで
マウス操作を切り替えてて
そのスクリプトを3.xに移植しようとしてるんですが上手く出来ません
サンプルにそれの3.x版があるんですが
マウスで操作するウィンドゥは一つしかなくて
ということで
複数のウィンドゥをマウスで操作出来ますか?
という質問です
|
|
2015/8/13(Thu) 01:22:46|NO.70682
oncmdとか使わないで簡単に済ますならこんな感じ
repeat 480/16
gradf 0,cnt*16,640,16,0,$ff<<cnt,$ff000000>>cnt
loop
screen 1,640,480,,ginfo_wx2,ginfo_wy1
gsel 0,1
repeat
repeat 2//使用してるのがID0とID1として
gsel cnt
if (ginfo_mx>ginfo_wx1) and (ginfo_mx<ginfo_wx2) and (ginfo_my>ginfo_wy1) and (ginfo_my<ginfo_wy2) {//マウスカーソルがある方のウィンドウを操作先にしたまま抜ける
break
}
loop
getkey mlc,1
if mlc {
if ginfo_sel=0 {
pget mousex,mousey
r=ginfo_r:g=ginfo_g:b=ginfo_b
}else{
color r,g,b
gradf mousex-8,mousey-8,16,16
}
}
await 16
loop
左のウィンドウで左クリックすると色を拾って
右のウィンドウで左クリックすると拾った色で四角を描画
|
|
2015/8/13(Thu) 08:19:31|NO.70683
サンプルスクリプトありがとうございます
実現出来るけどサンプルにふさわしいほど簡単には出来ない
みたくは思ったんですよね(APIとか使って)
|
|
2015/8/13(Thu) 08:50:56|NO.70685
ウィンドゥが重なっててもちゃんと動くのか少し不安になったんで
試してみたら
ウィンドゥが重なってると
>拾った色で四角を描画
が機能しないみたいです
|
|
2015/8/13(Thu) 15:13:40|NO.70696
重なってるかどうかの検出も簡単
breakせずにマウスカーソルの下にあるウィンドウを数えれば良い
repeat 480/16
gradf 0,cnt*16,640,16,0,$ff<<cnt,$ff000000>>cnt
loop
screen 1,640,480,,ginfo_wx2,ginfo_wy1
gsel 0,1
repeat
wincnt=0 //マウスカーソルの下にあるHSPウィンドウの数
repeat 2 //連続したIDでクリックした時にアクティブになるウィンドウを操作先にするだけなら3つ以上も可
gsel cnt
if (ginfo_mx>ginfo_wx1) and (ginfo_mx<ginfo_wx2) and (ginfo_my>ginfo_wy1) and (ginfo_my<ginfo_wy2) {//操作先ウィンドウ上にマウスカーソルがある
winsel = cnt //cntをウィンドウIDとして保持
wincnt++
}
loop
if wincnt {//どちらかのウィンドウにマウスカーソルがある
if wincnt>1 {//重なってる領域にマウスカーソルがある
if ginfo_act>=0 {gsel ginfo_act}//アクティブ(通常上にあるウィンドウ)なウィンドウを操作先にする
}else{//重なってないウィンドウ内にマウスカーソルがある
gsel winsel //wincntが1なのでwinselに入ってるIDを捜査先にする
}
getkey mlc,1
if mlc {
switch ginfo_sel
case 0
pget mousex,mousey
r=ginfo_r:g=ginfo_g:b=ginfo_b
swbreak
case 1
color r,g,b
gradf mousex-8,mousey-8,16,16
swbreak
default
swbreak
swend
}
title ""+mousex+" "+mousey
}
await 16
loop
|
|
2015/8/13(Thu) 16:04:48|NO.70698
onclickとoncmdを使った方法
これだと複数重なっててもマウスカーソル下のウィンドウを操作先に出来る
repeat 480/16
gradf 0,cnt*16,640,16,0,$ff<<cnt,$ff000000>>cnt
loop
onclick gosub *_click
oncmd gosub *_MOUSEMOVE,$200 //WM_MOUSEMOVE
screen 1,640,480,,ginfo_wx2,ginfo_wy1
gsel 1,1 //確実にウィンドウをアクティブにしないと前のウィンドウにoncmd命令が使われてしまうようなので
oncmd gosub *_MOUSEMOVE,$200
screen 2,128,128
gsel 2,1
oncmd gosub *_MOUSEMOVE,$200
gsel 2,2
gsel 0,1
stop
*_CLICK
if ginfo_act ! ginfo_sel {gsel ginfo_act}//HSPウィンドウ内でクリックされた時に操作先が別IDだったらアクティブなウィンドウを操作先にする
gosub *draw
return
*_MOUSEMOVE
gsel ginfo_intid
gosub *draw
return
*draw
getkey mlc,1
if mlc {
switch ginfo_sel
case 0
pget mousex,mousey
r=ginfo_r:g=ginfo_g:b=ginfo_b
swbreak
case 1
color r,g,b
gradf mousex-8,mousey-8,16,16
swbreak
case 2
color r,g,b
gradf mousex-8,mousey-8,16,16
swbreak
default
swbreak
swend
}
title ""+mousex+" "+mousey
return
|
|
2015/8/13(Thu) 16:50:27|NO.70701
更にサンプルスクリプトありがとうございます
なんか難しそうなサンプルスクリプト提示されて
理解するの大変そうだなーって思ってた状況が自分にw
(ちょっとふざけ気味ですいません)
>//連続したIDでクリックした時にアクティブになるウィンドウを操作先にするだけなら3つ以上も可
クックブックのエディタはマウス操作可2つとボタンとか操作するウィンドゥがあるので
ウィンドゥ3つとして計算した方がいいですか?
操作可2つ+メモ帳でも試しましたが
大丈夫そうなので 対象はアプリ内で使用するウィンドゥのみですか?
このTOOLを二つ起動して試してみましたが
アプリ内2つとか3つとかぽいですね
アレ呼んだりコレ呼んだり大変そうなので
>NO.70696 を
使おうかな?と思ってますが
他に不具合の出そうな状況はありますか?
|
|
2015/8/13(Thu) 19:02:33|NO.70706
>他に不具合の出そうな状況はありますか?
エディタの作りでどうにでもなるので分からない
|
|
2015/8/16(Sun) 18:20:15|NO.70813
|
|
2015/8/16(Sun) 19:13:51|NO.70814
>*win_chk
> gsel 0,1
この gsel 0,1 が原因
|
|
2015/8/18(Tue) 14:09:19|NO.70884
そう言えば サンプルスクリプトへの謝辞を書いていませんでした
おかげさまでスクリプトが一応タスク完了いたしました
ウィンドゥの操作とかホント疎くて
サンプルスクリプトがなければタスク完了できなかったでしょう
重ね重ね ありがとうございました
そしてクックブックの存在にも ありがとうございました
と付け加えておきます
手抜き画像の概要は
64×64の
横4×縦2です
LINK切れになった時のために
Mitukiさんがお礼書いてないと怒られてるのを読んで
そう言えば 僕もお礼を書いたことがほとんどないことに気づきましたので
書き込みさせていただきました
追記
と、思いきやこのスレでは珍しくお礼を書きながら
話しを進めていたので一応一安心
|
|
2015/8/26(Wed) 13:22:25|NO.71067
*クックブック2.6掲載 かんたんマップエディター 3.x移植
原スクリプト:おにたま様
サンプルスクリプト:暇人様
編:y.tack
このスクリプトはオリジナルではないので
y.tackは著作権を主張しません
ということは噂どおりならBSDライセンス
そうでなければ著作権表示のない著作権のスクリプトです
// parts=0
onexit *owari
sdim fname,512
buffer 2:picload "mapbg.bmp"
mapsx=32:mapsy=32
mapvx=10:mapvy=7
partsx=winx:partsy=winy
gosub *mapinit
// screen 5,partsx,partsy,12:title "Parts"
screen 1,256,128,12:title "Parts"
// picloadしたのが256,128 windowID 5→1
gosub *selparts
screen 4,160,96,12:title "Tool"
cls 1:objmode 1,1:objsize 40,24
pos 0,0:input mapsx,40,24
pos 50,0:input mapsy,40,24
pos 120,0:button "変更",*sizechg
button "セーブ",*mapsave
button "ロード",*mapload
button "終了",*owari
screen 0,mapvx*64,mapvy*64,0
cls 1
mapx=0:mapy=0
*main
gsel 0:gosub *putmap // *putmap 未実装→一応実装
title "マップエディター("+mapx+","+mapy+")"
*main2
wait 5:stick a,271,1
if a=0 : goto *main2
if a&$300 : goto *msbtn // *msbtn 未実装→一応実装
if a&1 : mapx--
if a&4 : mapx++
if a&2 : mapy--
if a&8 : mapy++
if mapx<0 : mapx=0
if mapx+mapvx>=mapsx : mapx=mapsx-mapvx
if mapy<0 : mapy=0
if mapy+mapvy>=mapsy : mapy=mapsy-mapvy
goto *main
// サブルーチン
*msbtn // サブルーチン 一応実装
goto *win_chk
*end_chk
x=mousex/64:y=mousey/64
if (x>=mapvx)or(y>=mapvy) : goto *main2
x=x+mapx:y=y+mapy
if a&256 : map.x.y=parts : goto *main
parts=map.x.y:gosub *selparts // parts定義
goto *main
*mapload // サブルーチン 一応実装
logmes "load"
dialog "map",16
if stat=0 : goto *main
fname=refstr:bload fname,mapdata,8
mapsx=mapdata.0:mapsy=mapdata.1
gosub *mapinit
bload fname,mapdata
memcpy map,mapdata.2,datasize
gsel 4:objprm 0,mapsx:objprm 1,mapsy
goto *main
*mapsave // サブルーチン 一応実装
logmes "save"
dialog "map",17
if stat=0 : goto *main
memcpy mapdata.2,map,datasize
fname=getpath(refstr,1)
bsave fname+".map",mapdata
goto *main
*sizechg
gosub *mapinit
goto *main
*putmap // サブルーチン 一応実装
; マップ描画
redraw 0:gmode 0,64,64
repeat mapvy:y=cnt
repeat mapvx:x=cnt
pos x*64,y*64
mx=x+mapx:my=y+mapy:a=map.mx.my
gcopy 2,(a\4)*64,(a/4)*64 // 計算順序指定
loop:loop
redraw 1
return
*mapinit // サブルーチン 一応実装
dim map,mapsx,mapsy
datasize=mapsx*mapsy*4
dim mapdata,datasize+2
mapdata.0=mapsx:mapdata.1=mapsy
return
*selparts // サブルーチン 一応実装
gsel 1:x=(parts\4)*64:y=(parts/4)*64 // windowID 5→1
// pos 0,0:gcopy 2,0,0,partsx,partsy // gcopy 3.xでそのまま動くか不明
pos 0,0:gcopy 2,0,0,256,128 // gcopy 3.xでそのまま動くか不明
color 255,255,255:boxf x,y,x+63,y+1
boxf x,y+62,x+63,y+63
return
*pbtn // サブルーチン 一応実装
parts=(mousey/64*4)+(mousex/64) // parts定義
gosub *selparts:goto *main
*owari
dialog "終了してもいいですか?",3
if stat!=6 : goto *main
end
*win_chk
wincnt=0 //マウスカーソルの下にあるHSPウィンドウの数
dim ar_tmp,4
ar_tmp.0=0
ar_tmp.1=1
ar_tmp.2=4
repeat 3 //連続したIDでクリックした時にアクティブになるウィンドウを操作先にするだけなら3つ以上も可
gsel ar_tmp.cnt
if (ginfo_mx>ginfo_wx1) and (ginfo_mx<ginfo_wx2) and (ginfo_my>ginfo_wy1) and (ginfo_my<ginfo_wy2) {//操作先ウィンドウ上にマウスカーソルがある
winsel = ar_tmp.cnt //cntをウィンドウIDとして保持
wincnt++
}
loop
if wincnt {//どちらかのウィンドウにマウスカーソルがある
if wincnt>1 {//重なってる領域にマウスカーソルがある
if ginfo_act>=0 {gsel ginfo_act}//アクティブ(通常上にあるウィンドウ)なウィンドウを操作先にする
}else{//重なってないウィンドウ内にマウスカーソルがある
gsel winsel //wincntが1なのでwinselに入ってるIDを捜査先にする
}
getkey mlc,1
if mlc {
switch ginfo_sel
case 0
goto *end_chk
swbreak
case 1
goto *pbtn
swbreak
default
swbreak
swend
}
title ""+mousex+" "+mousey
}
goto *main2
超手抜き画像
http://zuzazann.boy.jp/bmp_okiba/mapbg02.bmp
詳しい解説はクックブックに載っているため
「HSP2.6ゲームプログラミング・クックブック」
をAmazon等でご購入ください
#150826誤字バグ直しておきました。指摘してくれた方。Thank you so much!
| |
|