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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0803
y3マウスの移動量の読み取り7解決


y3

リンク

2009/8/3(Mon) 14:56:26|NO.26698

初めて書き込みさせていただきます。

マウスで操作する、FPSもどきのゲームを作っているのですが、
現在のHSPの仕様では画面上のマウスカーソルの位置を
読み取ることしかできないのでしょうか?
今はとりあえず以下のような方法で処理しております。

(マウスで視点操作のテスト)

#include "hgimg3.as" screen 0,640,480,0,0,0 title "[ESC]で終了" hgini onexit *quit dim obj,30 addbox obj_m,20,20 repeat 30 regobj obj(cnt), obj_m x = rnd(100) - 50 z = rnd(100) - 50 setpos obj(cnt), (x*10), 0.0, (z*10) loop ha = 0.0 ;水平方向カメラアングル va = 0.0 ;垂直方向カメラアングル mouse 320,240 mouse -1,-1 *main getkey k,27 if k = 1 : goto *quit mx = double(ginfo(0) - 320) my = double(ginfo(1) - 240) mouse 320,240 mouse -1,-1 ha = ha - (mx / 2000.0) va = va - (my / 2000.0) if ha < -6.2832 : ha = ha + 6.2832 if ha > 6.2832 : ha = ha - 6.2832 if va < -0.5 : va = - 0.5 if va > 0.5 : va = 0.5 setang HGOBJ_CAMERA, va, ha, 0.0 hgdraw hgsync 16 goto *main *quit hgbye end

この方法でも普通に操作はできるのですが、
操作が激しくなるとウィンドウの外をクリックしてしまったり、
高性能なゲーミングマウス等では操作性が悪くなる可能性もあります。
市販のゲームの様に、直にマウスの移動量の数値を読み取りたいのです。

何か良い方法をご存知の方がいらっしゃいましたら、ご教授お願いします。



この記事に返信する


KA

リンク

2009/8/3(Mon) 21:37:31|NO.26715

>>高性能なゲーミングマウス等では操作性が悪くなる可能性もあります。

*main 〜 goto *main 間での処理中に、マウスが行ってしまう可能性でしょうか?


>>市販のゲームの様に、直にマウスの移動量の数値を読み取りたいのです。

市販のゲームは分かりませんが、”移動量”だけ分かっても使えません。
”移動量”と”基点(原点)”が有って、初めて位置が確定できます。
確定するのには計算が必要で、その処理は必ず必要です。

マウスの絶対座標を、ウインドウの位置とサイズで制限した方が、早いような
気もしますが。



y3

リンク

2009/8/3(Mon) 22:10:24|NO.26718

>KAさん

レスありがとうございます。説明不足ですみません。
現在の方法はウィンドウは640*480として、メインループの最初にmouse命令で
ウィンドウの中心(320,240)へ強制移動し、
次のループの頭にマウスカーソルに位置を取得し、また中心へ強制移動・・・
という流れにしております。
現在は1ループ(1フレーム)が60分の1秒としております。

この方法だと、縦方向はともかく、一番操作量の多いマウスの左右移動量が
各320ドットに制限されてしまいます。
ウィンドウモードで、派手にマウスを動かすとウィンドウ上を飛び出してしまって、
ウィンドウの外をクリックしてしまうことがごく稀に起こるのです。
ウィンドウのキャレットが外れますし、他のアプリが誤動作する場合があります。

今使っている一般的なマウスでも稀に起こるので、高性能といわれるマウスだと、
(マウス操作量に対する分解能が高いモノ)だとさらに、ウィンドウから飛び出してしまう
可能性が高いのではないかと危惧しております。
"移動量"と"基準点"については、現在もそのように処理しておりますので、
特に問題ないと思います。

ちなみに現方法はフルスクリーンだとほとんど問題がないので、まさに
「マウスの絶対座標を、ウインドウの位置とサイズで制限した方が、早い」状態です。

ただ、ウィンドウモードだと「制限」以前にHSPのアクティブウィンドウ以外
をクリックしてしまうので、HSPからはほぼ制御できません。

ですから、マウスをHSPのウィンドウにフォーカスしてから、直に数値を読み取った方が
スマートかな・・・と思います。

ただ、WinAPIでもそんなAPIはほとんど見かけなかったので、やっぱりDirect_inputから
読み取るしかないのかなと思っております・・・



inovia

リンク

2009/8/3(Mon) 22:51:52|NO.26722

マウスカーソルがウィンドウの外へ出ないようにすれば良さそうです。

#define WM_MOVE 0x0003 #define WM_ACTIVATE 0x0006 #uselib "user32" #func ClipCursor "ClipCursor" sptr oncmd gosub *move,WM_MOVE oncmd gosub *noactive,WM_ACTIVATE onexit *exit gosub *move //一度だけ実行 stop *move dim rect,4 rect.0=ginfo(4) rect.1=ginfo(5) rect.2=ginfo(6) rect.3=ginfo(7) ClipCursor varptr(rect) return *noactive if (wParam&0xFFFF)=0{ ClipCursor 0 }else{ gosub *move } return *exit ClipCursor 0 end



y3

リンク

2009/8/3(Mon) 23:03:24|NO.26723

>inoviaさん

ありがとうございます!
こういうマウスカーソルの制限方法があったのですね!
勉強不足でした・・・・。

さっそく組み込んでみます!
ありがとうございました!



inovia

リンク

2009/8/3(Mon) 23:07:31|NO.26724

先ほどのスクリプトの訂正&コメント追加版

私の環境だけなのか、onexitのところをサブルーチンジャンプにしないと
プロセスが残ってしまいます。


#define WM_MOVE 0x0003 #define WM_ACTIVATE 0x0006 #uselib "user32" #func ClipCursor "ClipCursor" sptr oncmd gosub *move,WM_MOVE oncmd gosub *noactive,WM_ACTIVATE //サブルーチンジャンプにしないとプロセスが何故か残ってしまいます。 onexit gosub *exit gosub *move //一度だけ実行 title "はみ出さないマウスカーソル♪" stop *move //RECT構造体 dim rect,4 rect.0=ginfo(4) ;左上Xスクリーン座標 rect.1=ginfo(5) ;左上Yスクリーン座標 rect.2=ginfo(6) ;右下Xスクリーン座標 rect.3=ginfo(7) ;右下Yスクリーン座標 ClipCursor varptr(rect) //適用 return *noactive if (wParam&0xFFFF)=0{ //非アクティブかどうか ClipCursor 0 //NULLを指定すると解除される }else{ gosub *move } return *exit ClipCursor 0 //終了時に解除 end return



y3

リンク

2009/8/5(Wed) 17:43:14|NO.26769

さらなる追記と修正、ありがとうございます。
最初のテストスクリプトで、当方の環境でも終了後もプロセスが残る現象を確認しました。

でも、ゲームに組み込んだ時にゲームの終了処理で

hgbye ClipCursor 0 end
とするとgotoでも大丈夫でした。

不思議ですね・・・・



y3

リンク

2009/8/5(Wed) 17:54:43|NO.26771

と、よく考えたら、私のゲームの終了処理へのジャンプはほとんど
単純にifで判定してgotoで飛ばすだけで、割り込みは使わないので
その辺の違いがあるかもしれません。



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