自作STGのレーザーの表示について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

自作STGのレーザーの表示について。

#1

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

現在、DxLibと、VC++2010で、STGを作っているんですが、レーザーの表示で手こずっています、

まず、レーザーというのは、Angleと幅と長さと座標で成り立っています、そこでこんな感じに実装してみたんですが。

コード:

for(int l=0;l<LAZER_MAX;l++){
		if(lazer[l].flag==1){

			DrawModiGraph(lazer[l].x+cos(lazer[l].Angle+DX_PI)*lazer[l].haba/2, //x1
				lazer[l].y+sin(lazer[l].Angle+DX_PI)*lazer[l].haba/2,//y1
				lazer[l].x+cos(lazer[l].Angle-DX_PI)*lazer[l].haba/2,//x2
				lazer[l].y+sin(lazer[l].Angle-DX_PI)*lazer[l].haba/2,//y2
				lazer[l].x+(cos(lazer[l].Angle)*lazer[l].nagasa)+(cos(lazer[l].Angle+DX_PI)*lazer[l].haba/2),//x3
				lazer[l].y+(sin(lazer[l].Angle)*lazer[l].nagasa)+(sin(lazer[l].Angle+DX_PI)*lazer[l].haba/2),//y3
				lazer[l].x+(cos(lazer[l].Angle)*lazer[l].nagasa)+(cos(lazer[l].Angle-DX_PI)*lazer[l].haba/2),//x4
				lazer[l].y+(sin(lazer[l].Angle)*lazer[l].nagasa)+(sin(lazer[l].Angle-DX_PI)*lazer[l].haba/2),//y4
				imgrs[17],true);
		}	
	} 
こんな感じに実装してみたんですが、画面にはレーザーなど全く表示されず、ただボスが平然と立っているだけです。

デバッグで、ブレークポイントなどで、通っているかは試してみたんですが、どうやらちゃんとLazerのfragは1になっているようです。

ちなみにレーザーを出している部分のコードがこちらです

コード:

  if(Boss.cnt%30==0){
		for(int l=0;l<LAZER_MAX;l++){
			if(lazer[l].flag==0){
				lazer[l].x=Boss.x;
				lazer[l].y=Boss.y;
				lazer[l].flag=1;
				lazer[l].Angle=atan2(pl.y-Boss.y,pl.x-Boss.x);
				lazer[l].haba=30;
				lazer[l].nagasa=500;
				break;
			}	
		}    
	}
