スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

弾幕テスト「グランギニョル座の怪人」

グランギニョルここ3日くらいだれてました。どうも、つんです。
不可視オブジェクトを仲介役にして遠隔地に弾を出すって書いてましたが、弾が弾を撃つことが可能だったのを今さら気づき早速試してみることに。
現在は敵の弾として処理しているのでだめなんですが、敵としてライフを持たせたりするとあっというまに使い魔に変貌します。アリスとか人形使いも綺麗に再現できそうですね。


ってなわけでまだ使い魔にはなっていませんが、アリスの永夜抄ラストワード、グランギニョル座の怪人を作ってみました。といっても固定弾の部分のみで自機狙いとかを定期的にうったりはしません。円形をうまく利用した東方らしい弾幕第一号。

仕組みはとっても簡単。
まず妖精が使い魔を6Wayを2セット同時に発射。
各セットを互いに逆回転させる。
各使い魔は回りつつ回転撃ちをする。

言葉にするにはちょいむずかしいんですがこんな感じです;
使い魔とは親子関係で使い魔の座標系はこの弾幕は妖精基準に設定されており、妖精が移動しても使い魔との位置関係は変化しないようになってます。自機のオプションとまったく同じ原理。
親が消滅すると同時に子も消滅するような設定も可能です。

それにしても妖精がラストワードとは世も末。
コレだけ出すとやっぱり重い;簡略化しないと使えないなぁ。
次回は反射弾のテストで輝夜ラストワード蓬莱の樹海を作ってみる予定。
スポンサーサイト

弾幕テストその4

金閣寺あーもう文花帖つくろうかなぁ弾幕作るの楽しすぎるw

今回はトラウマで有名なこちらの弾幕、新難題「金閣寺の一枚天井」。
最近は妖精も使う…

今回もこれを作るのに機能追加をしました。
それは発射地点のランダム性の付与。
発射点から指定幅のランダム値分離れた距離から弾をだせるというものです。
原作にも多くの弾幕についていると思われるもので、雛のペインフローなんかが若干敵からずれた位置から弾くる感じがするのはこのせいです。

それを今回利用してる点は2点。
天井の発射位置と4Way回転20度ばら撒き弾x2。
天井の発射位置を大きくぶれさせることで通路をランダムでつくることができています。
ばら撒き弾はまぁばら撒き弾。前回は1Wayでしたが今回は4Way。

こちらも処理落ちに関しては問題ないはず。


□これまでで
これまでいろいろ試してみましたが、これまでの弾幕にはすべて共通点があります。
それはすべて敵本体から出されている弾であるという点。
今のところ好きな位置に弾をだせる機能を有していないのでできないのが現状。
すぐに好きな位置から4Way回転ばら撒き程度はだせるようになるでしょうが、
一定パターンで弾を配置していくような弾幕をつくるにはまだまだ機能不足な感じです。

不可視ユニットにショット機能もたせるって感じで解決する予定ですが、これにも一波乱ありそうな予感。

弾幕テストその3+追記

あめ範囲ばら撒き弾実装しました。ついでに下部へののみですが重力も使えるようにしました。きちんとくまれたパターンもゲーム性だがランダム性もゲームの醍醐味のひとつ。

弾が水色なので某ケロの弾幕っぽいですが(ってそりゃ狙いましたが)、一応静葉のスペルも想定してこれらの機能を付けました。ランダム弾自体はプログラムにそういう機能を追加し、スクリプトでランダム性を指定すればこんな風になると。

重力は下向きの速度を毎フレーム加算し、atan2で新しい方向を設定するというもの。
ここらへんを全然想定してなかったのでなんだかひどいことになってます;
移動を[速度と角度]、[x方向速度、y方向速度]といったように管理方法が1つにまとまっていない;
移動まわりもう一回この辺を考慮して改良しなくては;
結構重いからスクリプト実行まわりも要高速化。

