はじめまして、DXライブラリでVC++EE2008でシューティングゲームをつくっているのですが、どうしてもうまくいかないもので質問します
選択画面の拡張で右キーを押したらメニュー更新するプログラムなんですが、キーを押したら選択できるメニューの最大値までいってしまうので困っています
左キーによる戻りは一個ずつ戻るので正常なのですが(もちろんキーをかえてみてもメニューの最大値まで行ってしまうのでキーには問題なさそうに思えるのですが)
以下がそのソースです
void SelectDraw( int x , int y , char title[/url] , const char **str , int &select )
{
int num=0;
int dx=0,len=0;
const char **str2 = str;
//タイトル表示
dx = x - GetDrawFormatStringWidthToHandle( font[1], title ) / 2;
DrawFormatStringToHandle( dx, y, color[0], font[1], "%s", title );
y += 30; //改行
//情報の取得
while ( strcmp( *str2, "NULL" ) != 0 )
{
if( len < GetDrawFormatStringWidthToHandle( font[0] , *str2 ) )
{
len = GetDrawFormatStringWidthToHandle( font[0] , *str2 );
}
++num;
*str2++;
}
dx = x - len / 2;
//選択制御
if( CheckStatePad(configpad.up) == 1 && select > 0 )
--select;
else if( CheckStatePad(configpad.up) == 1 )
select = num-1;
if( CheckStatePad(configpad.down) == 1 && select < num-1 )
++select;
else if( CheckStatePad(configpad.down) == 1 )
select = 0;
if ( CheckStatePad(configpad.left) == 1 && selectmenu.menu > 0 )
--selectmenu.menu, select=0;
if ( CheckStatePad(configpad.right) == 1 && selectmenu.menu < 2 )
++selectmenu.menu, select=0;
y += select * 20;
SetDrawBlendMode( DX_BLENDMODE_ALPHA , 100 ) ;
DrawBox( dx-10 , y , dx+10 + len , y + 18 , color[5] , TRUE ) ; //選択位置の表示
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
y -= select * 20;
//項目の表示
while ( strcmp( *str, "NULL" ) != 0 )
{
dx = x - GetDrawFormatStringWidthToHandle( font[0] , *str ) / 2;
DrawFormatStringToHandle( dx, y, color[0], font[0], "%s", *str++);
y += 20;
}
// キャプチャした画像の開放
if( CheckStatePad(configpad.shot) == 1 )
DeleteGraph( img_screen );
}
選択画面の拡張で・・・
Re:選択画面の拡張で・・・
提示したプログラムを見ますと、
CheckStatePad(configpad.right) == 1 && selectmenu.menu < 2
のとき
++selectmenu.menu, select=0;
をする
ぐらいしかわかりません。
一番大切な
「selectmenu.menuをインクリメントしたらどの様にメニューを更新しているか」
が分かりません。
プログラムを全部掲載するか、プロジェクトごとUPすれば、
よりよい回答が得られるかと思います。
CheckStatePad(configpad.right) == 1 && selectmenu.menu < 2
のとき
++selectmenu.menu, select=0;
をする
ぐらいしかわかりません。
一番大切な
「selectmenu.menuをインクリメントしたらどの様にメニューを更新しているか」
が分かりません。
プログラムを全部掲載するか、プロジェクトごとUPすれば、
よりよい回答が得られるかと思います。
Re:選択画面の拡張で・・・
いろいろと説明不足ですみません
えーとですね、selectmenu.menuで列を、selectで行の場所を扱っています
以下がメニュー更新のソースです
問題なのが右キーを押しただけでselectmenu.menuが2まで行ってしまうことです
const char *str[/url] =
{
{"A"},
{"B"},
{"NULL"}
};
const char *str3[/url] =
{
{"G"},
{"H"},
{"NULL"}
};
const char *str4[/url] =
{
{"M"},
{"N"},
{"NULL"}
};
static int select;
int x = FIELD_X+FIELD_MAX_X/5, y = FIELD_Y+FIELD_MAX_Y/3;
int n = selectmenu.menu+1;
//背景
DrawGraph(0,0,img_title[6],FALSE);
//画像(文字描画)
DrawRectGraph( FIELD_MAX_X/2, FIELD_MAX_Y/20, 205, 0, 80, 32, img_title[7], TRUE, FALSE ) ;
DrawRectGraph( FIELD_MAX_X/2+80, FIELD_MAX_Y/20, 32*n, 64, 32, 32, img_title[7], TRUE, FALSE ) ;
DrawRectGraph( FIELD_MAX_X/2, FIELD_MAX_Y*255/256, 212, 240, 224, 16, img_title[7], TRUE, FALSE ) ;
if(selectmenu.menu==0){
SelectDraw( x , y , "どの弾幕をみる?" , str , select);
}
if(selectmenu.menu==1){
SelectDraw( x , y , "どの弾幕をみる?" , str3 , select);
}
if(selectmenu.menu==2){
SelectDraw( x , y , "どの弾幕をみる?" , str4 , select);
}
if( CheckStatePad(configpad.shot) == 1 )
{
if(selectmenu.menu>0)
select+=selectmenu.menu*10;
switch(select)
{
case 0:
selectmenu.level = 0; //弾幕選択
func_state = 99; //ゲームメイン
break;
case 1:
selectmenu.level = 1;
func_state = 99; //ゲームメイン
break;
case 10:
selectmenu.level = 7; //弾幕選択
func_state = 99; //ゲームメイン
break;
case 11:
selectmenu.level = 1;
func_state = 99; //ゲームメイン
break;
case 20:
selectmenu.level = 12; //弾幕選択
func_state = 99; //ゲームメイン
break;
case 21:
selectmenu.level = 1;
func_state = 99; //ゲームメイン
break;
default:
printfDx("不明なメニューが選択されました\n");
break;
}
select=0;
area.bgm.flag=2;
}
}
えーとですね、selectmenu.menuで列を、selectで行の場所を扱っています
以下がメニュー更新のソースです
問題なのが右キーを押しただけでselectmenu.menuが2まで行ってしまうことです
const char *str[/url] =
{
{"A"},
{"B"},
{"NULL"}
};
const char *str3[/url] =
{
{"G"},
{"H"},
{"NULL"}
};
const char *str4[/url] =
{
{"M"},
{"N"},
{"NULL"}
};
static int select;
int x = FIELD_X+FIELD_MAX_X/5, y = FIELD_Y+FIELD_MAX_Y/3;
int n = selectmenu.menu+1;
//背景
DrawGraph(0,0,img_title[6],FALSE);
//画像(文字描画)
DrawRectGraph( FIELD_MAX_X/2, FIELD_MAX_Y/20, 205, 0, 80, 32, img_title[7], TRUE, FALSE ) ;
DrawRectGraph( FIELD_MAX_X/2+80, FIELD_MAX_Y/20, 32*n, 64, 32, 32, img_title[7], TRUE, FALSE ) ;
DrawRectGraph( FIELD_MAX_X/2, FIELD_MAX_Y*255/256, 212, 240, 224, 16, img_title[7], TRUE, FALSE ) ;
if(selectmenu.menu==0){
SelectDraw( x , y , "どの弾幕をみる?" , str , select);
}
if(selectmenu.menu==1){
SelectDraw( x , y , "どの弾幕をみる?" , str3 , select);
}
if(selectmenu.menu==2){
SelectDraw( x , y , "どの弾幕をみる?" , str4 , select);
}
if( CheckStatePad(configpad.shot) == 1 )
{
if(selectmenu.menu>0)
select+=selectmenu.menu*10;
switch(select)
{
case 0:
selectmenu.level = 0; //弾幕選択
func_state = 99; //ゲームメイン
break;
case 1:
selectmenu.level = 1;
func_state = 99; //ゲームメイン
break;
case 10:
selectmenu.level = 7; //弾幕選択
func_state = 99; //ゲームメイン
break;
case 11:
selectmenu.level = 1;
func_state = 99; //ゲームメイン
break;
case 20:
selectmenu.level = 12; //弾幕選択
func_state = 99; //ゲームメイン
break;
case 21:
selectmenu.level = 1;
func_state = 99; //ゲームメイン
break;
default:
printfDx("不明なメニューが選択されました\n");
break;
}
select=0;
area.bgm.flag=2;
}
}
Re:選択画面の拡張で・・・
返信が遅れました。。
> 問題なのが右キーを押しただけでselectmenu.menuが2まで行ってしまうことです
正直、じっくりコードを見ていないので、見当外れかもしれませんが・・・
もし右パッドが押されていたら.menuをインクリメントします。
if文なので、すぐ下の.menu==1に合致し、2に入ります。
パッド情報の更新がmain関数1ループに一回だとしたらright==1のままなので、
さらにメニューを更新します。
これが原因ではないでしょうか?
具体的にな解決方法は、
if(.menu==0)
else if(.menu==1)
...
としてみてください。
お門違いでしたらすみません。。
#あれ?この掲示板って二回プレタグを登場させると、一回にみなされるんでしたっけ?^^;
<プレ></プレ>
text
<プレ></プレ>
↓
textまでプレタグに囲まれてしまう・・・?
> 問題なのが右キーを押しただけでselectmenu.menuが2まで行ってしまうことです
正直、じっくりコードを見ていないので、見当外れかもしれませんが・・・
if(selectmenu.menu==0){ SelectDraw( x , y , "どの弾幕をみる?" , str , select); // 1 } if(selectmenu.menu==1){ SelectDraw( x , y , "どの弾幕をみる?" , str3 , select); // 2 } if(selectmenu.menu==2){ SelectDraw( x , y , "どの弾幕をみる?" , str4 , select); //3 }でselectmenu.menu==0のとき1を実行し、
もし右パッドが押されていたら.menuをインクリメントします。
if文なので、すぐ下の.menu==1に合致し、2に入ります。
パッド情報の更新がmain関数1ループに一回だとしたらright==1のままなので、
さらにメニューを更新します。
これが原因ではないでしょうか?
具体的にな解決方法は、
if(.menu==0)
else if(.menu==1)
...
としてみてください。
お門違いでしたらすみません。。
#あれ?この掲示板って二回プレタグを登場させると、一回にみなされるんでしたっけ?^^;
<プレ></プレ>
text
<プレ></プレ>
↓
textまでプレタグに囲まれてしまう・・・?
Re:選択画面の拡張で・・・
kazuoniさんありがとうございます
やっと解決できました
なんとも厄介ものをかいたんだorz
ついでにswitch文でやってみたらうまい具合に動作しました
やっと解決できました
なんとも厄介ものをかいたんだorz
ついでにswitch文でやってみたらうまい具合に動作しました
Re:選択画面の拡張で・・・
>#あれ?この掲示板って二回プレタグを登場させると、一回にみなされるんでしたっけ?^^;
プレタグは廃止されましたよー。たしか。
今は、
プレタグは廃止されましたよー。たしか。
今は、
やらなくても自動的にタブされたりします。
Re:選択画面の拡張で・・・
> 今は、
やらなくても自動的にタブされたりします。 そうでしたか^^; 今規約を見たら、プレタグの項目は消えてますね。 でもやっぱりタグで囲った方が、字間があって見やすいので、 個人的にはあった方がいいなぁなんて思ったりますが。。 方針が無しの方向なら、そちらに統一しようかと思います。
Re:選択画面の拡張で・・・
>kazuoniさん
>#あれ?この掲示板って二回プレタグを登場させると、一回にみなされるんでしたっけ?^^;
 preタグ2回くらいなら大丈夫だったと思いますけど、基本的にスペース(0x20)があると
ノーブレークスペース(0xa0)に変換されるので、<font color="xxx">とか <a href="...">のように
タグに属性があるのが混ざっていると、間のタグ内の区切りのスペースまで変換されてしまい、
おかしくなってしまうようです。
 <pre>~</pre>以外のタグも使おうとしませんでした?
>#あれ?この掲示板って二回プレタグを登場させると、一回にみなされるんでしたっけ?^^;
 preタグ2回くらいなら大丈夫だったと思いますけど、基本的にスペース(0x20)があると
ノーブレークスペース(0xa0)に変換されるので、<font color="xxx">とか <a href="...">のように
タグに属性があるのが混ざっていると、間のタグ内の区切りのスペースまで変換されてしまい、
おかしくなってしまうようです。
 <pre>~</pre>以外のタグも使おうとしませんでした?

Re:選択画面の拡張で・・・
> タグに属性があるのが混ざっていると、間のタグ内の区切りのスペースまで変換されてしまい、
> おかしくなってしまうようです。
> <pre>~</pre>以外のタグも使おうとしませんでした?
確かには用いました。
<pre>source 1</pre>
text1
<pre>source 2</pre>
text2<s>utext</s>text3
のようにしたところ、text1の改行がなくなり
1文になりました。
> おかしくなってしまうようです。
> <pre>~</pre>以外のタグも使おうとしませんでした?
確かには用いました。
<pre>source 1</pre>
text1
<pre>source 2</pre>
text2<s>utext</s>text3
のようにしたところ、text1の改行がなくなり
1文になりました。