最後に編集したユーザー プラム on 2015年12月02日(水) 21:25 [ 編集 1 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 自作STGのレーザーの表示について。

#2

投稿記事 by Dixq (管理人) » 8年前

http://dixq.net/rp/
34章は参考になりますか?
ただ小学生では数学の計算が難しいでしょうね・・。

ブレイクポイントで
DrawModiGraph
の引数にしている値がどうなっているか確認しましょう。

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

Re: 自作STGのレーザーの表示について。

#3

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

あたり判定については、向かい合う角とプレイヤーの座標との角度(説明下手ですいません)が90°以下なら「当たっている」となるのは、なんとなくわかるんですが。 その四点の求め方がいまいち・・・・
友人に少し教えてもらって、自分なりに考えて実装してみたんですが・・・やはり僕の知識じゃ駄目ですね。

引数については、なんとなくそれっぽい値が出てます。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 自作STGのレーザーの表示について。

#4

投稿記事 by みけCAT » 8年前

ノウルver2.7.7v さんが書きました:まず、レーザーというのは、Angleと幅と長さと座標で成り立っています、
これだけではよくわからないですが、とりあえず図1のように仮定します。また、Angleとsinとcosの関係は図2のようになります。
(図中ではlazer[l].は省略します)
reezaa_20151202_1.png
レーザーの仮定・sinとcos
reezaa_20151202_1.png (10.7 KiB) 閲覧数: 8134 回
この図は置いておいて、一旦
ノウルver2.7.7v さんが書きました:

コード:

			DrawModiGraph(lazer[l].x+cos(lazer[l].Angle+DX_PI)*lazer[l].haba/2, //x1
				lazer[l].y+sin(lazer[l].Angle+DX_PI)*lazer[l].haba/2,//y1
				lazer[l].x+cos(lazer[l].Angle-DX_PI)*lazer[l].haba/2,//x2
				lazer[l].y+sin(lazer[l].Angle-DX_PI)*lazer[l].haba/2,//y2
				lazer[l].x+(cos(lazer[l].Angle)*lazer[l].nagasa)+(cos(lazer[l].Angle+DX_PI)*lazer[l].haba/2),//x3
				lazer[l].y+(sin(lazer[l].Angle)*lazer[l].nagasa)+(sin(lazer[l].Angle+DX_PI)*lazer[l].haba/2),//y3
				lazer[l].x+(cos(lazer[l].Angle)*lazer[l].nagasa)+(cos(lazer[l].Angle-DX_PI)*lazer[l].haba/2),//x4
				lazer[l].y+(sin(lazer[l].Angle)*lazer[l].nagasa)+(sin(lazer[l].Angle-DX_PI)*lazer[l].haba/2),//y4
				imgrs[17],true);
という式に従い、DX_PIは円周率であると仮定して(x1, y1), (x2, y2), (x3, y3), (x4, y4)をプロットすると、図3のように点が2個ずつ重なってしまいます。
これでは描画結果はほとんど見えないでしょう。
reezaa_20151202_2.png
提示されたコードに基づくプロット
reezaa_20151202_2.png (8.92 KiB) 閲覧数: 8134 回
図1の定義に基づく場合、以下のようにするといいでしょう。
座標は図4のようになります。

コード:

			DrawModiGraph(lazer[l].x-cos(lazer[l].Angle)*lazer[l].haba/2, //x1
				lazer[l].y-sin(lazer[l].Angle)*lazer[l].haba/2,//y1
				lazer[l].x+cos(lazer[l].Angle)*lazer[l].haba/2,//x2
				lazer[l].y+sin(lazer[l].AngleI)*lazer[l].haba/2,//y2
				lazer[l].x-(sin(lazer[l].Angle)*lazer[l].nagasa)+(cos(lazer[l].Angle)*lazer[l].haba/2),//x3
				lazer[l].y+(cos(lazer[l].Angle)*lazer[l].nagasa)+(sin(lazer[l].Angle)*lazer[l].haba/2),//y3
				lazer[l].x-(sin(lazer[l].Angle)*lazer[l].nagasa)-(cos(lazer[l].Angle)*lazer[l].haba/2),//x4
				lazer[l].y+(cos(lazer[l].Angle)*lazer[l].nagasa)-(sin(lazer[l].Angle)*lazer[l].haba/2),//y4
				imgrs[17],true);
reezaa_20151202_3.png
座標の計算
reezaa_20151202_3.png (22.84 KiB) 閲覧数: 8134 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 自作STGのレーザーの表示について。

#5

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

あー、なるほど。だから表示されていないように見えたんですね。

みけさんが言ってくださった方法で実装したらレーザー自体は表示されるようになりました!
そこで、表示されるようになったことはなったんですが、なぜか表示される角度がおかしいです。

画像がこちら↓
[thumbnail]https://i.gyazo.com/af67f423ac5adaf1e7d ... 55e1db.png[/thumbnail]

レーザーの角度は、プレイヤーの向きを指定しているのに、なぜか意味不明な方向に飛んでいきます。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 自作STGのレーザーの表示について。

#6

投稿記事 by Dixq (管理人) » 8年前

とりあえずレーザーを一つだけ登録し、その時の角度をブレイクポイントで確認してみてください。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 自作STGのレーザーの表示について。

#7

投稿記事 by みけCAT » 8年前

atan2関数で角度を求めているので、x軸の正の方向がAngle=0ですね。
これを試してみてください。

コード:

			DrawModiGraph(lazer[l].x-sin(lazer[l].Angle)*lazer[l].haba/2, //x1
				lazer[l].y+cos(lazer[l].Angle)*lazer[l].haba/2,//y1
				lazer[l].x+sin(lazer[l].Angle)*lazer[l].haba/2,//x2
				lazer[l].y-cos(lazer[l].AngleI)*lazer[l].haba/2,//y2
				lazer[l].x+(cos(lazer[l].Angle)*lazer[l].nagasa)+(sin(lazer[l].Angle)*lazer[l].haba/2),//x3
				lazer[l].y+(sin(lazer[l].Angle)*lazer[l].nagasa)-(cos(lazer[l].Angle)*lazer[l].haba/2),//y3
				lazer[l].x+(cos(lazer[l].Angle)*lazer[l].nagasa)-(sin(lazer[l].Angle)*lazer[l].haba/2),//x4
				lazer[l].y+(sin(lazer[l].Angle)*lazer[l].nagasa)+(cos(lazer[l].Angle)*lazer[l].haba/2),//y4
				imgrs[17],true);
reezaa_20151204.png
計算
reezaa_20151204.png (18.75 KiB) 閲覧数: 7923 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 自作STGのレーザーの表示について。

#8

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

みけさんの言ってくださった方法で、もう一度試してみたんですが。やっぱり角度がおかしいです。
あと、AngleIってなんですか?←

Dixqさんの言ってくださったブレークポイントでレーザーの角度の値とPlayerの座標の値を見てみたんですが。

pl.x=14240.000000000000
pl.x=142.0

pl.y=208.83287048339844

lazer.Angle=-3.0402719451208875

となっています。
画像(↓
画像

どう見てもおかしいです。(ちなみにレーザーが打たれてからプレイヤーの座標は一切いじってません
最後に編集したユーザー プラム on 2015年12月05日(土) 13:50 [ 編集 2 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 自作STGのレーザーの表示について。

#9

投稿記事 by みけCAT » 8年前

ノウルver2.7.7v さんが書きました:あと、AngleIってなんですか?
AngleにDX_PIの最後の文字を連接したもので、いわゆるtypoですね。
申し訳ありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 自作STGのレーザーの表示について。

#10

投稿記事 by みけCAT » 8年前

ノウルver2.7.7v さんが書きました:Dixqさんの言ってくださったブレークポイントでレーザーの角度の値とPlayerの座標の値を見てみたんですが。

pl.x=14240.000000000000

pl.y=208.83287048339844

lazer.Angle=-3.0402719451208875

となっています。
Boss.xとBoss.yの値はどうなっていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 自作STGのレーザーの表示について。

#11

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

Boss.xとBoss.y共に200.0です。

レーザーの座標も200*200です

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 自作STGのレーザーの表示について。

#12

投稿記事 by みけCAT » 8年前

ノウルver2.7.7v さんが書きました:pl.x=14240.000000000000
本当にこんな大きな値だったのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 自作STGのレーザーの表示について。

#13

投稿記事 by Dixq (管理人) » 8年前

もう一度プレイヤーとボスの座標を確認してみてください。
レーザーの向きは

> lazer.Angle=-3.0402719451208875

とのことで、-174°位を指しているのでちょうどピッタリ合っていると思います。

訂正:
> pl.x=14240.000000000000
> pl.y=208.83287048339844
とのことで、角度の計算も正しそうです。
間違っているのはpl.xの座標みたいですね。

確かにボスが200,200にいればこれくらいの角度になりそうな気がします。
pl.xを150位にすればうまくいくのではないでしょうか。

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

Re: 自作STGのレーザーの表示について。

#14

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

すいません、
pl.x=14240.00000000000000000ではなく
pl.x=142.0でした。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 自作STGのレーザーの表示について。

#15

投稿記事 by Dixq (管理人) » 8年前

上の画像でプレイヤーは表示されてますか?
あの青い人間の形した物体でしょうか?

・プレイヤーの座標
・ボスの座標
・レーザーのAngle
・実行結果のスクリーンショット

をもう一度説明してください。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 自作STGのレーザーの表示について。

#16

投稿記事 by へにっくす » 8年前

ノウル さんが書きました:すいません、
pl.x=14240.00000000000000000ではなく
pl.x=142.0でした。
試しにNo.8で添付された画像にその位置を反映させてみる。
dixq_net_forum_3_t17368_1.png
プレイヤーがその位置にいない?
かつレーザーの方向が微妙に違う気がします。
(座標系が違ってたらすみません)
written by へにっくす

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

Re: 自作STGのレーザーの表示について。

#17

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

すいません、何かの手違いでいろいろと可笑しくなってしまったようです。

もう一度スクショとざひょうを調べますね

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

Re: 自作STGのレーザーの表示について。

#18

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

もう一回やり直しました。

コード:

Boss.x=200;
Boss.y=200;
Lazer.x=200;
Lazer.y=200;
Lazer.Angle=2.8547293040671149;
pl.x=378.50000000000000;
pl.y=259.00000000000000;
スクショはなぜかスクショソフトが動かないんで・・・・すいません

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

Re: 自作STGのレーザーの表示について。

#19

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

あ、すいません、解決しました。
何かの手違いで。
レーザーの角度設定時の角度が

コード:

Angle=atan2(pl.y-Boss.y,pl.x-pl.x-Boss.x);
になってました、こんなくだらないことで、すいませんm(__)m

わざわざ回答してくださったみなさん、ありがとうございました!(*´ω`*)

閉鎖

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