ショットの描画について

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

ショットの描画について

#1

投稿記事 by クロウ » 17年前

龍神録プログラミングの館をもとにシューティングを作っているのですが、ショットを撃つ角度に合わせて弾の角度を変えて描画するようにしたところ、すでに撃たれたショットまで今のショット角度で描画されてしまいます。
void graph_cshot(){
	double canon[CSHOT_MAX];//そのときの弾の角度を記憶する用
	for(int i=0;i<CSHOT_MAX;i++){
		canon = ch.Canon_Angle;//弾の角度を記憶
		if(cshot.flag>0){

			DrawRotaGraphF(cshot.x+FIELD_X,cshot.y+FIELD_Y,1,canon,img_cshot[cshot.knd],TRUE);
		}
	}
}

自分では撃たれた直後のショットの角度を記憶してその角度で描画する。次のショットが撃たれたらその角度を記憶してその角度で描画するようにしたつもりです。
すでに撃たれたショットの角度を描画したのちはその角度を固定して飛んでいき、次に撃たれたショットの角度に影響されずに描画する方法がありましたらお願いします。

array

Re:ショットの描画について

#2

投稿記事 by array » 17年前

//通常ショット登録
void ch0_shot_pattern(){
	int k;
	for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
		if((k=serch_cshot())!=-1){
			cshot[k].flag=1;
			cshot[k].cnt=0;
			cshot[k].angle=-PI/2;
			cshot[k].spd=20;
			cshot[k].x=ch.x+cshot0pos_x;
			cshot[k].y=ch.y+cshot0pos_y;
			cshot[k].power=23;
			cshot[k].knd=0;
		}
	}
	se_flag[2]=1;//発射音オン
}

//低速通常ショット登録
void ch1_shot_pattern(){
	int k;
	for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
		if((k=serch_cshot())!=-1){
			cshot[k].flag=1;
			cshot[k].cnt=0;
			cshot[k].angle=-PI/2;
			cshot[k].spd=20;
			cshot[k].x=ch.x+cshot0pos_x/3;//低速中なら位置を中心側へ
			cshot[k].y=ch.y+cshot0pos_y/2;
			cshot[k].power=23;
			cshot[k].knd=0;
		}
	}
	se_flag[2]=1;
}

//自機ショット描画
void graph_cshot(){
	for(int i=0;i<CSHOT_MAX;i++){
		if(cshot.flag>0){
			DrawRotaGraphF(cshot.x+FX+dn.x,cshot.y+FY+dn.y,1,cshot.angle,img_cshot[cshot.knd],TRUE);
		}
	}
}

 

ウイルスバスターの弊害で、シフトが反応しないので確認できないのですが

いじるなら赤の部分だと思いますけど、どうだろ。頑張ってみてください^^


補足----------------
上記の内容をみるとch.Canon_Angleにすでに角度が用意されてるみたいなので

cshot[k].angle=-PI/2;



cshot[k].angle = ch.Canon_Angle;

にしても良いかも知れません。

ch.Canon_Angleの内容が分からないので何とも言えませんが。

array

Re:ショットの描画について

#3

投稿記事 by array » 17年前

cshot.cpp --------
の3行目くらいに

int cshot0pos_x[4]={-10, 10,-30, 30};
int cshot0pos_y[4]={-30,-30,-10,-10};

があったので

int cshot0pos_x[4]={-10, 10,-30, 30};
int cshot0pos_y[4]={-30,-30,-10,-10};
int cshot0pos_angle[4]={-10,10,-20,20};

を作ってあげて、


//通常ショット登録
cshot[k].angle=-PI/2+PI/180*cshot0pos_angle;


//低速通常ショット登録
cshot[k].angle=-PI/2;
//(そのまま)

とすれば大丈夫じゃないですか?

低速ショットは試せませんが、通常ショットなら想定の角度をつけて飛んで行きましたよ。

低速通常ショットは、直線で飛ぶイメージなのですがどうでしょうか。


その他の変更点------
graph.cpp --------
//自機ショット描画
DrawRotaGraphF(cshot.x+FX+dn.x,cshot.y+FY+dn.y,1,cshot.angle+PI/2,img_cshot[cshot.knd],TRUE);

クロウ

Re:Re:ショットについて

#4

投稿記事 by クロウ » 17年前