でもまぁなんか東方っぽい弾幕ははれるようになってきたし、弾幕テストの優先度落としてはこの辺にして残った部分の作成に戻ります~。

この弾幕使うくらいだったら全方位ばら撒き弾とかのうほうが軽そうだなぁ。
なんたって直線弾のみ。


□動作テストしました
3種の弾幕妖精を載せたアプリを友人にSH902iで試してもらいました。
結果は自弾オフの状態なら処理落ちすることなく30fpsでちゃんと動くとのこと。
=SHならなんでも大丈夫。すごいなぁSH;

弾幕テストその2

けろ今回も弾幕テスト。バグ取りをかねてまずは原作再現が可能かをみます。とてもじゃないが原作と同じような弾幕はつくれないとなるとこの先不安ですからね;

今日の弾幕はこちら。例のあのケロのあの弾幕です。
妖精が撃ってくるなんて世も末ですね;

この弾幕、最初はぱっとみ交差弾ということで軸回転してる弾の集合なのかとおもっていたんですけど、全然違いました。結論からいうとこれは全方位弾をうち一定フレームから一定の角度方向をかえるというものでした。すなわち回転なんかしていない途中角度変化ありの直線弾です。
原作では輪の間隔が一定ではありませんが、これは角度途中なめらかに変化しているためです。

ってなわけで緑色の米弾つくって再現。
なめらかに角度を変化させる機能はなかったんで段階的なものですがこんな感じ。
負荷テストも兼ねてるので思い切って45Way弾うってますwつまりひとつのリングに弾は90発。さらに発狂モード程度の発射間隔。もう弾多すぎ。45Way弾は基本的には回転しながら撃っていますが、ランダムも多少かけてるのでしっかりと見ないとできないようになってます。

弾はピーク時で300以上でているのでN904iでは15fpsしかでませんorz
背景を静止画に差し替えればなんとかいけるかもしれませんけどやっぱきびしいですね;
しかし905iあたりの機種のスペックなら30fpsでまわせるかも…
902iは間違いなく無理w


やっぱルナティックはスペック的に905i以上専用かなぁww
このくらいの量でルナってのがベストなんですが・・・
ルナはやっぱこれくらいいりますよね;弾速だけあげるとか卑怯くさいし。
ん~やっぱ30fpsなら30fps、20fpsなら20fpsで専用にした方がいいのかなぁ。走査を60fps分やってるとかアホくさいような;

弾幕テストその1

こいしスクリプトテスト兼弾幕のテスト。

第1弾は画像のコレ。
この弾幕は2Way弾速度違い5つを同時に発射し、
一定フレームで向きを敵機⇒自機の向きに直し、速度もそろえるというもの。
コレの難しいところは敵機⇒自機の向きに直すという点。
自機狙いに平行な弾をつくるということですな。

発射前にこの角度を計算し、引数で向きを変える関数に渡せばそれまでのはずだったんですが、
スクリプトの致命的な欠陥で引数の解決が受け渡しされたあとに行われるために敵座標の取得ができないために苦労しました。(変数名によるアクセスとかできたりもっとちゃんとしたスクリプトエンジンだったらこんなことには…)
渡す時点で引数をすべて解決する仕組みならいいんですが、ヘンテコな仕組みなのでそれがむずかしいため別の解決策を実装してみました。

それはグローバル変数。これも番号でアクセスするタイプ。
どのオブジェクトからも共通にアクセス可能な変数配列。
角度の受け渡しを一度グローバル変数引き渡すことでなんとかなったというわけです。
グローバル変数の実装方法がstaticなのが若干気に入らない。。
この方法では設定を一歩間違えると別のスクリプトにも影響を与えかねないので番号の決め方はよく考えないと;すくなくともひとつの弾幕で同じ変数を使いまわしてはミスの元か…

あーしっかし意外にもすぐに弱点がみつかっちゃったなぁorz
むずかしいよ;自機狙い平行弾;

