FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:スポンサー広告  page to top

[XNA4.0] ScrollWheelValue が!

今日は久しぶりにプログラムの話題。

最近XNA4による開発に、あくまで個人的にはまっているんだけれども、そこではまってしまった罠について。

XNA4C#によって開発可能なゲーム開発環境とでも考えてもらえれば早い。そして、はまった罠というのがマウス状態取得について。
さて、まずXNA4ではマウスの状態を以下のようにしてとることが出来る。

MouseState state = Mouse.GetState();
int x = state.X; // マウスのX座標
int y = state.Y; // マウスのY座標
int scroll = state.ScrollWheelValue; // マウスホイールの回転量(累積)


ところがどっこい、なぜか僕が今作っているアプリ上では…
 ・マウスの回転量である ScrollWheelValue が常に0になって、正常に取れない
 ・座標値を表すXとYも、ウィンドウからではなく、デスクトップの左上からの座標が入ってきてしまう
という症状に見舞われております。あれ~?何で~?

不思議に思って、何もないプロジェクトを作成して同様に取得してみると、あら不思議。普通に取れる。あれあれ~?なぜに~?

というわけで色々と試してみたところ、あることに気がついた。
自分の開発しているアプリでは、なぜかMouse.WindowHandleの値が途中で変化したのだ。Mouse.WindowHandleは、Mouseクラスが関連付けられているウィンドウのハンドルだ。これが変わったと言うことは、今現在の僕のアプリでは、別のウィンドウのマウス状態を取ってしまっているということになる。

そうなれば話は簡単、Mouse.WindowHandleをどこかで書き換えてしまっているのだろう、はてさてどこかな?
と探すこと10分ほど、見つからない…。仕方ないのでデバッグで1ステップごとに追っかけてみてついに犯人をつきとめた。

Game クラスから派生したクラスを new すると、勝手にMouse.WindowHandleが書き換わる!
まじで~?やめてよ~;;

というわけで、上記症状に陥ったら、Gameクラスから派生したクラスを削除するか、あるいは最初の値を保存しておいて、作成後に元に戻してあげれば問題なく動作した。例を挙げれば以下のような感じかね?

IntPtr handle = Mouse.WindowHandle;
Game___ game = new Game___(); // Gameから派生したクラスを作成
Mouse.WindowHandle = handle; // 勝手に書き換わったWindowHandleを元に戻す


はぁー、とてつもなくしょうもない罠に引っかかってしまった。
関連記事

Tag:XNA4.0  Trackback:0 comment:0 page to top

Comment

comment form
(編集・削除用):
プロフィール

Nikukyu

Author:Nikukyu
なんちゃってゲーム開発者をしています。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。