スーファミのAボタンのような処理を実装したい
Posted: 2013年3月22日(金) 22:10
現在SRPGを製作しています。
スーファミのAボタンのように、ひとつの処理に対してボタンを押したら決定し
様々なシーンに対応するといったような処理を施したいです。
今書いている決定処理は 2.9章 全てのキーの入力状態を取得する の処理を使っています。
http://dixq.net/g/02_09.html
DXライブラリのメインループのwhile文にこの関数を加えると常時キーの状態が取得できるのですが
いざボタンを押したときは、関連する処理が一気に実行されてしまいます。
SRPGの移動処理で例えると
キャラクタ選択→移動場所決定→移動後のメニュー表示→待機のようにボタンを押される度順次実行したいのですが
キャラクタ選択→その場で待機処理→メニュー表示→待機と
同じボタンの入力状態を調べているため、すべての処理が最後まで一気に流れてしまいます。
スーファミのAボタンのように、一度おしたらその処理を実行し、再度押されるまで次の処理を実行しない。と再度Aボタンを押さない限り次の処理を呼び出さないようにしたいです。
現在は以下のようにKey[KEY_INPUT_Z] に様々なフラグを組みあわせて入力状態を制御しています。
ただスマートではないと思っていてほかに何かよい方法はないかと考えています
プログラムをこのように組めばよいという指針を示していただけると助かります。
以下は現在組んでいるプログラムです *記述方法によってKey[KEY_INPUT_Z] を調べている箇所が一気に実行されて困っている
スーファミのAボタンのように、ひとつの処理に対してボタンを押したら決定し
様々なシーンに対応するといったような処理を施したいです。
今書いている決定処理は 2.9章 全てのキーの入力状態を取得する の処理を使っています。
http://dixq.net/g/02_09.html
DXライブラリのメインループのwhile文にこの関数を加えると常時キーの状態が取得できるのですが
いざボタンを押したときは、関連する処理が一気に実行されてしまいます。
SRPGの移動処理で例えると
キャラクタ選択→移動場所決定→移動後のメニュー表示→待機のようにボタンを押される度順次実行したいのですが
キャラクタ選択→その場で待機処理→メニュー表示→待機と
同じボタンの入力状態を調べているため、すべての処理が最後まで一気に流れてしまいます。
スーファミのAボタンのように、一度おしたらその処理を実行し、再度押されるまで次の処理を実行しない。と再度Aボタンを押さない限り次の処理を呼び出さないようにしたいです。
現在は以下のようにKey[KEY_INPUT_Z] に様々なフラグを組みあわせて入力状態を制御しています。
ただスマートではないと思っていてほかに何かよい方法はないかと考えています
プログラムをこのように組めばよいという指針を示していただけると助かります。
以下は現在組んでいるプログラムです *記述方法によってKey[KEY_INPUT_Z] を調べている箇所が一気に実行されて困っている
// キーの入力状態を更新する
int Task::gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
//メイン関数ループ部分 ほかの部分は割愛
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && Task::gpUpdateKey()==0){//ここでgpUpdateKey関数を常時呼び出し
c_map::MapProcedure(&cm);
Charcter::CharProcedure((Charcter **)MyChar,(Charcter **)EnemyChar,&Cur);//ポインタ配列の受け取り方は*配列名[]で受け取る//ユニットクラスをキャラクタークラスに型キャストして無理やり代入
Cursor::CursorProcedure(&Cur);
}
//目的地決定処理
int Charcter::GoDestination(Cursor *Cur){
//行動キャンセル処理
if(Cur->nPos_x % nMapTipSize == 0 && Cur->nPos_y % nMapTipSize == 0){
if(Key[KEY_INPUT_Z] == 1 && Cur->GetCharNumber != 0 && MoveFlag == false){
Cur->GetCharNumber = 0;
SerchClr();//移動範囲描写クリア
}
}
//離れたところの目的地決定処理
if(Cur->nPos_x % nMapTipSize == 0 && Cur->nPos_y % nMapTipSize == 0 && BelongCheck[Cur->nPos_y / nMapTipSize][Cur->nPos_x / nMapTipSize] == BelongDefault){
if(Key[KEY_INPUT_X] == 1 ){//キャラクタ移動処理//ここでXボタンを調べている
if(Task::MoveResult[Cur->nPos_y / Task::nMapTipSize][Cur->nPos_x / Task::nMapTipSize] == 0){//移動可能範囲内ならばキャラを移動させる
if(Cur->GetCharNumber != 0){//カーソルが何かをつかんでいれば
MoveFlag = true;//キャラクタ移動フラグを立てる
Cur->MoveFlag = false;//カーソルを動かさないフラグを立てる
//DrawFormatString(0,120,RGB(255,255,255),"%s",Task::MoveDirection[Cur->nPos_y / 32][Cur->nPos_x / 32].c_str());
}
}
}
}
//その場に待機する処理
if(Cur->nPos_x == nPos_x && Cur->nPos_y == nPos_y){//カーソルとキャラクタの座標が同じならば
if(Key[KEY_INPUT_X] == 1 ){//ここでXボタンを調べている
Cur->MoveFlag = false;
}
}
return 0;
}
//移動後のメニュー処理:戦うとか杖とかアイテム交換とか実装予定
int Charcter::MenuDispose(Cursor *Cur){
int nSelectRet;
if(MenuStripFlag == true){//キャラクタが目的地に到達していればメニューを出す
nSelectRet = MenuStrip::Updata();
MenuStrip::DrawMenu();
if(Key[KEY_INPUT_X] == 1 && MenuStripFlag == true){//ここでXボタンを調べている
switch(nSelectRet){
case Fight://戦う
break;
case MagicWand://杖
break;
case UseItem://アイテム
break;
case WaitChar://待機
MenuStripFlag = false;//メニューを非表示にする
Cur->MoveFlag = true;
Cur->GetCharNumber = 0;
nDirection = 2;//何も無いときは下向きにしておく
BelongPointer(Cur,OldPosition.y,OldPosition.x);//マップ上に所属を書き込む
break;
}
}
if(Key[KEY_INPUT_Z] == 1 && MenuStripFlag == true){//行動をキャンセルする処理
MenuStripFlag = false;//メニューを非表示にする
nPos_x = OldPosition.x;
nPos_y = OldPosition.y;
Cur->MoveFlag = true;
Cur->GetCharNumber = 0;
nDirection = 2;//何も無いときは下向きにしておく
}
}
return 0;
}