クリアー表示の仕方

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

クリアー表示の仕方

#1

投稿記事 by ユカイ » 16年前

度々すみません、どうしてもわからないことがあります。
全部敵を捕まえたらゲームがストップして、ゲームクリアーの表示のやり方を教えていただけないでしょうか?

s-rush

Re:クリアー表示の仕方

#2

投稿記事 by s-rush » 16年前

現在捕まえた敵の数を格納しておく変数を用意しておいて、
敵を捕まえるたびにその変数を+1していく。

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

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

ユカイ

Re:クリアー表示の仕方

#3

投稿記事 by ユカイ » 16年前

仕組みはわかりましたが、どう表記すればいいのでしょう?

やそ

Re:クリアー表示の仕方

#4

投稿記事 by やそ » 16年前

s-rushさんとほぼ一緒ですが、考え方を逆にしてもいいです。

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

s-rush

Re:クリアー表示の仕方

#5

投稿記事 by s-rush » 16年前

あとはfunc_stateなる変数を用意し、
それに状態を示す値を代入して、条件分岐させてあげれば
クリア表示がしやすくなると思いますよ^^

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

s-rush

Re:クリアー表示の仕方

#6

投稿記事 by s-rush » 16年前

サンプルコードです。
先ほど言った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:クリアー表示の仕方

#7

投稿記事 by ユカイ » 16年前

なんとかできましたが、ゲーム自体を終わらせる方法はどうでしょう?

kazuoni

Re:クリアー表示の仕方

#8

投稿記事 by kazuoni » 16年前

前回もいいましたが、どこまで自分で考えていますか?
ここまで考え、こう記述してみたが、うまくいかなかった。
どこを変更すればよいでしょうか?
っとしないと、丸投げと同じになってしまうと思いますよ。

s-rush

Re:クリアー表示の仕方

#9

投稿記事 by s-rush » 16年前

パッと見た感じ、先ほど私が提示したサンプルのまんまみたいですね^^;
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:クリアー表示の仕方

#10

投稿記事 by ユカイ » 16年前

すいません、ここまではこんな感じでしょうか?

s-rush

Re:クリアー表示の仕方

#11

投稿記事 by s-rush » 16年前

>>while( ){
これは
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
のことですので、
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
{


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

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

ユカイ

Re:クリアー表示の仕方

#12

投稿記事 by ユカイ » 16年前

いえいえ、そんなことは。
こうですかね?
ちなみに今でているエラー文です。
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 が検出されました。

s-rush

Re:クリアー表示の仕方

#13

投稿記事 by s-rush » 16年前

えっと・・・
1つ目の
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
っていうものがありますよね?

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

kazuoni

Re:クリアー表示の仕方

#14

投稿記事 by kazuoni » 16年前

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

ユカイ

Re:クリアー表示の仕方

#15

投稿記事 by ユカイ » 16年前

頑張ります。皆さん、ありがとうございました。

閉鎖

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