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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0605
Gimicmousex mouseyのデフォルト値の設定方法9解決


Gimic

リンク

2011/6/5(Sun) 19:50:41|NO.39559

毎度地味な質問ですが、よろしくお願いします。

マウスの座標位置を取得して○を動かそうとしています。
マウスの初期座標をウィンドウの中央位置にしようと思い、
mouse命令を使って

   mouse ginfo_winx/2,ginfo_winy/2
としました。

しかしながら次のスクリプトを実行すると、左上(x=0,y=0の位置)に1/4の円が
ちらっと描画されてしまいます。
*********************************************************************
最初に書いたスクリプト

#Include <hspdef.as> r=50 mouse ginfo_winx/2,ginfo_winy/2  ;マウスの初期座標を設定 screen 0 cls 4 *main redraw 0 color ,,,:boxf color 255,255,255 circle mousex-r,mousey-r,mousex+r,mousey+r wait 1 redraw 1 goto*main
*********************************************************************

マウスをまったく触っていない状態だとmousex , mouseyが 0 のまま、
mouse命令で初期値を設定しても、それが有効になるのはマウスを触った後、
ということなのかな、とひとまず理解しました。

そこで、mousex , mousey が 0 のときは描画しないようにif文を付け加えてみました。

*********************************************************************
自分で手直ししたスクリプト

#Include <hspdef.as> r=50 mouse ginfo_winx/2,ginfo_winy/2 screen 0 cls 4 *main redraw 0 color ,,,:boxf color 255,255,255 if mousex!=0 & mousey!=0{         ;←このif文を追加 circle mousex-r,mousey-r,mousex+r,mousey+r } wait 1 redraw 1 goto*main
*********************************************************************

一応、結果としては思っていたものが実現できているのですが、釈然としません。。。

mousex , mousey の初期値を 0 以外の数値にする方法ってありませんでしょうか?

よろしくお願いいたします。



この記事に返信する


ひらまる

リンク

2011/6/5(Sun) 20:27:11|NO.39560

これで多分望み通りに動くはずです。
主な変更点は2つで、
mouse命令はウィンドウ内の座標ではなくディスプレイ座標なのと、
MouSexとMouseYは制度が悪いのでginfo_mxとginfo_myを使ったという所です。
あとはコメントを参考にしてください。

;スクリーンは先に作っておく screen 0 cls 4 ;ウィンドウのフレーム部分のサイズを取得 FrameW = ( ginfo_sizex - ginfo_winx ) / 2 FrameH = ginfo_sizey - ginfo_winy - FrameW ;ウィンドウの中心点のディスプレイ座標を取得 CenterX = ginfo_wx1 + FrameW + ginfo_winx / 2 CenterY = ginfo_wy1 + FrameH + ginfo_winy / 2 ;円の半径を設定 r = 50 ;mouse命令はディスプレイ座標で指定 mouse CenterX, CenterY ;メインループ開始 *main redraw 0 color ,,, : boxf color 255, 255, 255 ;マウスの座標はginfo_mx,ginfo_myで取得 MouX = ginfo_mx - ginfo_wx1 - FrameW MouY = ginfo_my - ginfo_wy1 - FrameH ;円を描画 circle MouX-r, MouY-r, MouX+r, MouY+r ;ゲームならばwaitよりもawaitがおすすめ await 1 redraw 1 ;↑ループ goto*main
あとプリプロセッサ命令のスレはこないだもありましたが、
1行目の「#Include <hspdef.as>」で、
「Include」の「I」を大文字にしているので、この行は無効になります。
「#」ではじまる命令は小文字で書かなければならず、
大文字や関係ない文字を入れるとエラーも出ずに無視されます。



GENKI

リンク

2011/6/5(Sun) 20:45:11|NO.39561

こんな感じでどうですか?

r=50 screen 0 mouse ginfo_wx1+ginfo_winx/2, ginfo_wy1+ginfo_winy/2 ;マウスの初期座標を設定 cls 4 *main redraw 0 color : boxf color 255,255,255 x = mousex : y = mousey circle x-r, y-r, x+r, y+r redraw 1 await 10 goto *main
マウスを動かした後にウィンドウを初期化しちゃってるのでmousex,mouseyも0に初期化されちゃってるんだと思います。

そのほか気になったことがあるのですが…。
hspdef.asはincludeは必要ありません。自動的に読み込まれます。(プログラミング・マニュアル参照)
また、↓このスレッドでも言われていますが、「#Include」では動作しないそうです。
http://hsp.tv/play/pforum.php?mode=all&num=39539
いくつもすみません。#includeのパラメータは文字列を渡すのでマニュアルにあるとおりダブルクォーテーション「"」でくくってください。



GENKI

リンク

2011/6/5(Sun) 21:15:25|NO.39562

おっと出遅れたか。

> MouSexとMouseYは制度が悪いのでginfo_mxとginfo_myを使ったという所です。

