選択画面の拡張で・・・

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

選択画面の拡張で・・・

#1

投稿記事 by St » 15年前

はじめまして、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 );
}

Ma

Re:選択画面の拡張で・・・

#2

投稿記事 by Ma » 15年前

>選択できるメニューの最大値までいってしまう
質問の意味がよくわかりません・・・

kazuoni

Re:選択画面の拡張で・・・

#3

投稿記事 by kazuoni » 15年前

提示したプログラムを見ますと、
CheckStatePad(configpad.right) == 1 && selectmenu.menu < 2
のとき
++selectmenu.menu, select=0;
をする
ぐらいしかわかりません。

一番大切な
「selectmenu.menuをインクリメントしたらどの様にメニューを更新しているか」
が分かりません。
プログラムを全部掲載するか、プロジェクトごとUPすれば、
よりよい回答が得られるかと思います。

St

Re:選択画面の拡張で・・・

#4

投稿記事 by St » 15年前

いろいろと説明不足ですみません
えーとですね、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;
}
}

kazuoni

Re:選択画面の拡張で・・・

#5

投稿記事 by kazuoni » 15年前

返信が遅れました。。

> 問題なのが右キーを押しただけで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までプレタグに囲まれてしまう・・・?

St

Re:選択画面の拡張で・・・

#6

投稿記事 by St » 15年前

kazuoniさんありがとうございます
やっと解決できました

なんとも厄介ものをかいたんだorz

ついでにswitch文でやってみたらうまい具合に動作しました

Ma

Re:選択画面の拡張で・・・

#7

投稿記事 by Ma » 15年前

>#あれ?この掲示板って二回プレタグを登場させると、一回にみなされるんでしたっけ?^^;
プレタグは廃止されましたよー。たしか。
今は、
やらなくても自動的にタブされたりします。

kazuoni

Re:選択画面の拡張で・・・

#8

投稿記事 by kazuoni » 15年前

> 今は、
やらなくても自動的にタブされたりします。

そうでしたか^^;
今規約を見たら、プレタグの項目は消えてますね。

でもやっぱりタグで囲った方が、字間があって見やすいので、
個人的にはあった方がいいなぁなんて思ったりますが。。
方針が無しの方向なら、そちらに統一しようかと思います。

Justy

Re:選択画面の拡張で・・・

#9

投稿記事 by Justy » 15年前

&#65310;&#107;&#97;&#122;&#117;&#111;&#110;&#105;&#12373;&#12435;
&#65310;&#35;&#12354;&#12428;&#65311;&#12371;&#12398;&#25522;&#31034;&#26495;&#12387;&#12390;&#20108;&#22238;&#12503;&#12524;&#12479;&#12464;&#12434;&#30331;&#22580;&#12373;&#12379;&#12427;&#12392;&#12289;&#19968;&#22238;&#12395;&#12415;&#12394;&#12373;&#12428;&#12427;&#12435;&#12391;&#12375;&#12383;&#12387;&#12369;&#65311;&#65342;&#65342;&#65307;

&#12288;&#112;&#114;&#101;&#12479;&#12464;&#65298;&#22238;&#12367;&#12425;&#12356;&#12394;&#12425;&#22823;&#19976;&#22827;&#12384;&#12387;&#12383;&#12392;&#24605;&#12356;&#12414;&#12377;&#12369;&#12393;&#12289;&#22522;&#26412;&#30340;&#12395;&#12473;&#12506;&#12540;&#12473;&#40;&#48;&#120;&#50;&#48;&#41;&#12364;&#12354;&#12427;&#12392;
&#12494;&#12540;&#12502;&#12524;&#12540;&#12463;&#12473;&#12506;&#12540;&#12473;&#40;&#48;&#120;&#97;&#48;&#41;&#12395;&#22793;&#25563;&#12373;&#12428;&#12427;&#12398;&#12391;&#12289;<&#102;&#111;&#110;&#116; &#99;&#111;&#108;&#111;&#114;&#61;"&#120;&#120;&#120;">&#12392;&#12363; <&#97; &#104;&#114;&#101;&#102;&#61;"&#46;&#46;&#46;">&#12398;&#12424;&#12358;&#12395;
&#12479;&#12464;&#12395;&#23646;&#24615;&#12364;&#12354;&#12427;&#12398;&#12364;&#28151;&#12374;&#12387;&#12390;&#12356;&#12427;&#12392;&#12289;&#38291;&#12398;&#12479;&#12464;&#20869;&#12398;&#21306;&#20999;&#12426;&#12398;&#12473;&#12506;&#12540;&#12473;&#12414;&#12391;&#22793;&#25563;&#12373;&#12428;&#12390;&#12375;&#12414;&#12356;&#12289;
&#12362;&#12363;&#12375;&#12367;&#12394;&#12387;&#12390;&#12375;&#12414;&#12358;&#12424;&#12358;&#12391;&#12377;&#12290;

&#12288;<&#112;&#114;&#101;>&#65374;<&#47;&#112;&#114;&#101;>&#20197;&#22806;&#12398;&#12479;&#12464;&#12418;&#20351;&#12362;&#12358;&#12392;&#12375;&#12414;&#12379;&#12435;&#12391;&#12375;&#12383;&#65311; 画像

kazuoni

Re:選択画面の拡張で・・・

#10

投稿記事 by kazuoni » 15年前

> タグに属性があるのが混ざっていると、間のタグ内の区切りのスペースまで変換されてしまい、
> おかしくなってしまうようです。
> <pre>~</pre>以外のタグも使おうとしませんでした?

確かには用いました。
<pre>source 1</pre>
text1
<pre>source 2</pre>
text2<s>utext</s>text3

のようにしたところ、text1の改行がなくなり
1文になりました。

閉鎖

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