始めたばかりで・・・

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

始めたばかりで・・・

#1

投稿記事 by 深黒 » 15年前

すみません、初心者C言語初心者です
カードゲームを作ろうと意気込んで、
カードをクリックしてそのカードを場に出す…みたいのをやろうと思ったのですが、クリック判定はどのようにプログラムを打てばいいのか分かりません…
どうか教えてくださいませんか? 画像

たいちう

Re:始めたばかりで・・・

#2

投稿記事 by たいちう » 15年前

色々方法はありますが、定番の1つを紹介します。

http://www.kumei.ne.jp/c_lang/index_sdk.html
http://www.kumei.ne.jp/c_lang/mfc/mfc_04.htm

深黒

Re:始めたばかりで・・・

#3

投稿記事 by 深黒 » 15年前

すみません、わざわざ返答してくださったのに、いまいちよく分からなかったです…
範囲を指定して、その範囲内でクリックされた時に、何かしらのアクションを起こすみたいなのがやりたいのですが…
あ、念のため書いておきますと、Visual C++ 2008を使用していて、http://dixq.net/g/ のページで、DXライブラリを使用できる状態にしました。


やっくん

Re:始めたばかりで・・・

#5

投稿記事 by やっくん » 15年前

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:始めたばかりで・・・

#6

投稿記事 by 深黒 » 15年前

やっくんさんのを参考に、とりあえず使い方を理解するために
とりあえず指定範囲内をクリックしたら画像を表示するなんて物を組んだのですが…
うまくいきません。
使い方かループの作り方が間違ってるのだと思いますが…
指摘お願いします

#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 ; // ソフトの終了
}

ru

Re:始めたばかりで・・・

#7

投稿記事 by ru » 15年前

#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:始めたばかりで・・・

#8

投稿記事 by やっくん » 15年前

これで注意しなければいけないところは、ループ内で左クリックした場合に再度左クリックをするまで永続的にmouse_pos_Xとmouse_pos_Yは同じ値を取っているということです。

つまり、漆黒さんのソースでは
x座標:0~100
y座標:0~99
となっていますが、この枠の中でクリックした場合、マウスの座標変数はこの範囲の値を常に指します。
よって何度もこの枠の中の処理を繰り返します。

もし、クリックをして一度しか処理をさせたくない場合はwhileループ中の先頭にマウスの座標変数を初期化すると良いかと思います。

でも、このソースでwhileループの中で初期化を行ったら、ループのたびにスクリーンがクリアされるので1度クリックしたら1回だけ画像が表示されてすぐ消えてしまいます。

このことを頭においてマウスの処理を行うと良いですよ

深黒

Re:始めたばかりで・・・

#9

投稿記事 by 深黒 » 15年前

お二人の意見を取り入れてみたら出来ました!
お二人とも返信ありがとうございました!!
m(_ _)m

閉鎖

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