こんばんわ。
今はじめて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の部分をクリックしたときもなにも起こりません。
この原因を教えていただきたいです。
またクリックですすめる方式でのもっといい方法があれば教えていただきたいです。
よろしくお願いいたします。
クリック関連の関数について。DXライブラリ初心者です。
Re: クリック関連の関数について。DXライブラリ初心者です。
ソース読みました。問題の原因を述べたいと思います。
まず、
for制御文の中にある 'else return 0;' が必要ありません。このコードがあるがために、 必ず一回目のループで関数から
ぬけています。
それから、
変数mpara[] は static MenuPara mpara[6]; と宣言されているので、mpara[0] ~ mpara[5] の範囲でしかアクセスできません。
関数Menu_Initialize()内のfor制御文で 変数mpara[]が範囲外であるmpara[6]にアクセスしているため、
変数trightの内容が書き換えられています。(デバックで確認することが出来ます)
これにより、関数Menu_Click()内の"Title"部分のクリック判定処理が正しくなされていません。
まず、
この問題は、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;
}
ぬけています。
それから、
この問題は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);
}
}
関数Menu_Initialize()内のfor制御文で 変数mpara[]が範囲外であるmpara[6]にアクセスしているため、
変数trightの内容が書き換えられています。(デバックで確認することが出来ます)
これにより、関数Menu_Click()内の"Title"部分のクリック判定処理が正しくなされていません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: クリック関連の関数について。DXライブラリ初心者です。
問題点は指摘されているので、読みやすく書くってポイントだけ解説していきます。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: クリック関連の関数について。DXライブラリ初心者です。
みなさんありがとうございました!
とてもわかりやすかったです。
僕は学校で学習したDelphiで最初にゲームを作ったので配列をいつも
x:array[1..20] of integer;
などのようにいつも1からやっていたので頭がそこまで回らなかったです。
それとreturnをいれるとfor文を抜け出すとのことですがそれはwhile文などでも同様でしょうか?
あとコードを見やすくというのもこれから心がけたいと思います。
ありがとうございました。
とてもわかりやすかったです。
僕は学校で学習したDelphiで最初にゲームを作ったので配列をいつも
x:array[1..20] of integer;
などのようにいつも1からやっていたので頭がそこまで回らなかったです。
それとreturnをいれるとfor文を抜け出すとのことですがそれはwhile文などでも同様でしょうか?
あとコードを見やすくというのもこれから心がけたいと思います。
ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: クリック関連の関数について。DXライブラリ初心者です。
returnは、その場で関数を抜けて呼び出し元に戻る命令です。Xoke さんが書きました: それとreturnをいれるとfor文を抜け出すとのことですがそれはwhile文などでも同様でしょうか?
1つループを抜けてループの外に出るのはbreak;ですね。
returnとbreakはDelphiでも同じ動作の命令があるはずですが。
「CとDelphiの対比表」
http://www.geocities.jp/fjtkt/program/2003_0024.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。