グローバル変数実装のついでに三角関数をスクリプトで使えるようにしました。
これでもっといろんなことができます。

ちなみにこの弾幕100個くらいしか弾だしてないので動作的には余裕。

予定機能すべて実装完了

テスト変数やwhile文の実装完了!

ふぅ…やっとですね;
春休みからずっとコレと戦ってきたわけですが、スクリプトエンジンとの戦いはもうそろそろ終わりかもしれません。これ以上の機能増強はまったくもって必要なさそうです。

機能追加の前から関数の使いまわしがしやすくなるとは思ってましたが、
考えれば汎用的な関数を先にいっぱいつくってライブラリ化してしまえばいいんですなぁ。
単純な自機狙いから全方位弾などは弾数が違ったり弾速が違ったりとするだけですから、引数でその辺を変更できるようにすれば使いまわしが聞いて関数の数をぐっと減らすことができるというわけです。ってなわけで今は使えそうなショット関数を量産しているところ。

始めは前に実装していましたが風神録でよく見た画像のような撃ち方。
春休みの実装方法はプログラム中にこの撃ち方を組み込んでしましたが、今度はスクリプトによるものです。この撃ち方はwhile文と変数、自機座標の取得機能がなければスクリプトでは実装不可能でした。動作速度もかなり良好で、まったく気にならない程度。変数が高速なのは前の時点で分かっていましたが、どうやらwhile文も実用レベルのようです。よかったよかった。

この撃ち方+弾にスクリプトを仕込むことで風神録二面の妖精(大)のような弾幕を張ることも簡単にできます。

おーし、ガンガンショット関数つくるぞー!

スクリプトエンジン改良順調に進行中+

尋常じゃない量のバグを考えてましたが意外にもすんなりいろいろ通り、
自機、オプション、自弾、背景が正常に表示できるとこまで確認できました。
これらも一応スクリプトを読んで動いてるでこれが動いたということは読み込み部分は予定通りの機能がのっているということ。
定数のみの計算式を持たせても正常に読んでいることも確認できました。
ここまでで従来のスクリプトエンジン程度のものは動かすことができるはず。

変数やif、whileなどの新機能のテストはこれから。
目玉はこっちですからまだ気が抜けない感じですが、動くとこまではいってるのですぐにできるでしょう。


まだ背景と自弾しかありませんが、処理速度もチェック。
自弾なしの状態では14~15ms。これはいままでと同じ。
3DCGの自弾だしたら23~24ms。平常時から+9ms程度。
これも従来通り。シャローコピーするのめんどくさいからいちいち初期化スクリプトを通してオブジェクトを生成してるんですが、この処理時間が前と同じということは通常の処理速度自体は前とあまり変わらないということ。これはいい傾向。
3DCGは相変わらず重いですけどねぇ。2Dによる半透過も一回試してみないとだめだなぁ。

if、while、変数すぐいけそうですけど、まだ使うとこないんでテストスクリプトがてらまずは敵を配置して簡易のステージを作ることにします。アイテムも実装しちゃいたいですしね~。


□追記
変数は以前書いたように配列管理。各ユニットが変数配列をもっており、要素番号を指定することですきな番号の要素を使用できる。デフォルトで10番程度までを自身の位置情報などの基礎情報を入れておくことでスクリプトからユニットの位置を利用することができます。ただ作ったユニットは他のユニットの配列を見ることはできません。例外なのは自機とボスで自機とボスの情報のみすべてのユニットから参照可能。配列なので実際にも指定の要素から数値を取り出すだけなので処理速度にもほとんど影響を与えないものと思います。
関数(笑)の引数も同様な方式で管理されています。呼ばれた時点で引数にされている式を解釈し配列化、各オブジェクトが持つ引数用配列にいれられ、これもスクリプトで使用可能となっています。