早速の返信ありがとうございます。
試してみたところ、うまくいきました。低速移動は作っているシューティングでは使わないので大丈夫です。
ch.Canon_Angleというのはバルカンの角度で、自機が上下するとバルカンが傾いて発射角度も変わるというものです。例を挙げるとメタルスラッグのスラグフライヤーという戦闘機のような感じです。

別スレを立てた方がいいのかもしれないのですが、規約の方に「一スレにつき質問は一つ」という項目はなかったようですので、再び質問させていただきます。

arrayさんのコードですと、今のところ4発は同時に発射されています。
これをバルカンに近くするために、発射のテンポを少しずらすようにしたいのです。
つまり、一発目が発射されたら少し遅れて2発目を少し角度をずらして発射、少し遅れて3発目、4発目、そして元の角度で1発目と繰り返すように発射です。

cshot[k].angle=-PI/2+PI/180*cshot0pos_angle; の部分を
k%4の条件でifで区切ったらどうなのかと試しましたが、それでも駄目でやはり4発が同時に発射されてしまいます。
どうすればタイミングをずらして発射させることができるのかお願いします。

array

Re:ショットについて

#5

投稿記事 by array » 17年前

> どうすればタイミングをずらして発射させることができるのかお願いします。

-cshot.cpp
//ショット登録部
void enter_shot(){
	//ショットボタンが押されていたら
	if(CheckStatePad(configpad.shot)>0){
		ch.shot_cnt++;
		if(ch.shot_cnt%3==0){//3カウントに1回
			if(CheckStatePad(configpad.slow)>0)//低速移動中なら
				ch1_shot_pattern();
			else
				ch0_shot_pattern();
		}
	}
	else
		ch.shot_cnt=0;
}
でどうでしょうか。

ペースについては、バルカンの角度の変化速度が分からないので言いようがないです。

ちなみに前のスレでgifアニメあげてたあれですよね。まぁなんにしろ角度の変化量を計算して発射ペースをキッチリ合わすなり、適当な値に変えてそれっぽく動作させてみてはどうでしょうか。

クロウ

Re:ショットについて

#6

投稿記事 by クロウ » 17年前

返信が遅れてしまいすみません。
現在のショット部分のコードはこうなっています。
//自機ショットの登録可能番号を返す
int serch_cshot(){
	for(int i=0;i<CSHOT_MAX;i++){//画面内に繰り出せるショットの個数より少ない
		if(cshot.flag==0)//ショットフラグが立つ
			return i;
	}
	return -1;
}

//通常ショット登録
void ch0_shot_pattern(){
	int k;
	for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
		if((k=serch_cshot())!=-1){
			cshot[k].flag=1;
			cshot[k].cnt=0;
			
			//3発ごとに角度が違う
			switch(k%3){
				case 0:
					cshot[k].angle=-PI/2+ch.Canon_Angle;//発射角度
				break;

				case 1:
					cshot[k].angle=-PI/2-0.05+ch.Canon_Angle;//少し傾ける
				break;

				case 2:
					cshot[k].angle=-PI/2+0.05+ch.Canon_Angle;
					break;
			}

			cshot[k].spd=20;
			cshot[k].x=ch.x+cshot0pos_x+55;
			cshot[k].y=18+ch.y+cshot0pos_y+tan(ch.Canon_Angle)*30;
			cshot[k].power=1;//ショットの攻撃力
			cshot[k].knd=0;//ショットの種類
		}
	}
	se_flag[2]=1;//発射音オン
}

//ショット登録部
void enter_shot(){
	//ショットボタンが押されていたら
	if(CheckStatePad(configpad.shot) > 0 ){

		ch.shot_cnt++;
		if(ch.shot_cnt%3==0){//3カウントに1回
				ch0_shot_pattern();
		}
	}
	else
		ch.shot_cnt=0;
}

//ショットの移動計算
void calc_cshot(){
	for(int i=0;i<CSHOT_MAX;i++){
		if(cshot.flag==1){
			int dranx=cshot.spd+11/2,drany=cshot.spd+55/2;
			cshot.y+=cos(cshot.angle)*cshot.spd;
			cshot.x-=sin(cshot[i].angle)*cshot[i].spd;
			cshot[i].cnt++;
			if(cshot[i].x<-dranx || cshot[i].x>FIELD_MAX_X+dranx ||
				cshot[i].y<-drany || cshot[i].y>FIELD_MAX_Y+drany)//画面から外れたら
				cshot[i].flag=0;
		}
	}
}

この状態で、3発が同時に発射されています。

閉鎖

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