ホーミング弾が敵をまっすぐ追いかけてくれない件

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
夢幻ノ月夜
記事: 133
登録日時: 5年前
住所: Stens;Gate世界線

ホーミング弾が敵をまっすぐ追いかけてくれない件

#1

投稿記事 by 夢幻ノ月夜 » 4年前

レーザーの当たり判定の時に使った三点間の角度を返してくれる関数を使って
弾がそのまま直進した時に進むルートと敵に向かって直進した時に進むルートの
間の角度を求めてホーミングさせようとしています

現在のコードはこんな感じです
bsにはボス・enには敵のポインタが入っていて、ここには異常が無いことをデバッグモードで確認しています
どうして間の角度が正確に出ないのか教えてください

コード:

void HomingShot::Move(){
	this->cnt++;
	float A=0;
	if(en!=NULL){
		if(en->GetUsed()==FALSE)en=NULL;
	}
	if(bs!=NULL){
		if(bs->GetUsed()==FALSE)bs=NULL;
	}
	if(bs!=NULL){
		pt_t pt0={this->x,this->y};
		pt_t pt1={this->x+cos(this->a)*this->sp,this->y+sin(this->a)*this->sp};
		pt_t rpt={this->bs->GetX(),this->bs->GetY()};
		A=Get_Sita(pt0,pt1,rpt);
		this->a+=A;
	}else if(en!=NULL){
		pt_t pt0={this->x,this->y};
		pt_t pt1={this->x+cos(this->a)*this->sp,this->y+sin(this->a)*this->sp};
		pt_t rpt={this->en->GetX(),this->en->GetY()};
		A=Get_Sita(pt0,pt1,rpt);
		this->a+=A;
	}else{
		//this->UpDateEnemy();
	}
	this->x+=cos(this->a)*this->sp;
	this->y+=sin(this->a)*this->sp;
	if(cnt > 120)delete this;
}
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
夢幻ノ月夜
記事: 133
登録日時: 5年前
住所: Stens;Gate世界線

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#2

投稿記事 by 夢幻ノ月夜 » 4年前

参考に現時点での軌道はこんな感じです
画像

Get_Sitaの中はこんな感じになっています

コード:

float Get_Sita(pt_t pt0,pt_t pt1,pt_t rpt){
	Vector_t c, p, q;
	Vector_t cp;
	Vector_t cq;
	float s, t, theta;

	c.x=pt0.x;
	c.y=pt0.y;
	p.x=pt1.x;
	p.y=pt1.y;
	q.x=rpt.x;
	q.y=rpt.y;

	Vector2Diff(&cp,&c,&p);
	Vector2Diff(&cq,&c,&q);
	s=Vector2OuterProduct(&cp,&cq);
	t=Vector2InnerProduct(&cp,&cq);

	theta=atan2(s, t);

	return theta;
}
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#3

投稿記事 by プラム » 4年前

夢幻ノ月夜 さんが書きました:レーザーの当たり判定の時に使った三点間の角度を返してくれる関数を使って
弾がそのまま直進した時に進むルートと敵に向かって直進した時に進むルートの
間の角度を求めてホーミングさせようとしています
「レーザーのあたり判定の地気に使った三点間の角度を返してくれる関数」という単語は、僕とあなたしかわからないと思います。
きっと龍神録プログラミングの館に出てきたGet_Sita()のことを言っているのだと思いますが。第三者もわかりやすい書き方でお願いします。

それで本題ですが。
HomingShotといクラスの中身はどうなってます?
「a」という変数と「A」という変数が何を示しているかがよくわからないのと、
「this->a+=A;」というのは角度にGet_Sita()で得た角度を足しているのだと思いますが、その画像や、LINEで見せてもらった動画からして、
角度を足しすぎているようにも見えます。

それとホーミング弾の初期化角度はどうなってます?
初期化角度によって方向があらぶったりすることがあるようです。

もう少しわかりやすく、詳しことを記述していただけるとありがたいです。
最後に編集したユーザー プラム on 2016年3月13日(日) 14:15 [ 編集 1 回目 ]

アバター
夢幻ノ月夜
記事: 133
登録日時: 5年前
住所: Stens;Gate世界線

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#4

投稿記事 by 夢幻ノ月夜 » 4年前

ノウル さんが書きました:
夢幻ノ月夜 さんが書きました:レーザーの当たり判定の時に使った三点間の角度を返してくれる関数を使って
弾がそのまま直進した時に進むルートと敵に向かって直進した時に進むルートの
間の角度を求めてホーミングさせようとしています

[/code]
「レーザーのあたり判定の地気に使った三点間の角度を返してくれる関数」という単語は、僕とあなたしかわからないと思います。
きっと龍神録プログラミングの館に出てきたGet_Sita()のことを言っているのだと思いますが。第三者もわかりやすい書き方でお願いします。