で、今回はこの引数が使用可能になりました。
雑魚敵のライフなど微妙にことなる設定をもつユニットなどの生成がとても楽になりました。これまでは微妙に違っても別の関数(笑)を用意しなかったわけで。随分とすっきり。
他にもショット関数なんかにはかなり重宝しそうなものです。この辺は似たようなものになりがちでしたから。

また、スクリプト中で定数を宣言できるようになりました。
計算式が定数を含んでいても変数を含んでいなければ計算結果に置換されるのでゲーム中の速度に影響を与えることはないので多用できそう。難易度調整用として各数値にかませといて、最後はその定数を弄ることで難易度を調整する~なんてこともできそう。

さて、敵を生成できるようになったのでショット試して~…


■スクリプトデータプリコンパイル
完全なバイナリデータまでは落とせませんが別ソフト作ってそれに通してある程度データサイズを縮小させる程度のことはできるのかなぁ。
どこまでできるか考えてみる↓
・コメント文の削除。
・include文を実際の読込先ファイルの内容に置換する。
・改行・タブ・不要なスペースの全削除。
・解決できる定数データを数値に置換。
・変数や解決できない定数を含まない式を計算結果に置換。
・ユーザー定義関数を短い名前に改名する。

まぁこれだけやってどこまでちじむかなんてたかが知れてますがやってみる価値はある。
とりあえず解析器がパワーアップしたのでこれくらい弄っても問題なくうごきそうだし。
容量よりも定数の先計算なんかは起動時間の高速化に一役買うかもしれないなぁ。

予想以上に根を張っていた実行部分

スクリプトエンジンの実行部分を今作ってるわけですが、
データの格納方法なんかをいろいろ変更してしまったせいで要変更箇所が連鎖的に増加中。
それもこれもどういうわけか実行部分が各ユニット、その他いろいろで別々の実行部分をもっていたからなわけで。今考えるとなんでこんなメンテナンス性の悪いことにしたのか…

こんな感じで各クラスに入り込んだ実行部分を一度すべて引っぺがして、統合後、その機能に対応するように新たなプログラムを書いてます。

まだ動くかもわからんスクリプトのために変更箇所はもう1000行どころの騒ぎではない。。
ってか現時点でプログラム何行あるんだろ。

ソースファイルだけで177KB…単純計算で17万7000文字。ぴんとこない。
春休み時点のつくり直し前のものは75KB…7万5000文字。
ちなみにびーもばは93KB。9万3000文字。

うーん。自分にしたら大規模だなぁ、やっぱり。
+10万文字でどこまで進化させているか。ここが重要か~。


■ようやく
ようやくすべて書き換え終了。これからテストスクリプト書いて動作テストです。
コンパイルしたところ、リソース抜きでjarファイル95KB。難読化・最適化すると55KBでした。
(46クラスで55KBとは、一個1KBちょっと平均か…)
余裕もたせとかないとあとあとつらい目みるのでゲーム性に影響を与える部分以外の機能追加はそろそろ自重した方がいいかもしれませんね。

あ~こわいこわいデバッグの時間だぁ。きりなさそうだなぁ;
Go To 物置。
プロフィール

書いてる人:つん

まったりのんびり。書いてる人の息抜きブログです。

多分連絡先↓
metal_tsun@yahoo.co.jp

カテゴリー
リンク
月別アーカイブ
バロメーター
Java歴:2005年2月から今まで。
3DCG歴:2005年8月から数年。
C歴:2006年4月から今まで。
VB歴:2007年3月からちょっと。
Delphi歴:2007年3月からちょっと。
PIC歴:2007年5月から数年。
イラスト歴:2007年12月から今まで。
DTM歴2008年2月からちょっと。
PHP歴2008年4月からちょっと。
C++歴2008年4月から今まで。
C#歴2009年1月から今まで。
Objective-C歴2009年4月から今まで。
CSS歴2012年5月から今まで。

ブログ開始日2005/10/11


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