ページ 11

ショットが発射されません

Posted: 2009年8月23日(日) 15:57
by zyf
ゲームプログラミングの館を見ながら、横スクロールシューティングゲームを作ろうと思っているのですが、

19章のキャラをキー入力によって移動させる。と、26章のシューティング基本。を組み合わせてみると、

Run-Time Check Failure #3 - The variable 'ch' is being used without being initialized.
[中断][続行][無視]

といったエラーのようなものが出て実行できません。
ショットの開始する座標にキャラクターの座標を入れたのですがどこが悪いのでしょうか?
#include "DxLib.h"
 
typedef struct{//キャラクターの構造体
	int x,y,img;
}ch_t;
struct shot{//ショットの構造体
	int x,y;
	int flag;
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
//////定義        
    int image001[1];
	int back1[1];
	int na_shot[3],i,counter=0;//counter=発射してからのカウントをする変数。
	struct shot tama[10];//tamaを10個作る。
    char Key[256];
	ch_t ch;
//////定義ここまで
	for(i=0;i<10;i++){//ショットの初期化処理。
		tama.x=ch.x;tama.y=ch.y;//座標代入
		tama.flag=0;//飛んでいないことを示す。フラグ=0
	}

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	ch.x=120;
	ch.y=240;
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                         //描画先を裏画面に設定
    LoadDivGraph( "sample00.png" , 1 , 1 , 1 , 64 , 64 , image001 );//画像を分割してimage001配列に保存
	LoadDivGraph( "back00.bmp" , 1 , 1 , 1 , 640 , 480 , back1 );
	LoadDivGraph("na_shot.png",3,1,3,36,36,na_shot);
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

////////移動
				if(Key[KEY_INPUT_RIGHT]==1)
					ch.x++;
				if(Key[KEY_INPUT_LEFT]==1)
					ch.x--;
				if(Key[KEY_INPUT_UP]==1)
					ch.y--;
				if(Key[KEY_INPUT_DOWN]==1)
					ch.y++;
////////移動ここまで
				ch.img=image001[0];

				DrawGraph(0,0,back1[0],FALSE);
                DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//[12]の画像を描画

///////ショット
				if(counter<5)
					counter++;

				else if(Key[KEY_INPUT_Z]==1){
					counter=0;
					for(i=0;i<10;i++){
						if(tama.flag==0){
							tama.flag=1;
							break;
						}
					}
				}
				for(i=0;i<10;i++){
					if(tama[1].flag==1){
						tama.x+=8;
						if(tama.x>500){
							tama.x=ch.x;
							tama.flag=0;
						}
					}
				}

                ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

Re:よくわからないエラー(?)が出てしまいます。

Posted: 2009年8月23日(日) 16:13
by box
> 	ch_t ch;

ここで定義したchのメンバーに、何もセットしていない状態で

> 	for(i=0;i<10;i++){//ショットの初期化処理。
> 		tama.x=ch.x;tama.y=ch.y;//座標代入

ここで参照しています。よいのでしょうか?

Re:よくわからないエラー(?)が出てしまいます。

Posted: 2009年8月24日(月) 02:28
by zyf
解決しました!
と思ったら、Zキーを押ても弾が出ないのですがどこが問題でしょうか?

ショット部分はお手本を丸写ししたはずなんですが・・・
(関係ない部分なので略)
///////ショット
				for(i=0;i<10;i++){//ショットの初期化処理。
		tama.x=ch.x;tama.y=ch.y;//座標代入
		tama.flag=0;//飛んでいないことを示す。フラグ=0
	}

				if(counter<5)
					counter++;

				else if(Key[KEY_INPUT_Z]==1){
					counter=0;
					for(i=0;i<10;i++){
						if(tama.flag==0){
							tama.flag=1;
							break;
						}
					}
				}
				for(i=0;i<10;i++){
					if(tama[1].flag==1){
						tama.x+=8;
						DrawGraph(tama.x,tama.y,na_shot[1],TRUE);
						if(tama.x>500){
							tama.x=ch.x;
							tama[i].flag=0;
						}
					}
				}

                ScreenFlip();//裏画面を表画面に反映
    }

    DxLib_End();
    return 0;
}

