ページ 1 / 1
自作STGのレーザーの表示について。
Posted: 2015年12月02日(水) 21:04
by プラム
現在、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;
}
}
}
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月02日(水) 21:20
by Dixq (管理人)
http://dixq.net/rp/
34章は参考になりますか?
ただ小学生では数学の計算が難しいでしょうね・・。
ブレイクポイントで
DrawModiGraph
の引数にしている値がどうなっているか確認しましょう。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月02日(水) 21:37
by プラム
あたり判定については、向かい合う角とプレイヤーの座標との角度(説明下手ですいません)が90°以下なら「当たっている」となるのは、なんとなくわかるんですが。 その四点の求め方がいまいち・・・・
友人に少し教えてもらって、自分なりに考えて実装してみたんですが・・・やはり僕の知識じゃ駄目ですね。
引数については、なんとなくそれっぽい値が出てます。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月02日(水) 23:13
by みけCAT
ノウルver2.7.7v さんが書きました:まず、レーザーというのは、Angleと幅と長さと座標で成り立っています、
これだけではよくわからないですが、とりあえず図1のように仮定します。また、Angleとsinとcosの関係は図2のようになります。
(図中ではlazer[l].は省略します)

- レーザーの仮定・sinとcos
- reezaa_20151202_1.png (10.7 KiB) 閲覧数: 10865 回
この図は置いておいて、一旦
ノウル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 (8.92 KiB) 閲覧数: 10865 回
図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 (22.84 KiB) 閲覧数: 10865 回
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月03日(木) 19:54
by プラム
あー、なるほど。だから表示されていないように見えたんですね。
みけさんが言ってくださった方法で実装したらレーザー自体は表示されるようになりました!
そこで、表示されるようになったことはなったんですが、なぜか表示される角度がおかしいです。
画像がこちら↓
[thumbnail]
https://i.gyazo.com/af67f423ac5adaf1e7d ... 55e1db.png[/thumbnail]
レーザーの角度は、プレイヤーの向きを指定しているのに、なぜか意味不明な方向に飛んでいきます。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月03日(木) 23:18
by Dixq (管理人)
とりあえずレーザーを一つだけ登録し、その時の角度をブレイクポイントで確認してみてください。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月04日(金) 00:34
by みけCAT
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 (18.75 KiB) 閲覧数: 10654 回
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月04日(金) 18:55
by プラム
みけさんの言ってくださった方法で、もう一度試してみたんですが。やっぱり角度がおかしいです。
あと、AngleIってなんですか?←
Dixqさんの言ってくださったブレークポイントでレーザーの角度の値とPlayerの座標の値を見てみたんですが。
pl.x=14240.000000000000
pl.x=142.0
pl.y=208.83287048339844
lazer.Angle=-3.0402719451208875
となっています。
画像(↓
どう見てもおかしいです。(ちなみにレーザーが打たれてからプレイヤーの座標は一切いじってません
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月04日(金) 19:21
by みけCAT
ノウルver2.7.7v さんが書きました:あと、AngleIってなんですか?
AngleにDX_PIの最後の文字を連接したもので、いわゆるtypoですね。
申し訳ありません。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月04日(金) 19:25
by みけCAT
ノウルver2.7.7v さんが書きました:Dixqさんの言ってくださったブレークポイントでレーザーの角度の値とPlayerの座標の値を見てみたんですが。
pl.x=14240.000000000000
pl.y=208.83287048339844
lazer.Angle=-3.0402719451208875
となっています。
Boss.xとBoss.yの値はどうなっていますか?
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月04日(金) 19:33
by プラム
Boss.xとBoss.y共に200.0です。
レーザーの座標も200*200です
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月04日(金) 21:50
by みけCAT
ノウルver2.7.7v さんが書きました:pl.x=14240.000000000000
本当にこんな大きな値だったのですか?
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月04日(金) 23:52
by Dixq (管理人)
もう一度プレイヤーとボスの座標を確認してみてください。
レーザーの向きは
> lazer.Angle=-3.0402719451208875
とのことで、-174°位を指しているのでちょうどピッタリ合っていると思います。
訂正:
> pl.x=14240.000000000000
> pl.y=208.83287048339844
とのことで、角度の計算も正しそうです。
間違っているのはpl.xの座標みたいですね。
確かにボスが200,200にいればこれくらいの角度になりそうな気がします。
pl.xを150位にすればうまくいくのではないでしょうか。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月05日(土) 11:31
by プラム
すいません、
pl.x=14240.00000000000000000ではなく
pl.x=142.0でした。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月05日(土) 18:43
by Dixq (管理人)
上の画像でプレイヤーは表示されてますか?
あの青い人間の形した物体でしょうか?
・プレイヤーの座標
・ボスの座標
・レーザーのAngle
・実行結果のスクリーンショット
をもう一度説明してください。
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月05日(土) 21:07
by へにっくす
ノウル さんが書きました:すいません、
pl.x=14240.00000000000000000ではなく
pl.x=142.0でした。
試しにNo.8で添付された画像にその位置を反映させてみる。
プレイヤーがその位置にいない?
かつレーザーの方向が微妙に違う気がします。
(座標系が違ってたらすみません)
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月05日(土) 21:27
by プラム
すいません、何かの手違いでいろいろと可笑しくなってしまったようです。
もう一度スクショとざひょうを調べますね
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月05日(土) 21:38
by プラム
もう一回やり直しました。
コード:
Boss.x=200;
Boss.y=200;
Lazer.x=200;
Lazer.y=200;
Lazer.Angle=2.8547293040671149;
pl.x=378.50000000000000;
pl.y=259.00000000000000;
スクショはなぜかスクショソフトが動かないんで・・・・すいません
Re: 自作STGのレーザーの表示について。
Posted: 2015年12月05日(土) 21:44
by プラム
あ、すいません、解決しました。
何かの手違いで。
レーザーの角度設定時の角度が
コード:
Angle=atan2(pl.y-Boss.y,pl.x-pl.x-Boss.x);
になってました、こんなくだらないことで、すいませんm(__)m
わざわざ回答してくださったみなさん、ありがとうございました!(*´ω`*)