>h2so5さん
失礼しました。
言葉ではどうもうまく伝えられませんでした。
面倒なのでプロジェクトごとあげてみます
いろいろファイルありますが結構何も書いてないファイルが多いです。
ここで質問したいのはmenu.cpp,menu.hについてです。
CMenuのItemSelect()関数が問題のところです。
CWinMgr型のwinという変数についてですが、ウィンドウに関する処理を行っています。
基本的にソフト屋さんのRPG講座を参考に作っているのですが、
Draw()で今あるウィンドウをすべて描画、New()で新たにウィンドウを登録、
Delete()で削除、Set()でstd::string型の文字列か、std::list<std::string>型のリストを代入します。
また、New()は新しく作ったウィンドウのウィンドウ番号を返し、その番号をDelete()
に渡してあげることで削除できます。
GetCursor()は決定キーが押されたら今のカーソルの位置が返りそれ以外は-1が返ります
MoveCursor()は今のカーソルの位置が返ります
コード:
void CMenu::ItemSelect(){
// timeはCSceneBaseで定義されており、SetState()関数が呼ばれるたびに
// つまり関数が初めに呼ばれたタイミングで0になります。
if(time==0){
Assert(useNo!=-1,"CMenu: アイテム番号が異常です");
generalState=0;// これが問題のstate変数です。(今はクラス変数としています)
unsigned num=party->GetPartyNum();
paramWinNo=win.New(400,30*num+45,170,90);
targetWinNo=win.New(400,40,170,30*num);
std::list<std::string> lstr;
for(unsigned i=0;i<party->GetPartyNum();i++)
lstr.push_back(party->GetParam(i).name);
win.Set(lstr);
}
int no=win.GetCursor();
switch(generalState){
case 0:{// 初期状態(文字列を代入しています)
win.Set(paramWinNo);
std::list<std::string> lstr;
lstr.push_back(ValueOfString("HP %3d/%3d",party->GetParam(no).hp,party->GetParam(no).hpMax));
lstr.push_back(ValueOfString("MP %3d/%3d",party->GetParam(no).mp,party->GetParam(no).mpMax));
win.Set(lstr,16,20,false);
win.Set(targetWinNo);
generalState++;
break;
}
case 1:
targetNo=win.MoveCursor();
if(targetNo!=-1)// 決定キーが押されたら
generalState++;
else if(win.GetCursor()!=no)// もしカーソルが上下に移動したら
generalState=0;
if(CKey::CheckKey(KEY_CANCEL)==1){
win.Delete(targetWinNo);
win.Delete(paramWinNo);
SetState(&CMenu::Item);
}
break;
case 2:// ItemUse処理
win.Delete(targetWinNo);
win.Delete(paramWinNo);
targetWinNo=win.New(360,90,150,60);
if(party->UseItem(useNo,targetNo))
win.Set(ValueOfString("%sを使用した",party->GetItemName(useNo).c_str()));
else
win.Set("使えない!");
generalState++;
break;
case 3:
if(win.UpdateMsg(MESSAGE_SPEED)){// 文字列を表示させていく
win.Delete(targetWinNo);
SetState(&CMenu::Item);
}
break;
}
}
generalStateというのを何とかしたいのです。
ひどく汚くて読みにくいとは思いますがお願いします。