クリック関連の関数について。DXライブラリ初心者です。

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

クリック関連の関数について。DXライブラリ初心者です。

#1

投稿記事 by Xoke » 12年前

こんばんわ。
今はじめてDXライブラリでのゲーム制作に挑んでいるのですが、早速つまづいてしまいました。
自分のプログラムを見ていただいて解決策を教えていただきたいです。
以下のURLです。PWは「4110」です。
http://kie.nu/SIu

このゲームはクリックですすめる形式にしようと思っていて、
title.h,title.cppのtitle_clickのようにクリックされたところがある4点のなかにあったらFaseを切り替えています。
見ていただきたいところはmenu.h,menu.cppのmenu_clickで、
title_clickと同じように判定しているつもりなのですが、実行したところfor分の制御変数1のときしかクリックされたことになっていません。
またTitleの部分をクリックしたときもなにも起こりません。
この原因を教えていただきたいです。

またクリックですすめる方式でのもっといい方法があれば教えていただきたいです。
よろしくお願いいたします。

アバター
HolyWings
記事: 12
登録日時: 14年前

Re: クリック関連の関数について。DXライブラリ初心者です。

#2

投稿記事 by HolyWings » 12年前

ソース読みました。問題の原因を述べたいと思います。

まず、
Xoke さんが書きました:menu.h,menu.cppのmenu_clickで、
title_clickと同じように判定しているつもりなのですが、実行したところfor分の制御変数1のときしかクリックされたことになっていません。
この問題は、

コード:

int Menu_Click(int mx,int my){
	for(i=1; i<=6; i++){
	if(((mpara[i].left<=mx)&&(mx<=mpara[i].right))&&((mpara[i].top<=my)&&(my<=mpara[i].bottom))) return i;
	else return 0;
	}
	if(((tleft<=mx)&&(mx<=tright))&&((ttop<=my)&&(my<=tbottom))) return 7;
	else return 0;
}
for制御文の中にある 'else return 0;' が必要ありません。このコードがあるがために、 必ず一回目のループで関数から
ぬけています。

それから、
Xoke さんが書きました:Titleの部分をクリックしたときもなにも起こりません。
この問題は

コード:

void Menu_Initialize(){
	StrLen=strlen(str1);
	BackImage=LoadGraph("pictures/menu.png");
	GetScreenState(&WWidth,&WHeight,&WBit); // Screenの大きさ取得
	SetFontThickness(3); // 文字の太さを設定
	SetFontSize(FontSize); // Fontサイズ設定
	ChangeFont( "MS 明朝" ) ; // Font設定
	ChangeFontType(DX_FONTTYPE_ANTIALIASING_EDGE); // Fonttype設定(アンチエイリアス、エッジ)
	tleft=WWidth/2-GetDrawFormatStringWidth(str2)/2;
	tright=WWidth/2+GetDrawFormatStringWidth(str2)/2;
	ttop=WHeight/30*29-FontSize/2;
	tbottom=WHeight/30*29+FontSize/2;
	for(i=1; i<=6; i++){ 
		mpara[i].left=WWidth/10*2-GetDrawFormatStringWidth(str1)/2;
		mpara[i].right=WWidth/10*2+GetDrawFormatStringWidth(str1)/2;
		mpara[i].top=WHeight/7*i-FontSize/2-20;
		mpara[i].bottom=WHeight/7*i+FontSize/2-20;
		sprintf(ch,"pictures/stage/stage%dsam.png",i);
		mpara[i].image=LoadGraph(ch);
	}
}
変数mpara[] は static MenuPara mpara[6]; と宣言されているので、mpara[0] ~ mpara[5] の範囲でしかアクセスできません。
関数Menu_Initialize()内のfor制御文で 変数mpara[]が範囲外であるmpara[6]にアクセスしているため、
変数trightの内容が書き換えられています。(デバックで確認することが出来ます)
これにより、関数Menu_Click()内の"Title"部分のクリック判定処理が正しくなされていません。

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

Re: クリック関連の関数について。DXライブラリ初心者です。

#3

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

問題点は指摘されているので、読みやすく書くってポイントだけ解説していきます。

コード:

int Menu_Click( int mx, int my ) {
	for( i = 1; i <= 6; i++ ) {	//インデントはバグの元なので正確に行います。
		if(	( ( mpara[i].left <= mx ) && ( mx <= mpara[i].right  ) ) &&		//2行に分けたほうが読みやすい場合があります。
			( ( mpara[i].top  <= my ) && ( my <= mpara[i].bottom ) ) 	) {	//ifの{}は省略しないほうがバグを産みません。
			return i;
		} else {
//			return 0;
		}
	}
	if( ( ( tleft <= mx ) && ( mx <= tright  ) ) &&
		( ( ttop  <= my ) && ( my <= tbottom ) ) 	)	{
		return 7;	//returnを揃えるとどういう処理なのか凄く分かりやすくなります。
	} else {
		return 0;
	}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Xoke

Re: クリック関連の関数について。DXライブラリ初心者です。

#4

投稿記事 by Xoke » 12年前

みなさんありがとうございました!
とてもわかりやすかったです。

僕は学校で学習したDelphiで最初にゲームを作ったので配列をいつも
x:array[1..20] of integer;
などのようにいつも1からやっていたので頭がそこまで回らなかったです。

それとreturnをいれるとfor文を抜け出すとのことですがそれはwhile文などでも同様でしょうか?

あとコードを見やすくというのもこれから心がけたいと思います。
ありがとうございました。

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

Re: クリック関連の関数について。DXライブラリ初心者です。

#5

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

Xoke さんが書きました: それとreturnをいれるとfor文を抜け出すとのことですがそれはwhile文などでも同様でしょうか?
returnは、その場で関数を抜けて呼び出し元に戻る命令です。
1つループを抜けてループの外に出るのはbreak;ですね。

returnとbreakはDelphiでも同じ動作の命令があるはずですが。
「CとDelphiの対比表」
http://www.geocities.jp/fjtkt/program/2003_0024.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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