HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0812
y.tack複数のウィンドゥをマウスで操作出来ますか?11解決


y.tack

リンク

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
左のウィンドウで左クリックすると色を拾って
右のウィンドウで左クリックすると拾った色で四角を描画



y.tack

リンク

2015/8/13(Thu) 08:19:31|NO.70683

サンプルスクリプトありがとうございます

実現出来るけどサンプルにふさわしいほど簡単には出来ない
みたくは思ったんですよね(APIとか使って)



y.tack

リンク

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



y.tack

リンク

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

>他に不具合の出そうな状況はありますか?
エディタの作りでどうにでもなるので分からない



y.tack

リンク

2015/8/16(Sun) 18:20:15|NO.70813

超手抜き画像を用意しましたw
http://zuzazann.boy.jp/bmp_okiba/mapbg02.bmp



暇人

リンク

2015/8/16(Sun) 19:13:51|NO.70814

>*win_chk
> gsel 0,1
この gsel 0,1 が原因



y.tack

リンク

2015/8/18(Tue) 14:09:19|NO.70884

そう言えば サンプルスクリプトへの謝辞を書いていませんでした
おかげさまでスクリプトが一応タスク完了いたしました
ウィンドゥの操作とかホント疎くて
サンプルスクリプトがなければタスク完了できなかったでしょう
重ね重ね ありがとうございました
そしてクックブックの存在にも ありがとうございました
と付け加えておきます

手抜き画像の概要は
64×64の
横4×縦2です
LINK切れになった時のために

Mitukiさんがお礼書いてないと怒られてるのを読んで
そう言えば 僕もお礼を書いたことがほとんどないことに気づきましたので
書き込みさせていただきました

追記
と、思いきやこのスレでは珍しくお礼を書きながら
話しを進めていたので一応一安心



y.tack

リンク

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!



ONION software Copyright 1997-2021(c) All rights reserved.