反射弾の実装

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

反射弾の実装

#1

投稿記事 by kkk » 13年前

お初ですが、質問させていただきます。
現在、夏休みの課題のSTGの製作をDirectXとC++で、学校からもらったライブラリでしています。
敵3の弾の処理を、自分のいる角度と敵のいる角度から求めて、打った球が壁に当たると跳ね返る、というものが作りたいのですが、
縦の跳ね返りは処理できたと思うのですが、横の処理がどうしてもできません。
C、C++,DirectXは、まだ半年も勉強していない初心者です。
初期化の部分は必要ないと思いましたが、一応使っている変数などがあるので書きました。

使っているソフトは、VisualStudio2008,Microsoft DirectX SDK (August 2007)です。よろしくお願いします。

コード:

//初期化
TextureM Enemy; //敵画像
Enemy.Init( pDevice , "Texture/charimg.png" , 320 , 240  );

//敵の弾3(連続直線ショット(自機に常に向かう)用)
int Teki3tamaflag =0; //敵が弾をうっているかどうかの判定
int Teki3Tamafcount=0; //弾と弾の距離を置くためのカウント
int tama3=0;

SpriteM Teki3Tama[10];
float Teki3Tamad[10];
for(int i=0; i<9; i++){
	Teki3Tama[i].Init(pDevice,32,32,0,177,&Enemy); //32*32の大きさの画像で0,0の位置から切り出す
	Teki3Tama[i].Pos.x =-100; //初期座標
	Teki3Tamad[i]=0; //角度
}

//敵2 (常に自機の方へ向かう連続直線ショット)

if(Teki3TamaLife[9] == 0){
	Teki3tamaflag = 1;
}
	if(Teki3tamaflag == 1){
		static int tama3=0;
		if(Teki3TamaLife[tama3]==0){
			for(int i=0; i<9; i++){
				Teki3TamaLife[tama3]=1;
				Teki3Tama[tama3].Pos.x= Teki[3].Pos.x;
				Teki3Tama[tama3].Pos.y= Teki[3].Pos.y;
				if(tama3 == 0 && Teki3Tamafcount == 0){
				Teki3Tamad[0] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 1){
				Teki3Tamad[1] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 2){
				Teki3Tamad[2] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 3){
				Teki3Tamad[3] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 4){
				Teki3Tamad[4] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 5){
				Teki3Tamad[5] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 6){
				Teki3Tamad[6] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 7){
				Teki3Tamad[7] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 8){
				Teki3Tamad[8] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
			if(tama3 == 9){
				Teki3Tamad[9] = atan2(Jikidainyuu2-Teki[3].Pos.y,Jikidainyuu-Teki[3].Pos.x);
			}
		}
	}
	Teki3Tamafcount++;
	if(Teki3Tamafcount == 7){
		Teki3Tamafcount = 0;
		tama3++;	//tama1を0に
		if(tama3 == 10){
			Teki3tamaflag = 0;
			tama3 = 0;
		}
	}
}

//敵3の弾の壁の処理-------------------

for(int i=0; i<9; i++){
		if(Teki3Tama[i].Pos.y>740||Teki3Tama[i].Pos.y<30){ //縦の壁の処理
			Teki3Tamad[i] = Teki3Tamad[i]-Teki3Tamad[i]-Teki3Tamad[i];
		}
		if(Teki3Tama[i].Pos.x>1000||Teki3Tama[i].Pos.x<280){ //横の壁の処理
			Teki3Tamad[i] = 180 - Teki3Tamad[i]; //ここがうまくいかない
		}
}

//敵3の弾の処理 -------------------(常に自機の方へ向かう連続直線ショット)
[code]
for(int i=0; i<9; i++){
	if(Teki3TamaLife[i]==1&& tama3 == 0){
		Teki3Tama[i].Pos.x += TEKISHOT3*cos(Teki3Tamad[i]);//一度だけ追尾弾
		Teki3Tama[i].Pos.y += TEKISHOT3*sin(Teki3Tamad[i]);
		Teki3Tama[i].Angle = Teki3Tamad[i];
	}
}

kkk

Re: 反射弾の実装

#2

投稿記事 by kkk » 13年前

質問したばかりで申し訳ありません。解決しましたので追加・変更したコードを書かせていただきます。

//初期化

コード:

int kabe=1;

//敵3の弾の処理 -------------------(常に自機の方へ向かう連続直線ショット)
for(int i=0; i<9; i++){
	if(Teki3TamaLife[i]==1&& tama3 == 0){
		Teki3Tama[i].Pos.x += TEKISHOT3*cos(Teki3Tamad[i])*kabe;//一度だけ追尾弾
		Teki3Tama[i].Pos.y += TEKISHOT3*sin(Teki3Tamad[i]);
		Teki3Tama[i].Angle = Teki3Tamad[i];
	}
}

//敵3の弾の壁の処理-------------------

for(int i=0; i<9; i++){
	if(Teki3Tama[i].Pos.y>740||Teki3Tama[i].Pos.y<30){
		Teki3Tamad[i] = Teki3Tamad[i]-Teki3Tamad[i]-Teki3Tamad[i];
	}
	if(Teki3Tama[i].Pos.x>1000)||Teki3Tama[i].Pos.x<280){
		kabe=kabe*-1;
	}
}

閉鎖

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