GetMousePoint()について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
トレシャ

GetMousePoint()について

#1

投稿記事 by トレシャ » 13年前

現在DXライブラリを使用した将棋のようなゲームを作成しています。
そこで困ったことがありましたので質問させていただきます。

駒の状態を

コード:

int KOMA[BOARD_HEIGHT][BOARD_WIDTH] =
{	
	{ 1,1,1,1,1,1,1,1},	
	{ 1,1,1,1,1,1,1,1},		
	{ 0,0,0,1,1,0,0,0 },			
	{ 0,0,0,0,0,0,0,0 },			
	{ 0,0,0,0,0,0,0,0 },			
	{ 0,0,0,0,0,0,0,0 },			
	{ 0,0,0,1,1,0,0,0 },			
	{ 1,1,1,1,1,1,1,1 },			
	{ 1,1,1,1,1,1,1,1 },			
};

void DrawKOMA(){
	for( int i = 0; i <= BOARD_HEIGHT; i++ ){
		for( int j = 0; j < BOARD_WIDTH; j++ ){
			if( BoardCard[i][j] == 0){
				DrawGraph( j*KOMA_SIZE,  i*KOMA_SIZE, KOMA0, FALSE );
			}
			if( BoardCard[i][j] == 1){
				DrawGraph( j*KOMA_SIZE,  i*KOMA_SIZE, KOMA1, FALSE );
			}
		}
	}
}
のようにして駒の画像を表示させています。

ここでマウスを使い、現在のマウスのポインタ下にあるカードの種類を表示したいと思い、

コード:

void DrawSelectKOMA(){
	GetMousePoint( &MouseX, &MouseY );
	DrawFormatString( 100, 100, GetColor(255,255,255), "コマNo: %d", KOMA[MouseY/KOMA_SIZE][MouseX/KOMA_SIZE] );
}
を作成しましたが表示されるのは399521などのまったく関係のない数値です。
原因は恐らくGetMousePoint関数がMouseX,MouseYに与えてる数値はデスクトップ画面左上を(0,0)としているのが原因だと思っています。
現在アクティブにしているウィンドウ(ゲーム)の左上の座標を(0,0)としたマウスの座標を取得できれば改善できると思うのですが・・・。
そのような手法等ありましたらご教授願います。

ライブラリはDXライブラリ
開発環境はMicrosoft VisualC++ 2010 Expressです。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: GetMousePoint()について

#2

投稿記事 by みけCAT » 13年前

DXライブラリのGetMousePoint関数はクライアント座標が返るはずです。
別のところに原因があるかもしれません。

コード:

for( int i = 0; i <= BOARD_HEIGHT; i++ ){
これはバッファオーバーランの危険があります。というかバッファオーバーランします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: GetMousePoint()について

#3

投稿記事 by softya(ソフト屋) » 13年前

GetMousePointで得られるのは特に何もしていない限りウィンドウのクライアント領域が(0,0)の座標だと思います。
ですので原因は別だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: GetMousePoint()について

#4

投稿記事 by Dixq (管理人) » 13年前

> 原因は恐らくGetMousePoint関数がMouseX,MouseYに与えてる数値はデスクトップ画面左上を(0,0)としているのが原因だと思っています。

いえ、そんなことはないでしょう。
ウィンドウ上の左上だと思います。

試してみましたか?

コード:

#include "DxLib.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
		int MouseX, MouseY;
        while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){
			GetMousePoint( &MouseX, &MouseY );
			DrawFormatString( 0, 0, GetColor(255,255,255), "%d,%d", MouseX, MouseY );
        }
        DxLib_End();
        return 0;
} 
MouseX/KOMA_SIZEはいくつですか?
BOARD_WIDTHを超えていませんか?

また、ウィンドウが8:9のアスペクト比じゃないとバッファオーバーランすると思いますが、対策はたっていますか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: GetMousePoint()について

#5

投稿記事 by みけCAT » 13年前

Dixq (管理人) さんが書きました:また、ウィンドウが8:9のアスペクト比じゃないとバッファオーバーランすると思いますが、対策はたっていますか?
ウィンドウのアスペクト比はバッファオーバーランとは関係ないと思います。
画像がはみ出すことはあっても、直接バッファオーバーランにはならないはずです。
むしろマウスカーソルが画面外(コマの描画範囲外)にあるかどうかのチェックが必要です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

トレシャ

Re: GetMousePoint()について

#6

投稿記事 by トレシャ » 13年前

>>みけCAT様
オーバーフローの忠告ありがとうございました。
修正させていただきます。
>>softya様,Dixq様
すみません、GetMousePoint関数を確認してみたところ、きちんとウィンドウ左上を(0,0)としていました。ご迷惑おかけしました。
ご指摘ありがとうございました。
>ウィンドウが8:9のアスペクト比じゃないとバッファオーバーランすると思いますが、対策はたっていますか?
これに関してはアスペクト比を8:9にして修正したいと思います。

迅速丁寧な回答ありがとうございました。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: GetMousePoint()について

#7

投稿記事 by Dixq (管理人) » 13年前

> みけ君
> ウィンドウのアスペクト比はバッファオーバーランとは関係ないと思います。

そんなことはないでしょう。
正確にはアスペクト比というよりも、MouseX/KOMA_SIZEやMouseY/KOMA_SIZEがBOARD_WIDTHやBOARD_HEIGHT以上にならないよう計算されているかが大事ですね。
X方向にははみ出してもある程度許容できそうですが、Y方向にはみ出すと致命的な不具合になりそうです。
ただみけ君も書いている通り、私が言いたかったのは

> むしろマウスカーソルが画面外(コマの描画範囲外)にあるかどうかのチェックが必要です。

こういうことです。アスペクト比が8:9でも配列要素外にアクセスしないように処理していないと不具合はおきます。

> トレシャさん
> これに関してはアスペクト比を8:9にして修正したいと思います。

それはちょっと強引な対応ではないでしょうか。
ボード以外にマウスがある時は、配列要素を参照しないようにすべきだと思います。
また、アスペクト比は4:3が一般的です。
グラフィックカードが対応していない可能性があるので、一般的な解像度を使うのが無難でしょう。

閉鎖

“C言語何でも質問掲示板” へ戻る