ページ 1 / 1
始めたばかりで・・・
Posted: 2010年5月22日(土) 16:47
by 深黒
すみません、初心者C言語初心者です
カードゲームを作ろうと意気込んで、
カードをクリックしてそのカードを場に出す…みたいのをやろうと思ったのですが、クリック判定はどのようにプログラムを打てばいいのか分かりません…
どうか教えてくださいませんか?

Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 17:07
by たいちう
Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 18:01
by 深黒
すみません、わざわざ返答してくださったのに、いまいちよく分からなかったです…
範囲を指定して、その範囲内でクリックされた時に、何かしらのアクションを起こすみたいなのがやりたいのですが…
あ、念のため書いておきますと、Visual C++ 2008を使用していて、
http://dixq.net/g/ のページで、DXライブラリを使用できる状態にしました。
Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 18:06
by ru
Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 18:21
by やっくん
ruさんが示されたURL内の関数を用いて、任意の範囲でのマウスの押し状態を調べます。
カードの座標をこのように仮定します。
x座標:30~59
y座標:40~99
クリック判定をしたい場合
int mouse_pos_X; // マウスのx座標
int mouse_pos_Y; // マウスのy座標
mouse_pos_X = -1; // 初期化
mouse_pos_Y = -1; // 初期化
if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0){// 左クリックされたら
GetMousePoint(&mouse_pos_X, &mouse_pos_X); // マウスの座標を取得
}
// もし取得したマウスの座標がカードの内側だったら。
if(mouse_pos_X >= 30 && mouse_pos_X <= 59 && mouse_pos_Y >= 40 && mouse_pos_Y <= 99){
// 処理
}
でどうでしょう?
実際はループなどを組み合わせなければいけません。
ここでは省略させてもらっているのでこれでは動きません(^^;

Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 19:35
by 深黒
やっくんさんのを参考に、とりあえず使い方を理解するために
とりあえず指定範囲内をクリックしたら画像を表示するなんて物を組んだのですが…
うまくいきません。
使い方かループの作り方が間違ってるのだと思いますが…
指摘お願いします
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
SetGraphMode( 800 , 600 , 32 ) ;
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int mouse_pos_X; // マウスのx座標
int mouse_pos_Y; // マウスのy座標
mouse_pos_X = -1; // 初期化
mouse_pos_Y = -1; // 初期化
while(1){
if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0){// 左クリックされたら
GetMousePoint(&mouse_pos_X,&mouse_pos_Y); // マウスの座標を取得
}
// もし取得したマウスの座標がカードの内側だったら。
if(mouse_pos_X >= 0 && mouse_pos_X <= 100 && mouse_pos_Y >= 0 && mouse_pos_Y <= 99){
LoadGraphScreen( 0 , 0 , "field.bmp" , TRUE ) ;
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 20:00
by ru
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
SetGraphMode( 800 , 600 , 32 ) ;
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int mouse_pos_X; // マウスのx座標
int mouse_pos_Y; // マウスのy座標
mouse_pos_X = -1; // 初期化
mouse_pos_Y = -1; // 初期化
SetDrawScreen( DX_SCREEN_BACK ) ;
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
ClearDrawScreen() ;
if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0){// 左クリックされたら
GetMousePoint(&mouse_pos_X,&mouse_pos_Y); // マウスの座標を取得
}
// もし取得したマウスの座標がカードの内側だったら。
if(mouse_pos_X >= 0 && mouse_pos_X <= 100 && mouse_pos_Y >= 0 && mouse_pos_Y <= 99){
LoadGraphScreen( 0 , 0 , "field.bmp" , TRUE ) ;
}
ScreenFlip() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 20:34
by やっくん
これで注意しなければいけないところは、ループ内で左クリックした場合に再度左クリックをするまで永続的にmouse_pos_Xとmouse_pos_Yは同じ値を取っているということです。
つまり、漆黒さんのソースでは
x座標:0~100
y座標:0~99
となっていますが、この枠の中でクリックした場合、マウスの座標変数はこの範囲の値を常に指します。
よって何度もこの枠の中の処理を繰り返します。
もし、クリックをして一度しか処理をさせたくない場合はwhileループ中の先頭にマウスの座標変数を初期化すると良いかと思います。
でも、このソースでwhileループの中で初期化を行ったら、ループのたびにスクリーンがクリアされるので1度クリックしたら1回だけ画像が表示されてすぐ消えてしまいます。
このことを頭においてマウスの処理を行うと良いですよ
Re:始めたばかりで・・・
Posted: 2010年5月22日(土) 20:58
by 深黒
お二人の意見を取り入れてみたら出来ました!
お二人とも返信ありがとうございました!!
m(_ _)m