弾の座標のバグ

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

弾の座標のバグ

#1

投稿記事 by 初心者 » 16年前

C言語~ゲームプログラミングの館~の26.シューティング基本を参考にして、移動するキャラクターの位置から弾を発射するプログラムなのですが、キャラクターを移動させるとたまに変な位置から弾が発射されます。
キャラクターは十字キーで移動で、スペースキーで弾を発射します。
どうすれば、このバグが直るのでしょうか?

開発環境はVisual C++ 2008 Express Editionです。

ソースコードを下に示します
#include "DxLib.h"
#include <math.h>
 
typedef struct{
    double x, y;
}ch_t;

struct shot {	//弾発射
	double x, y;
	int flag;
};
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
		int image[16];
		double rad = 0.0;	// キャラクターの角度(rad)
		char Key[256];
		ch_t ch;
		int n_flag = 1;	//0:ななめ移動 1:十字移動
		struct shot tama[10];	//弾10個
		int i, counter = 0;
 
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;	//ウィンドウ化と初期化処理
 
		ch.x    =320;
		ch.y    =160;

		for(i = 0; i < 10; i++) {	//弾発射の準備
			tama.x = ch.x - 16;
			tama.y = ch.y - 16;
			tama.flag = 0;
		}

		SetDrawScreen( DX_SCREEN_BACK );	//描画先を裏画面に設定
		LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
		if(counter < 5)
			counter++;
		else if(Key[KEY_INPUT_SPACE] == 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.flag == 1) {
				tama.y -= 8;
				DrawGraph(tama.x, tama.y, image[1], TRUE);
				if(tama.y < -32) {
					tama[i].x = ch.x - 16;
					tama[i].y = ch.y - 16;
					tama[i].flag = 0;
				}
			}
		}

		if(n_flag == 1){	//ななめフラグなしのとき
			if( Key[ KEY_INPUT_UP   ]  == 1 )
				ch.y--;
			if( Key[ KEY_INPUT_LEFT ]  == 1 )
				ch.x--;
			if( Key[ KEY_INPUT_DOWN ]  == 1 )
				ch.y++;
			if( Key[ KEY_INPUT_RIGHT]  == 1 )
				ch.x++;
			}

		else{	//ななめフラグ立ってるとき
			if(Key[KEY_INPUT_UP] == 1 && Key[KEY_INPUT_RIGHT] == 1) {
				ch.y -= 1 / sqrt(2.0);
				ch.x += 1 / sqrt(2.0);
			}
			if(Key[KEY_INPUT_UP] == 1 && Key[KEY_INPUT_LEFT] == 1) {
				n_flag = 0;
				ch.y -= 1 / sqrt(2.0);
				ch.x -= 1 / sqrt(2.0);
			}
			if(Key[KEY_INPUT_DOWN] == 1 && Key[KEY_INPUT_RIGHT] == 1) {
				n_flag = 0;
				ch.y += 1 / sqrt(2.0);
				ch.x += 1 / sqrt(2.0);
			}
			if(Key[KEY_INPUT_DOWN] == 1 && Key[KEY_INPUT_LEFT] == 1) {
				n_flag = 0;
				ch.y += 1 / sqrt(2.0);
				ch.x -= 1 / sqrt(2.0);
			}
		}

		if(Key[KEY_INPUT_Z] == 1)	//左回転
			rad -= 0.05;
		else if(Key[KEY_INPUT_X] == 1)	//右回転
			rad += 0.05;
     
		DrawRotaGraph( ch.x, ch.y  , 1.0 , rad , image[12]  , TRUE  );

		ScreenFlip();
	}
 
	DxLib_End();

	return 0;
}

yu

Re:弾の座標のバグ

#2

投稿記事 by yu » 16年前

弾の位置を戻す時に

その瞬間のキャラの位置をもとに決定しているからではないでしょうか

決定した後でキャラを動かすと弾の位置から離れるので変なところから発射されたように見えますね。

tama.flag = 1 のところで座標を代入してはいかがでしょうか

初心者

Re:弾の座標のバグ

#3

投稿記事 by 初心者 » 16年前

無事解決しました。
ありがとうございました。

初心者

Re:弾の座標のバグ

#4

投稿記事 by 初心者 » 16年前

無事解決しました。
ありがとうございました。

閉鎖

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