精度が悪いというと誤解を招いちゃうかも。
mousex/mouseyはちゃんと正確な座標を返しますが、マウスがGUIオブジェクト上にあったりウィンドウの外にあったりすると座標情報を更新しません。
ginfo_mx/ginfo_myを使えばマウスがどこにあってもスクリーン座標を返しますが、使用の際はひらまるさんがやってるようにウィンドウ座標系への変換作業が必要です。
関連資料:
http://hspdev-wiki.net/?%A5%A6%A5%A3%A5%F3%A5%C9%A5%A6%B3%B0%A4%E4%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BE%E5%A4%CE%A5%DE%A5%A6%A5%B9%BA%C2%C9%B8%A4%F2%BC%E8%C6%C0

そうだった。座標変換にはobj.asモジュールを使う方法もありますね。他のモジュールとの組み合わせると問題出るかもなのでお勧めじゃないですが。



Gimic

リンク

2011/6/6(Mon) 21:04:18|NO.39565

>>ひらまるさん
なるほど。
まずは、FrameW、FrameHでフレーム部分の幅をとって
  ginfo_wx1(ウィンドウの左端)
+ FrameW(フレーム幅)
+ ginfo_winx / 2(描画エリアの1/2)
でCenterX(中央座標)を求めるんですね。

こんなに極め細やかに書くんですねぇ…。

併せて、screen、clsの記述位置、メインループの記述位置のご指摘ありがとうございます!

#includeですが、記載していただいたスレッド見ていたのですが、
「大文字と小文字のどっちが正しかったっけ?」と思った後、
「確か大文字」と曖昧な記憶のまま、確認を怠りつつの結果です。。。

でもこれで皆さんが発言していた「エラーとして認識されない」問題点について深く理解できました。
大文字でもそのまま通っちゃうんですね。。。これはやっかい。


>>GENKIさん
#includeについて同様のご指摘ありがとうございます^^
プログラミング・マニュアル『2-19HSP拡張マクロ』を読みました。
また、関連資料のご紹介ありがとうございます!
ここも読み込み甲斐がありますね。。。
色々研究してみます^^

ありがとうございました^^



ひらまる

リンク

2011/6/7(Tue) 14:27:13|NO.39566

あ、中心座標を取得するだけなら

;ウィンドウの中心座標は、 ;ウィンドウの左上の座標 + ウィンドウのフレームも含めたサイズ / 2 CenterX = ginfo_wx1 + ginfo_sizex / 2 CenterY = ginfo_wy1 + ginfo_sizey / 2
で出来るということに気づいてしまいました;
フレームサイズは、マウスのウィンドウ内座標を取得するときに必要になるのです。

;マウスのウィンドウ内座標は、 ;マウスのディスプレイ座標 - ウィンドウの左上の座標 - フレームサイズ MouX = ginfo_mx - ginfo_wx1 - FrameW MouY = ginfo_my - ginfo_wy1 - FrameH
実行結果は何も変わりませんが、
自分が書いた責任があるので追記しておきます。



Gimic

リンク

2011/6/7(Tue) 19:06:35|NO.39567

>>ひらまるさんへ
すみません。1点質問です。

(1)単にマウスの中心座標を取得する場合と、
(2)マウスのウィンドウ内座標を取得する場合

(1)と(2)は使う場面が違うなど明確な使い分けがあるのでしょうか?

…うまく言えませんが。。。

(1)は今回のようにマウスの初期位置を設定するために使う…とおぼろげに感じますが、

(2)はどんなときによく使う(?)んでしょうか。

重ねての質問ですが、回答いただけると助かります^^;

よろしくお願いします。



ひらまる

リンク

2011/6/7(Tue) 21:00:51|NO.39569

ええと…ごめんなさい 質問の意味がよくわからなかったので的外れかもしれません。

Gimicさんもおっしゃっていますが、
MouseX,MouseYは、
>マウスがGUIオブジェクト上にあったりウィンドウの外にあったりすると座標情報を更新しません。
以下を実行してみてください。
mousex,mouseyは、
マウスカーソルがウィンドウの外にある場合座標を取得できず、
さらにウィンドウ内から素早くマウスをウィンドウ外に移動すると、
mousexとmouseyの値は直前の値に固定されてしまいます。
ウィンドウのはじっこでマウスをいろいろ動かして、
なんとなく実感してください;

FrameW = ( ginfo_sizex - ginfo_winx ) / 2 FrameH = ginfo_sizey - ginfo_winy - FrameW r = 50 *main redraw 0 color : boxf MouX = ginfo_mx - ginfo_wx1 - FrameW MouY = ginfo_my - ginfo_wy1 - FrameH ;↓だけ重要 color 255, 0, 0 pos 10, 10 mes "mousex = " + mousex mes "mousey = " + mousey circle mousex-r,mousey-r,mousex+r,mousey+r color 0, 0, 255 pos 200, 10 mes "MouX = " + MouX mes "MouY = " + MouY circle MouX-r,MouY-r,MouX+r,MouY+r ;↑だけ重要 await 1 redraw 1 goto*main



ひらまる

リンク

2011/6/7(Tue) 21:02:17|NO.39570


>マウスがGUIオブジェクト上にあったりウィンドウの外にあったりすると座標情報を更新しません。
はGENKIさんの発言でしたね;
Gで始まるので見間違えてしまいました(えー)



Gimic

リンク

2011/6/7(Tue) 22:05:55|NO.39571



わかりました^^;
考えすぎてました。サンプルみて実感できました。

ありがとうございました^^



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