クリアー表示の仕方
Re:クリアー表示の仕方
現在捕まえた敵の数を格納しておく変数を用意しておいて、
敵を捕まえるたびにその変数を+1していく。
もし、その変数が敵の最大数と等しく(より大きく)なったとき、
ゲームをストップしてクリア表示する。
このやり方でどうでしょうか?
敵を捕まえるたびにその変数を+1していく。
もし、その変数が敵の最大数と等しく(より大きく)なったとき、
ゲームをストップしてクリア表示する。
このやり方でどうでしょうか?
Re:クリアー表示の仕方
s-rushさんとほぼ一緒ですが、考え方を逆にしてもいいです。
残っている敵の数を変数で管理しておき、捕まえたら-1とかね(^.^)
残りがZEROになったらクリアってこと^^
残っている敵の数を変数で管理しておき、捕まえたら-1とかね(^.^)
残りがZEROになったらクリアってこと^^
Re:クリアー表示の仕方
あとはfunc_stateなる変数を用意し、
それに状態を示す値を代入して、条件分岐させてあげれば
クリア表示がしやすくなると思いますよ^^
拡張もしやすいと思います。
それに状態を示す値を代入して、条件分岐させてあげれば
クリア表示がしやすくなると思いますよ^^
拡張もしやすいと思います。
Re:クリアー表示の仕方
サンプルコードです。
先ほど言ったfunc_stateでの場合分けはしていません。
もし余力があれば、挑戦してみてください。
先ほど言ったfunc_stateでの場合分けはしていません。
もし余力があれば、挑戦してみてください。
#include "DxLib.h" #define MAX_ENEMY 6 (略) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { int ch_image[16],enemy_image[16], i,j; int catch_enemy; ch_t ch;//自キャラ enemy_t enemy[12];//敵キャラ catch_enemy = 0; //捕まえた敵の数の初期化 if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理 /*代入(初期化)*/ ch.x =320; ch.y =160; ch.walking_flag=0; ch.muki=3; for(i=0;i<6;++i) { while(1) { enemy.x=GetRand(20-1); enemy.y=GetRand(15-1); if(hantei[enemy.y][enemy.x]==0) { enemy.x*=32; enemy.y*=32; break; } } enemy.walking_flag=0; enemy.muki=GetRand(3); enemy.exist=0; enemy.bright_operation=255; } SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定 LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , ch_image ) ;//画像を分割してimage配列に保存(自キャラ) LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , enemy_image );//敵キャラ while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]) { //↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了 /*白い壁を描画*/ for(i=0;i<15;i++) for(j=0;j<20;j++) if(hantei[i][j]==1) DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE); chara_walk(&ch,enemy,6); ch.img=ch_image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画 for(i=0;i<6;++i) { if(enemy[i].exist==0)//敵が存在していたら { enemy_walk(&enemy[i]); enemy[i].img=enemy_image[(enemy[i].x%32+enemy[i].y%32)/8 + enemy[i].muki*4]; DrawGraph( enemy[i].x , enemy[i].y , enemy[i].img , TRUE ); } else//当たったらフェードアウト { if(enemy[i].bright_operation!=0) { SetDrawBlendMode(DX_BLENDMODE_ALPHA,enemy[i].bright_operation--); DrawGraph( enemy[i].x , enemy[i].y , enemy[i].img , TRUE ); SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; if(enemy[i].bright_operation == 254) //もし敵を捕まえたら catch_enemy++; } } } if(catch_enemy >= MAX_ENEMY) //すべての敵を捕まえたら printfDx("GAME SET"); ScreenFlip(); } DxLib_End(); return 0; }
Re:クリアー表示の仕方
前回もいいましたが、どこまで自分で考えていますか?
ここまで考え、こう記述してみたが、うまくいかなかった。
どこを変更すればよいでしょうか?
っとしないと、丸投げと同じになってしまうと思いますよ。
ここまで考え、こう記述してみたが、うまくいかなかった。
どこを変更すればよいでしょうか?
っとしないと、丸投げと同じになってしまうと思いますよ。
Re:クリアー表示の仕方
パッと見た感じ、先ほど私が提示したサンプルのまんまみたいですね^^;
kazuoniさんもおっしゃっていますが、自分で考えてみましたか?
ヒントとしてfunc_stateっていう変数を用意して、
条件分岐すればやりやすくなるかもと提示したのですが・・・
(一応サンプルはできているのですが、自分で多少は考えてもらいたかったので、
途中段階ものをサンプルとしてアップさせていただきました)
これでは丸投げと言われても仕方がないと思います。
もう少しヒントを出しておきます。
今後のためにも、switchで分岐させておきましょう。
>>ゲーム自体を終わらせる方法はどうでしょう?
ゲーム自体を終わらせてしまうよりも、ユーザーに選択してもらう方が、
ゲームとしてはいいかもしれません。
たとえば
Cキー入力で、もう一度ゲームをする。
Zキー入力で、ゲーム終了する。
というように。
この処理自体は簡単ですので、一度考えてみてください。
もちろんcase 1の時に処理するんですよ。
kazuoniさんもおっしゃっていますが、自分で考えてみましたか?
ヒントとしてfunc_stateっていう変数を用意して、
条件分岐すればやりやすくなるかもと提示したのですが・・・
(一応サンプルはできているのですが、自分で多少は考えてもらいたかったので、
途中段階ものをサンプルとしてアップさせていただきました)
これでは丸投げと言われても仕方がないと思います。
もう少しヒントを出しておきます。
今後のためにも、switchで分岐させておきましょう。
(略) while( ) { switch (func_state){ case 0: /*--------------------------------------------------------------- ゲームの処理 先ほどのサンプルのほとんどがここに来ます。 >>if(catch_enemy >= MAX_ENEMY) //すべての敵を捕まえたら >> printfDx("GAME SET"); この条件を、case 0にジャンプするようにします。 ---------------------------------------------------------------*/ break; case 1: /*全敵捕獲後の処理*/ break; default: /*func_stateが0, 1以外になってしまった時の例外処理*/ } }こんな感じでいいでしょう。
>>ゲーム自体を終わらせる方法はどうでしょう?
ゲーム自体を終わらせてしまうよりも、ユーザーに選択してもらう方が、
ゲームとしてはいいかもしれません。
たとえば
Cキー入力で、もう一度ゲームをする。
Zキー入力で、ゲーム終了する。
というように。
この処理自体は簡単ですので、一度考えてみてください。
もちろんcase 1の時に処理するんですよ。
Re:クリアー表示の仕方
>>while( ){
これは
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
のことですので、
ヒントの出し方がまずかったですね^^;
これは
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
のことですので、
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]) { }のしたにつけるものではないですよ。
ヒントの出し方がまずかったですね^^;
Re:クリアー表示の仕方
いえいえ、そんなことは。
こうですかね?
ちなみに今でているエラー文です。
z:\c言語\cpp_game\ch5\main.cpp(256): error C2143: 構文エラー : ')' が '{' の前にありません。
z:\c言語\cpp_game\ch5\main.cpp(256): error C2143: 構文エラー : ')' が '{' の前にありません。
z:\c言語\cpp_game\ch5\main.cpp(257): error C2050: switch 式の結果は、整数値になりませんでした。
z:\c言語\cpp_game\ch5\main.cpp(269): error C2143: 構文エラー : ':' が ';' の前にありません。
z:\c言語\cpp_game\ch5\main.cpp(279): fatal error C1075: 左側 中カッコ '{' に対応するものが 'z:\c言語\cpp_game\ch5\main.cpp(224)' で見つかる前に EOF が検出されました。
こうですかね?
ちなみに今でているエラー文です。
z:\c言語\cpp_game\ch5\main.cpp(256): error C2143: 構文エラー : ')' が '{' の前にありません。
z:\c言語\cpp_game\ch5\main.cpp(256): error C2143: 構文エラー : ')' が '{' の前にありません。
z:\c言語\cpp_game\ch5\main.cpp(257): error C2050: switch 式の結果は、整数値になりませんでした。
z:\c言語\cpp_game\ch5\main.cpp(269): error C2143: 構文エラー : ':' が ';' の前にありません。
z:\c言語\cpp_game\ch5\main.cpp(279): fatal error C1075: 左側 中カッコ '{' に対応するものが 'z:\c言語\cpp_game\ch5\main.cpp(224)' で見つかる前に EOF が検出されました。
Re:クリアー表示の仕方
えっと・・・
1つ目の
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
っていうものがありますよね?
その中身が先ほどのヒントのプログラムが入るんですが・・・
1つ目の
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
っていうものがありますよね?
その中身が先ほどのヒントのプログラムが入るんですが・・・
Re:クリアー表示の仕方
一度C言語の基礎的なプログラムの流れから命令まで見直してみてはいかがでしょうか?
while文、switch文の理解ができていないような気がします。
また、頭の中で今書いているプログラムがどう動くのか一度考えてみてください。
while()が二つあるとどう動くのか。
このままだとスレが長引くだけかと。
少し冷たく感じるかも知れませんが、自分で納得したほうが吸収も早いです。
while文、switch文の理解ができていないような気がします。
また、頭の中で今書いているプログラムがどう動くのか一度考えてみてください。
while()が二つあるとどう動くのか。
このままだとスレが長引くだけかと。
少し冷たく感じるかも知れませんが、自分で納得したほうが吸収も早いです。