トップページ > 記事閲覧
ウィンドウサイズを変更したらマウス座標がずれる
名前:みこ 日時: 2024/12/17 11:25

いつもお世話になっております。 表題の不具合を見つけましたのでご連絡させて頂きます。 ウィンドウサイズを変更したらマウス座標が1ピクセルずれます。 以下を実行すると現象が確認できるかと思います。 【ソース】 /*****************************************************/ #include "DxLib.h" #include <string> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, y; // 初期サイズは1920x1080 SetGraphMode(1920, 1080, 32); SetFullSceneAntiAliasingMode(8, 8); SetWindowSizeExtendRate(1.0); ChangeWindowMode(TRUE); SetDoubleStartValidFlag(TRUE); SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); SetWindowText(u8"テスト"); SetChangeScreenModeGraphicsSystemResetFlag(FALSE); SetWindowSizeChangeEnableFlag(TRUE, TRUE); DxLib_Init(); // マウスカーソルを960, 360の位置に移動後そのままマウス座標を取得 SetMousePoint(960, 360); GetMousePoint(&x, &y); DrawString(20, 20, (u8"ウィンドウサイズ変更前 x:" + std::to_string(x) + " y:" + std::to_string(y)).c_str(), 0xffffff); // ウィンドウサイズを変更 SetWindowSize(1920 + 1, 1080 + 1); // 再度マウスカーソルを960, 360の位置に移動してマウス座標を取得 SetMousePoint(960, 360); GetMousePoint(&x, &y); DrawString(20, 40, (u8"ウィンドウサイズ変更後1 x:" + std::to_string(x) + " y:" + std::to_string(y)).c_str(), 0xffffff); // ウィンドウサイズを変更 SetWindowSize(1920 + 2, 1080 + 3); // 再度マウスカーソルを960, 360の位置に移動してマウス座標を取得 SetMousePoint(960, 360); GetMousePoint(&x, &y); DrawString(20, 60, (u8"ウィンドウサイズ変更後2 x:" + std::to_string(x) + " y:" + std::to_string(y)).c_str(), 0xffffff); WaitKey(); return 0 ; // ソフトの終了 } /*****************************************************/ 【出力結果】 ウィンドウサイズ変更前 x:960 y:360 ウィンドウサイズ変更後1 x:959 y:359 ウィンドウサイズ変更後2 x:960 y:360 【詳細】 ・SetGraphMode と 実際のウィンドウサイズに差異がある場合ずれる ・SetGraphMode をウィンドウサイズと同じ大きさに設定するとずれない ・ユーザーによる手動でのウィンドウサイズ変更でもずれる ・『ウィンドウサイズ変更後2』のようにサイズによってはずれない場合もあります よろしくお願いいたします。
メンテ

Page: 1 |

Re: ウィンドウサイズを変更したらマウス座標がずれる ( No.1 )
名前:管理人 日時:2024/12/18 00:39

すみません、計算の原理上微小なサイズの変更による SetMousePoint と GetMousePoint で設定、取得できる 座標に1ピクセルの誤差が生まれるのはどうしようもないので、仕様とさせてください m(_ _;m ( マウスポインタの座標は整数値なので、SetMousePoint の際に x=960.5 y=360.5 の座標が算出されても  実際に移動先となるのは小数点以下を切り捨てた x=960 y=360 となります  GetMousePoint の際は 1921x1081 の画面サイズから補正された画面座標は  x=959.5153962645129 y=359.6669750231267 となり、小数点以下切り捨てで x=959 y=359 となる訳です )
メンテ
Re: ウィンドウサイズを変更したらマウス座標がずれる ( No.2 )
名前:みこ(解決) 日時:2024/12/18 11:24

ご連絡ありがとうございます! なるほどです、、 マウスを画面中央に固定して1フレームで動いたピクセル数を3Dカメラの角度に加算して、マウスでカメラを操作する、 といった処理を作りたかったのですが中央に配置したはずのマウスがどうしても1ピクセルずれてしまうという問題でハマっていました、、、 一先ずウィンドウではなくスクリーン全体から見た座標を取得する事で問題は解決しました。 // ウィンドウサイズと描画領域のサイズが異なると差異が発生するので // WinAPI を使って画面全体のマウス座標を取得 POINT screenPos; GetCursorPos(&screenPos); Touch::MouseMove.x = screenPos.x - MouseHidden_center.x; Touch::MouseMove.y = screenPos.y - MouseHidden_center.y; // マウス位置を真ん中に固定 DxLib::SetMousePoint(Display.x / 2, Display.y / 2); // 画面全体から見てウィンドウの真ん中の位置を保持する GetCursorPos(&screenPos); MouseHidden_center.x = screenPos.x; MouseHidden_center.y = screenPos.y; 因みにですが、 GetMousePoint を double型(またはfloat型)で取得する関数の追加は可能でしょうか? ※x=959.5153962645129 y=359.6669750231267 をそのまま取得したいです お手数をお掛けしますがよろしくお願いいたします。
メンテ
Re: ウィンドウサイズを変更したらマウス座標がずれる ( No.3 )
名前:管理人(解決) 日時:2024/12/20 03:54

> 因みにですが、 > GetMousePoint を double型(またはfloat型)で取得する関数の追加は可能でしょうか? > ※x=959.5153962645129 y=359.6669750231267 をそのまま取得したいです 可能ではありますが、若干実装が煩雑になる上にあまりにも需要が少なそうなので実装は控えたい所です… 仮にそのままの値を取得できた場合、どのような処理で使用されるのでしょうか…?
メンテ
Re: ウィンドウサイズを変更したらマウス座標がずれる ( No.4 )
名前:みこ(解決) 日時:2024/12/29 20:23

そこまで問題ではないかもしれませんが、 FPSシューティングゲームなどの場合コアなゲーマーだとかなり精密な動きでマウス操作をすると思いますので、 1以下の小数点の誤差が致命的になるのではないかと思って提案させて頂きました。 ※私はコアなゲーマーでは無いので違いは分かりかねますが... とは言え先ほどの画面全体のマウス座標で問題は解決できたので私にとっても需要が少ないので 追加の有無は管理人様のご判断に任せます!
メンテ
Re: ウィンドウサイズを変更したらマウス座標がずれる ( No.5 )
名前:名無三 日時:2024/12/29 21:39

FPSだと概ね前フレームとの差を元にするので、毎フレーム変化するのでなければ問題はないでしょう。デッドゾーン(一定以上マウス/アナログスティックを動かさないと反応しないとする範囲)を決めることでも対応できます
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存