FC2ブログ
戯言徒然日記開発日記東方DTMC/C++DoJaLuaCG備忘録
気が向いたら創作活動とかしてる人のチラシの裏。
--.--.-- --
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2009.02.08 Sun

 他よりも明らかに凝ってます;


 レーザーの実装 part.2 です。一応1タイプ実装し終わりました。ショートレーザーと勝手に名付けましたが、指定長のレーザーを射出するやつです。

 20090208

 結局、弾の連続というか弾の集合として実装しました。なので独自コード書きました。画像は長さ500のショートレーザーを出してます。特徴を以下に。

 

1. レーザーを途中でぶった切ることができる。

2. レーザーの当たり判定を構成要素の弾との円判定にできる。

3. 最後までしっかり飛んでくれる(?)

4. 根本を消されても大丈夫!

 

1. レーザーを途中でぶった切ることができる。

 実装をかいつまんで説明します。レーザーは前述のように弾の連続です。連続というのは内部的に、であって、描画自体は先頭の弾がやってます。レーザークラスの中でレーザークラスのポインタを持って前後を参照できるようにしている(双方向連結リスト)ので、

 ・先頭が最後尾までシークして座標を取得

 ・先頭と最後尾の距離を計算

 ・距離を縦幅として拡大描画

という手順です。

 ぶった切るというのはレーザーの一部が削除された場合、後方のレーザーを独立させているだけです。(独立といっても直後のレーザーの前方参照をNULLにしてるだけですが;もちろん直前のレーザーの後方参照もNULLにしてます。)

 これで文花帖も安心ですね(ぇ

 

2. レーザーの当たり判定を構成要素の弾との円判定にできる。

 内部が弾の連続なので、その弾との判定でOKです。楔弾や小弾のレーザーによって調整すれば見た目とほぼ同じ判定が実現できます。矩形判定ではどうしても角が出る、もしくは意図せずめり込めたりするので、そういうのも解決できるかと思ってます。

(原作はどうなっているかわかりませんが、レーザーの先端はゆるい、幅はシビアといった点からはこの手の実装と思ってます。)

 

3. 最後までしっかり飛んでくれる(?)

 レーザーを弾の連続で実装し、先頭に描画をさせている。ということは先頭が画面外にでたり被弾したらどうなるでしょう?1.そのままでは常に先がとがってしまい、太い部分が画面端にこなくなります。(特に長いショートレーザーの場合は顕著にわかる。)

 これを解決するために構成要素数からテクスチャのUV値を割り出し、各弾に設定しています。構成要素数は移動量から何個で指定長に達するかを計算して出してます。ショートレーザーは普通、指定長に達するまでその速さは変わらないで射出されるのでこういうことができます。弾が消えて参照をつけかえるときに再計算することで、途中で切れても安心です。画面外に出ていくときはこのUV操作はしていません。画面外に出たときもやるとまた先が尖ってしまうからです(笑)

 

4. 根本を消されても大丈夫!

 指定長になるまで射出するオブジェクト(敵とかボスとか)がレーザーの末尾に新規オブジェクトを追加ってのは難しそうです。なので射出するオブジェクトは先頭のレーザーだけを作ってます。あとはそのレーザーが末尾に新規レーザーを追加し、また末尾が末尾に・・・てな具体で伸びていきます。これをすると、末尾のレーザーが消えると指定長に達してなくてもレーザーはのびなくなります。

 これは別に原作どうこうではなく、個人的に霊撃打ったら長いレーザーを回避できるとか言うのをなくすためにつけてます。最後尾の消える場合、指定長に達していない場合は先に後方への追加を行ないます。するとそいつは最後尾ではなくなります。つまり、指定長に達するまでは最後尾は削除されないんです。

 

 非常にダラダラと長文を書いてしまいました;それなりに凝ったので許して下さい。現時点ではリソース間借りということで判定の近似化はしてません。リソースを自作する際にテクスチャのマッピングがずれると思いますので。。。(早く自作しないと;;;)

 

 これにてショートレーザーは一旦完了!もう一つ、ディレクショナルレーザー(スペル名ではなく)ってのを作る予定です。あのレーザー開始点からずっと射出され続けるタイプです。これは結構頭悩ませてて時間がかかりそうです;最初はショートレーザーを少し弄るだけと思ってたのですが。。。先にオブジェクト管理方法の変更とか大規模工事に取りかかろうかなっと。


管理者にだけ表示を許可する

Template by まるぼろらいと
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。