ドラクエ風の画面処理

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

ドラクエ風の画面処理

#1

投稿記事 by ti » 15年前

お久しぶりです
kazuoniさんsoftyaさん返答遅くなってしまってすいません
だいぶ時間が空いてしまって過去ログになってしまったので
新しく作り直します

メイン関数の書き方にならって
関数を書いてみました

窓がない状態から

Xボタンで窓1
窓1が開いてる状態で

Xボタンで窓2が開いてる状態
Zボタンで窓1が開いてる状態へ

という処理を目指して状態推移処理で作り直してみました

[/pre]
int function_status=888;//状態設定

int Make_CmdWindow1(int cr__x,int cr__y,int i,int j)//座標、座標、座標、座標、bmp名
{
char Key[256];


GetHitKeyStateAll( Key ) ;
while(1){
//GetHitKeyStateAll(Key);
switch(function_status){

case 888:

if(Key[KEY_INPUT_Z]==1)
MessageBox(NULL ,"window1" , "B" ,MB_OK);
function_status=999;//初期
break;

if(Key[KEY_INPUT_X]==1)
MessageBox(NULL ,"window1" , "A" ,MB_OK);
function_status=777;//ウィンドウ2?
break;

case 777:
if(Key[KEY_INPUT_X]==1)
MessageBox(NULL ,"window2" , "A" ,MB_OK);
function_status=888;//ウィンドウ2が開いた状態?
break;



if(Key[KEY_INPUT_Z]==1)
MessageBox(NULL ,"window1" , "B" ,MB_OK);
function_status=888;//初期
break;



case 999:
return 0;
break;

default:
return 0;
break;

}
}


return 0;
}
[/pre]
初期で
if(Key[KEY_INPUT_Z]==1)
                    MessageBox(NULL ,"window1" , "B" ,MB_OK);
                    function_status=999;//初期
                break;

                if(Key[KEY_INPUT_X]==1)
                    MessageBox(NULL ,"window1" , "A" ,MB_OK);
                    function_status=777;//ウィンドウ2?
                break;
キーを押していなくても押している状態として認識してしまいます
原因がわからないのですがkeyの宣言の仕方を変えるべきか
ソースの書き方の問題か教えてくださいよろしくお願いします
画像

ひよこ

Re:ドラクエ風の画面処理

#2

投稿記事 by ひよこ » 15年前

初めて見た感じ、caseとbreak;の数があっていないように見えます。それが原因かもしれません。
ソースにwhile(1)のループがあったりと、ちょっと無駄が多いソースに見えます。
ちがっていたらすみません。

ti

Re:ドラクエ風の画面処理

#3

投稿記事 by ti » 15年前

ひよこさん
while(1)のループはここのMain関数の書き方というところををまねして書きました
無駄が多いのはほぼ素人なので・・・
追記です

たとえば他の関数でもkeyを取得していて
そちらでは正しく十字キーを押したときの処理はできているのですが
ほかでkeyの取得が正常にできないとか起こりえますか?

ひよこ

Re:ドラクエ風の画面処理

#4

投稿記事 by ひよこ » 15年前

ほかでkeyの取得が正常にできないとか起こりえますか?
>>メッセージ処理をしていればいちおうないと思います。
一回メインループを考えて作ったほうがよさそうです。
取得できないのではなく取得してないのだと思います。

私が考えたのは、これです。{スイッチ文が何度も1ループで動かない(1回しか処理しない)と思っています。}(プログラムが始まってからZキーを押していると仮定して)
GetHitKeyStateAll( Key ) ;でキーを取得し、ループへ、
Zが押されているので、Zが押されている処理が動きます。
そのあとwhile(1)で、無限ループなので、さらにGetHitKeyStateAll( Key )で押されているキーを取得するので
これを使っていないということは、ずっと押されぱなしと判断するからだと思います。

ゲームプログラムの館みたいに1ループ一回キーを取得、画面を消去、メッセージを処理をすると
無駄もないし、いいですよ。

ti

Re:ドラクエ風の画面処理

#5

投稿記事 by ti » 15年前

なんか自己解決したみたいです
GetHitKeyStateAllの場所と変数の名前を変えたら直りました
お騒がせしました
またなにかありましたらよろしくお願いします

ti

Re:ドラクエ風の画面処理

#6

投稿記事 by ti » 15年前

解決しわすれました

閉鎖

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