それで本題ですが。
HomingShotといクラスの中身はどうなってます?
「a」という変数と「A」という変数が何を示しているかがよくわからないのと、
「this->a+=A;」というのは角度にGet_Sita()で得た角度を足しているのだと思いますが、その画像や、LINEで見せてもらった動画からして、
角度を足しすぎているようにも見えます。

それとホーミング弾の初期化角度はどうなってます?
初期化角度によって方向があらぶったりすることがあるようです。

もう少しわかりやすく、詳しことを記述していただけるとありがたいです。
aはショットの角度です。

初期化角度は自機からすぐ近くに有るショットの角度が初期化角度でいいと思います
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
夢幻ノ月夜
記事: 133
登録日時: 5年前
住所: Stens;Gate世界線

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#5

投稿記事 by 夢幻ノ月夜 » 4年前

少しいじってみたところもう少しそれっぽい動きはし始めましたが
敵を見失った弾のy座標の移動が0になってしまっているようです

コード:

virtual void Move(){
		this->cnt++;
		this->x+=cos(this->a)*this->sp;
		this->y+=sin(this->a)*this->sp;
		float A=0;
		if(bs!=NULL){
			if(bs->GetUsed()==FALSE){
				bs=NULL;
			}else{
				pt_t pt0={this->x,this->y};
				pt_t pt1={this->x+cos(this->a),this->y+sin(this->a)};
				pt_t rpt={this->bs->GetX(),this->bs->GetY()};
				A=Get_Sita(pt0,pt1,rpt);
			}
		}else if(en!=NULL){
			if(en->GetUsed()==FALSE){
				en=NULL;
			}else{
				pt_t pt0={this->x,this->y};
				pt_t pt1={this->x+cos(this->a),this->y+sin(this->a)};
				pt_t rpt={this->en->GetX(),this->en->GetY()};
				A=Get_Sita(pt0,pt1,rpt);
			}
		}else{
			this->UpDateEnemy();
			this->sp+=0.01f;
		}
		this->a+=A;
		if(cnt > 120)delete this;
	}
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#6

投稿記事 by プラム » 4年前

夢幻ノ月夜 さんが書きました: aはショットの角度です。

初期化角度は自機からすぐ近くに有るショットの角度が初期化角度でいいと思います
夢幻ノ月夜 さんが書きました:少しいじってみたところもう少しそれっぽい動きはし始めましたが
y座標の移動が0になってしまっているようです
初期化角度はたぶんあってると思います(直接コードを見てないでわかりませんが)

あなたがどういう動きをさせたいかが良くわかりませんが。

コード:

        this->a+=A/5;
など、適当な数で割ってみたらどうですか?

というか、「まっすぐ飛んでくれない件」と言っているので、わざわざそんなにめんどくさい飛ばし方をしなくても、
atan2で角度を求めてその方向に角度をセットして飛ばせばまっすぐ飛ぶので、それでいいんじゃないですかね?

アバター
夢幻ノ月夜
記事: 133
登録日時: 5年前
住所: Stens;Gate世界線

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#7

投稿記事 by 夢幻ノ月夜 » 4年前

ノウル さんが書きました:
夢幻ノ月夜 さんが書きました: aはショットの角度です。

初期化角度は自機からすぐ近くに有るショットの角度が初期化角度でいいと思います
夢幻ノ月夜 さんが書きました:少しいじってみたところもう少しそれっぽい動きはし始めましたが
y座標の移動が0になってしまっているようです
初期化角度はたぶんあってると思います(直接コードを見てないでわかりませんが)

あなたがどういう動きをさせたいかが良くわかりませんが。

コード:

        this->a+=A/5;
など、適当な数で割ってみたらどうですか?

というか、「まっすぐ飛んでくれない件」と言っているので、わざわざそんなにめんどくさい飛ばし方をしなくても、
atan2で角度を求めてその方向に角度をセットして飛ばせばまっすぐ飛ぶので、それでいいんじゃないですかね?
ベクトルの長さ揃えたらうまくいきました
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
usao
記事: 1566
登録日時: 6年前

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#8

投稿記事 by usao » 4年前

オフトピック
むしろ画像の弾の軌跡がすてきだと思うので,
何がどういう原因でそういう動きになったのかもう少し詳述いただきたい…

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#9

投稿記事 by プラム » 4年前

usaoさん>>僕もあの演出で、あれを「仕様」という事でいいと思います()

アバター
usao
記事: 1566
登録日時: 6年前

Re: ホーミング弾が敵をまっすぐ追いかけてくれない件

#10

投稿記事 by usao » 4年前

オフトピック
>僕もあの演出で、あれを「仕様」という事でいいと思います()

最終的に的には当たってるようだし,
なんというか,色と軌跡の具合がマッチしてる感みたいなのがある.

閉鎖

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