Re:よくわからないエラー(?)が出てしまいます。

Posted: 2009年8月24日(月) 04:26
by pooka
確認してませんが、
zキーを押して弾のフラグを立てても、次のフレームで
for(i=0;i<10;i++){//ショットの初期化処理。
	tama.x=ch.x;tama.y=ch.y;//座標代入
	tama.flag=0;//飛んでいないことを示す。フラグ=0
}

としているので弾は表示されないかと・・・

上の4行を削除して、tama.x = ch.x;とtama.y = ch.y;を
else if(Key[KEY_INPUT_Z]==1){
	counter = 0;
	for(i=0;i<10;i++){
		if(tama.flag==0){
			tama.x = ch.x;
			tama.y = ch.y;
			tama.flag=1;
			break;
		}
	}	
}

のようにすれば、とりあえず表示されるかと思います。

あと
for(i=0;i<10;i++){
	if(tama[1].flag==1){
		tama.x+=8;
		//以下略

赤字の部分はiだと思いますよ。

Re:よくわからないエラー(?)が出てしまいます。

Posted: 2009年8月25日(火) 19:47
by zyf
直してみたのですが、結果が変わりませんでした。
一応ソースを全部貼ってみます。これで駄目だったら一回書き直します。
#include "DxLib.h"
 
typedef struct{//キャラクターの構造体
	int x,y,img;
}ch_t;
struct shot{//ショットの構造体
	int x,y;
	int flag;
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
//////定義        
    int image001[1];
	int back1[1];
	int na_shot[3],i,counter=0;//counter=発射してからのカウントをする変数。
	struct shot tama[10];//tamaを10個作る。
    char Key[256];
	ch_t ch;
//////定義ここまで

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	ch.x=120;
	ch.y=240;


    SetDrawScreen( DX_SCREEN_BACK ) ;                         //描画先を裏画面に設定
    LoadDivGraph( "nanoha00.png" , 1 , 1 , 1 , 64 , 64 , image001 );//画像を分割してimage001配列に保存
	LoadDivGraph( "back00.bmp" , 1 , 1 , 1 , 640 , 480 , back1 );
	LoadDivGraph("na_shot.png",3,1,3,36,36,na_shot);
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

////////移動
				if(Key[KEY_INPUT_RIGHT]==1)//右
					ch.x+=3;
				if(Key[KEY_INPUT_LEFT]==1)//左
					ch.x-=3;
				if(Key[KEY_INPUT_UP]==1)//上
					ch.y-=3;
				if(Key[KEY_INPUT_DOWN]==1)//下
					ch.y+=3;

				if(ch.x<-15)//左の限界
					ch.x=-15;
				if(ch.x>610)//右の限界
					ch.x=610;
				if(ch.y<-10)//上の限界
					ch.y=-10;
				if(ch.y>450)//下の限界
					ch.y=450;
////////移動ここまで
				ch.img=image001[0];

				DrawGraph(0,0,back1[0],FALSE);
                DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//[12]の画像を描画


///////ショット


				if(counter<5)
					counter++;

				else if(Key[KEY_INPUT_Z]==1){
					counter=0;
					for(i=0;i<10;i++){
						if(tama.flag==0){
							tama.x=ch.x;
							tama.y=ch.y;
							tama.flag=1;
							break;
						}
					}
				}
				for(i=0;i<10;i++){
					if(tama.flag==1){
						tama.x+=8;
						DrawGraph(tama.x,tama.y,na_shot[1],TRUE);
						if(tama.x>500){
							tama.x=ch.x;
							tama[i].flag=0;
						}
					}
				}

                ScreenFlip();//裏画面を表画面に反映
    }

    DxLib_End();
    return 0;
}

Re:よくわからないエラー(?)が出てしまいます。

Posted: 2009年8月25日(火) 21:27
by pooka
No:38366では
//////定義ここまで
の後に弾の初期化があるのに消えているようです。
なので書き加えてみてください。


# No:38379では
///////ショット
の部分に弾の初期化があったのでそれを消せばいいと言いたかったんですが^^;

Re:よくわからないエラー(?)が出てしまいます。

Posted: 2009年8月29日(土) 16:08
by zyf
無事にショットが発射されるようになりました。

ありがとうございます!