ページ 11

クリアー表示の仕方

Posted: 2009年3月05日(木) 11:31
by ユカイ
度々すみません、どうしてもわからないことがあります。
全部敵を捕まえたらゲームがストップして、ゲームクリアーの表示のやり方を教えていただけないでしょうか?

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 11:50
by s-rush
現在捕まえた敵の数を格納しておく変数を用意しておいて、
敵を捕まえるたびにその変数を+1していく。

もし、その変数が敵の最大数と等しく(より大きく)なったとき、
ゲームをストップしてクリア表示する。

このやり方でどうでしょうか?

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 11:53
by ユカイ
仕組みはわかりましたが、どう表記すればいいのでしょう?

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 11:59
by やそ
s-rushさんとほぼ一緒ですが、考え方を逆にしてもいいです。

残っている敵の数を変数で管理しておき、捕まえたら-1とかね(^.^)
残りがZEROになったらクリアってこと^^

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 12:12
by s-rush
あとはfunc_stateなる変数を用意し、
それに状態を示す値を代入して、条件分岐させてあげれば
クリア表示がしやすくなると思いますよ^^

拡張もしやすいと思います。

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 12:45
by s-rush
サンプルコードです。
先ほど言った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:クリアー表示の仕方

Posted: 2009年3月05日(木) 14:20
by ユカイ
なんとかできましたが、ゲーム自体を終わらせる方法はどうでしょう?

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 14:28
by kazuoni
前回もいいましたが、どこまで自分で考えていますか?
ここまで考え、こう記述してみたが、うまくいかなかった。
どこを変更すればよいでしょうか?
っとしないと、丸投げと同じになってしまうと思いますよ。

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 14:52
by s-rush
パッと見た感じ、先ほど私が提示したサンプルのまんまみたいですね^^;
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:クリアー表示の仕方

Posted: 2009年3月05日(木) 15:22
by ユカイ
すいません、ここまではこんな感じでしょうか?

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 15:35
by s-rush
>>while( ){
これは
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
のことですので、
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
{


}
のしたにつけるものではないですよ。

ヒントの出し方がまずかったですね^^;

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 15:40
by ユカイ
いえいえ、そんなことは。
こうですかね?
ちなみに今でているエラー文です。
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:クリアー表示の仕方

Posted: 2009年3月05日(木) 15:49
by s-rush
えっと・・・
1つ目の
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
っていうものがありますよね?

その中身が先ほどのヒントのプログラムが入るんですが・・・

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 16:03
by kazuoni
一度C言語の基礎的なプログラムの流れから命令まで見直してみてはいかがでしょうか?
while文、switch文の理解ができていないような気がします。
また、頭の中で今書いているプログラムがどう動くのか一度考えてみてください。
while()が二つあるとどう動くのか。
このままだとスレが長引くだけかと。
少し冷たく感じるかも知れませんが、自分で納得したほうが吸収も早いです。

Re:クリアー表示の仕方

Posted: 2009年3月05日(木) 16:37
by ユカイ
頑張ります。皆さん、ありがとうございました。