・日記引っ越し
これまでの日記をはてなダイアリーに引っ越し。前々から、Bloggerが不便だと感じるようになっていて、Bloggerでの記録を移行する方法を見つけたので思い切って移行してみた。この情報が書かれたときから、Bloggerのフォーマットの設定の項目が変わっていて、それを合わせるためにDでごにょごにょとやっていた。
と、いうわけで引っ越したので、これからも生暖かく見守ってください。
a Story of the Swordシリーズの製作日記とか、プログラミング日記とか。
・日記引っ越し
これまでの日記をはてなダイアリーに引っ越し。前々から、Bloggerが不便だと感じるようになっていて、Bloggerでの記録を移行する方法を見つけたので思い切って移行してみた。この情報が書かれたときから、Bloggerのフォーマットの設定の項目が変わっていて、それを合わせるためにDでごにょごにょとやっていた。
と、いうわけで引っ越したので、これからも生暖かく見守ってください。
・シューティング作成
・スクリプトいじり
第2回3時間コンテストということで、「アイテムをとってゲームスピードを上げて、早くクリアすることで得点を荒稼ぎ」というコンセプトの横STGを作ってみた。しかし、まともなシューティングの土台を作るのに1.5時間以上かかって、まともにゲームとして成立しなかった。コンセプト的にもあまり自分の趣味に合わないのでお蔵入り。ランクを能動的に調整できて、それに毛が生えたという程度。
復讐のスクリプトをいじっていた。だいぶいい実装が出来そうになったのだが、最後の壁として型情報が立ちはだかって詰んだ。型の情報を保存する型、というものでもあればよかったのだが見つからない。sizeofやstringofプロパティが取れるのに、型は型ではないというのは、型とはいったい何なのか。Phobosで型情報を触っているモジュールがあり、それを参考にして、テンプレートとaliasとを組み合わせて乗り越えられるか、と思ったが越えられず。stringofプロパティを利用してコンパイル時にコードを生成する、というようなことも考えたのだが、ややこしかったのでやめた。
それで結局妥協して、関数を呼び出すためのラップ関数を一つずつ作って、それへのデリゲートを連想配列に格納する、という方法での実装にした。ラップ関数を作った労力のリターンとして、関数を呼び出すときに引数をどうするのかを意識せずとも使えるようになったので、これで妥協。その実装の進行具合は、構文解析のあたりで機嫌が悪くなっていて、ごく単純な命令しか実行できないという状況。
・スクリプト
・XNA
テンプレートと可変個引数の項目を読んでみたら、昨日当たりかと思ったのは別に使えなかった。それでもう少しコードを書きながらいろいろと試してみたりもしたのだが、やはり手段がなさそう。
それで仕方なくコードを手書きしていくことにしたのだが、それがまた混迷している。さすがに一つ一つの関数ごとに愚直に書く様なことは避けたいので、引数の数ごとに関数を分類する、ということをやっている。そのときに関数の引数として任意の型の関数ポインタを渡すようにしているのだが、それをどう渡すかで詰んでいる。Phobosにもそのようなことをしているものがあって、それを参考にしてはいるのだが上手くいかない。テンプレートで何とかしたいのに上手くいかない。あんまり上手くいかなくて憂鬱。
XNAの本を買ってきた。飛行シューティングを作る前に物理ゲームが大量の壁として立ちはだかっていたことを思い出して、それもまた憂鬱の種。Poseidonが不機嫌なのも憂鬱の種。
・スクリプト設計
・復讐キャラ設定妄想
関数を実装する前に、ちゃんと言語の設計と実行の仕方は決めておくべきだと思って細かい設計を考えていた。大体のことは決まったが、まだはっきりしない場所が残っているので完全に固まるまでは実装しないつもり。
あとは復讐の主要キャラの設定をいろいろと妄想。ご都合主義的な流れになる気配が少なからずあるが、ご都合主義となることの正当な理由をゲーム中に盛り込めば許される、と思う。もしくはストーリーの時間的広がりを大きく拡張して、天文学的な確率が当たるようにするとか。
・トップ絵更新
・スクリプト構文解析
先日まで描いていた絵を日記の2000Hit記念と言う名目にして公開。復讐では全主要キャラにあんな感じの立ち絵が付くかもしれない、付かないかもしれない。
スクリプトの構文解析を作った。ソースを一つ一つの式にツリー構造を持たせて分解。次にやるべきは、式の解釈と制御構文の実装。
・スクリプト構想
スクリプトのことを考えていたら、自前で新しいスクリプトエンジン実装する、という虚数解が導かれてきた。せっかくD言語というマイナー言語を使っているのだから、「ないものは作るしかない」の精神で自作。どういう言語にするか考えて、作りやすそうなLispのような設計にすることに暫定決定。Gimpのスクリプトをいじっていてだいぶ慣れてきたことが影響している。現在の進行状況はファイルを開いてコメント行を処理する機能を作ったところ。
ここ2日間、夢に弾幕が出るようになってきている。たまたま夢に出てきたので記録することもろくに出来ずにほとんど忘れてしまって、覚えているのが弾源が画面端を回りながら弾を撃ってきているという光景だけ。今晩見たら今度こそ記録する。
・絵
・スクリプト調べ
先日からの絵の仕上げ。気になる部分にアンチエイリアスをかけて完成。明日にでも公開予定。
復讐に使うスクリプトについて考えていた。Pythonは既存のものは古くて使えず、自前で作るのもC言語版ヘッダを見た限りでは難しそう。Luaは、新しいはドキュメントがややこしいサンプルコード一本でわからず、古いものは自前でいじる必要がありそう。あと、Luaに馴染めない。D言語をDLLを利用してスクリプト風に使うする、という手があるそうなのだが設計が難しい。結局どうするかが決まらない状況。メイン部分とスクリプトにしたい部分をコンパイルしわけて、スクリプト部分のコードをコンパイルしてリンクするだけで動かせるようにする、という手も考えたがメリットが薄そうで微妙。結局まだ解決していない。
・絵
D+Luaを調べていて、サンプルの意味が良くわからなくなったのでLuaのリファレンスを読んだら、却ってスタックとかでよくわからなくなった。
それでLuaについては本に頼って勉強することにして、パラボラとかもやる気がしなかったので先日から描いていた絵をとりあえず完成させた。残すは陰影付けとアンチエイリアス。
最初の予定では顔だけのつもりだったのだが、せっかくなので全身絵にした。思いつくままに描いていたら、ちびキャラで以前書いたデザインとの間に若干の相違点が出てきたのでちびキャラをそちらに合わせることにする。
絵を描いているのもこの頃楽しくなってきた。
・弾幕作成
PythonDをやろうとしたら、使われているDのバージョンがだいぶ古かったようでコンパイルが出来なかった。そこで気合でコードを直してコンパイル通るようにしても良かったのだが、それは大変そうだったのでやめておいた。
それでパラボラをやろうと思ったのだがどうも見る気も起きなかったので、昨日作成したホーミングを使って弾幕を書いた。そのデバッグ中にプラクティスメニューのバグが出てきたので直した。現行のバージョンには関係のないバグなのでパッチは出さない。
PythonDが駄目だったのでもうひとつスクリプト言語として載っていたLuaを導入してみたが、まだ試していない。GimpのスクリプトとしてSchemeも調べてみた。文法はかなり気持ち悪く感じるが理解できないものではなさそう。
・絵
・蘇生ホーミング作成
Gimpのガウシアンぼかしを使って、蘇生の絵をいじっていた。ぼかしをするだけでドットが滑らかに見えるようになって、フルスクリーン表示にも耐えうる見た目になって強力。ぼかしのやりかたで少し詰まった部分があったのでメモ。
ここで使用する画像は普通のビットマップファイル。まず、このファイルをGimpで開く。次に、レイヤのリストのレイヤ(背景という名前になっているはず)を右クリックして、アルファチャンネルを作成。それから、画像の透明色にしたい部分を選択してデリート。「色域を選択」とかがあるのでそれを使うと便利。そして一番罠となっているのがここで、画像メニュー→モードがインデックスになっているのをRGBに変更。あとはガウシアンぼかしを適用して、pngで保存。透過色がいらなければアルファチャンネルとかの操作は不要。
これで蘇生の絵をどんどん変換していたわけだが、やはり面倒で人間がやる作業ではないと感じた。そこで、スクリプトを書いて処理しようと思っているのだが、その言語がLisp。
それとは関係なしに、暇があったので落書きした絵が気に入ってそれをドット絵にして描いているところ。表情をつけるとなると目が結構繊細になってきて難しい。
あと、特に使う予定は立っていないのだが蘇生にホーミング弾機能を実装した。力押しで美しくないアルゴリズムなのだが、いつもの「プログラミングはパワーだぜ!」とでも。
・パラボラ視点変更完成
視点を回転させる機能を作り忘れていたのでつけておいた。これで多分視点関係は完成。そろそろ本丸の軌道の演算を実装しないといけない。
復讐を作るのにPythonスクリプトを組み込もうと思ってPythonDを調べている。しかしドキュメントを見たところDのコードをPythonから呼ぶ方法はわかりやすく載っているのだが、PythonコードをDから呼ぶ方法が良くわからない。多分書いてはあるのだろうが例が見当たらないので困っている。
・ホイール調査
・なでしこ
昨日に続いてSDLでのマウスホイールの動作について調べていた。SDLのソースを探していたらマウスホイールの上下を処理する部分が見つかったのだが、それが#ifdefとかで囲われていて実際にコンパイルされているのかがわからない。それともうひとつ、SDLでは本来はイベントを利用して入力を処理することを想定しているようだが、自分ではイベントをろくに使っていないのでそれが原因である可能性もある。ただそうだとすればなぜホイールだけ動かないのかという原因がわからない。結局調べても良くわからなかった上、他の操作方法も思いついたのでホイールは諦めることにする。
パラボラの物体の軌道を計算するために必要な積分を解いてみようと取り組んでいたが、どうにも解けそうな気がしなかったのでやはり力押しで攻めることにする。その他の課題となりそうな場所についてもいろいろと対策を考えてみているが、まだ実装していないのでどうなるかがわからない。
なでしこはプログラミング初心者へ教えるのに、どれぐらい良いのかと思って試しに使ってみた。第一印象としては構文を覚えようという意思がなくても、結構自然な日本語で記述ができるのでわかりやすいという印象。しかし、グループと配列とを組み合わせて使い始めてからわかりにくく感じた。ドキュメントを見た限りでは意味が同じであるように感じられた複数の記法が、別のものを組み合わせると違った意味となってくるという点で難しかった。具体的には、配列の要素番号の書き方。文法が厳格なほうが使いやすいということもある。Pythonなんかは多分その究極。
・パラボラ製作
・復讐絵
今日は主にパラボラを作っていた。とはいっても暇すぎて積分を解いている暇がなかったのでシステムを組んでいた。重力といったらりんご、ということで、物体のクラスの名称をAppleにしてみた。本当はObjectとか使いたかったのだけれど、それは全ての根本クラスの名前として使われているから使えない。
で、マウスでの操作を作っていたら上手く動かないところがあって、原因を調査したらSDLではマウスホイール上下が宣言はされているけれども、実装がされていないらしいという事実が判明。SDLのソースをざっと見たがそれらしい部分も見つからない。なので自前で実装するか、それとも他の操作方法を考えるかしないといけない。
それと、気が向いたので復讐の絵をいじっていた。主人公の正面からの絵をとりあえず描き終えて、その他キャラクターの絵を微調整。ゲーム内では使う場所がないと思っているが原画として使うので形は細かく描き込んでいる。そしてさらに暇だったので会話窓用の大きい顔グラフィックを描き始めてみた。目は練習している成果かそれなりになってきたのだが、今度は小さいサイズでは全く気にしていなかった髪が問題として立ちはだかってきた。
・弾幕作成
・パラボラいじり
弾幕を書いた。また特に必要でもないのにレーザーを使っている。下手すると弾幕の半分にはレーザーが登場することになるのではないかというぐらい。レーザーは弾消しが効かなかったりカスれなかったりと根本的にプレイヤーにやさしくない。
パラボラの背景を作成。時計の針を背景にすることで時間の進みとデザイン性とを両方得られる。
相対論の本がついに解くべき式までたどり着いた。が、微妙にややこしそうな積分の式が必要になっている。解けないようであれば力押しで区間を細かく区切ってそれぞれ演算してから足し合わせるという手段をとろうかと思っている。
・蘇生バグ修正パッチ
・会話スクリプト強化
蘇生0.62パッチ。難易度が常に『小説』になる問題を修正。デバッグ用のコードが残っていたのが原因。正式な修正版のりリースはまた明日か明後日に。
復讐の会話スクリプトを微妙に強化。蘇生で作ろうと思っていながら諦めた、行ごとの色変えを実装した。あとは主人公の横顔を紙に書いてみたり。
・遺伝的アルゴリズム考察
・育成型弾幕STG試作
もう日付が変わっているわけだが。
巨大なボスが出るようなSTGを妄想していたら、多関節→ツリー構造→遺伝的アルゴリズムと変な具合に思考が飛躍したので、遺伝的アルゴリズムについて調べてみた。AI関係の本とかをあさったりもしたが結局Wikipedia以上の情報はなかったし、それで恐らく全てなのだろう。
興味深いので使ってみたいと思っているのだが、思いつく使い道がAIの作成と弾幕の作成しかない。しかし遺伝的アルゴリズムの前提として、遺伝子の評価値の導出が簡単であるということがあるそうなので、AIも弾幕もあまり合わない。
AIは格ゲーか戦略系のゲームを考えているが、評価値を求めるにはAI同士を戦わせる程度しか思い浮かばず、十種類の個体を十世代進めるだけでも結構な時間を要しそうなので厳しい。それで作るAIが一つだけならまだしも、格ゲーであればキャラクターごとに別のAIにする必要があるのでさらに時間がかかる。あとひとつの遺伝子に相当する、AIの思考モジュールの単位をどう扱うかという問題もあって難しそう。
弾幕は、評価値を求めるには人間が避けるか弾幕を避けるAIを作って避けさせるぐらいしか浮かばないのだが、前者では人間の労力が大きすぎ、後者ではまともなAIをどう作るかという問題が生じる。弾避けAIを作るには、人間が作ったまともな弾幕を使って学習させるのがいいのだろうが、それもまた手間がかかる。
遺伝的アルゴリズムについてこういった思考を展開したあと、ツリー構造が使いたくなったので育成型弾幕STGを試作してみた。ボスを育成して大きく・強くしていくというコンセプトで試作してみたのだが、頭に描いていたイメージよりも美しさが全くなかったので没ろうかと思っている。ボスのデザインをもっと愛着がわくようなものにすればいいのかもしれないが、それだと巨大化させていくうちにどんどん妖怪になっていくので幾何学的な図形にするしかない。
構造がいかにも遺伝的アルゴリズムを使いたくなる形だったのだが、やはり評価値が越えられない壁として立ちはだかる。
・会話機能製作中
・弾幕作成
会話機能を昨日書いてから、設計を特に考えずに書いていたということに気が付いて、設計を一度落ち着いて考えてから書き直した。それで設計段階で決めた、改ページ処理とイベントからの会話呼び出しを製作。あまり意味もないのに再帰を使って遊んでみた。
以前書き留めてあった弾幕のアイデアを思い出して、それをアレンジして作った。レーザーを乱用しすぎている今日この頃。
復讐のToDoがもはや絵を描くぐらいしか残っていない。いまだに主人公のデザインが確定していない困った状況。
・蘇生情報追加
・システムフォント読み込み作成
ウェブサイトを更新。蘇生の情報を書き足しておいた。
ゲームを配布するにあたって、わざわざフォントを配布するのは容量が大きすぎて面倒なのでシステムフォントを読み込む機能をライブラリに追加した。DでWindowsAPIを使うのは初めてだったが、extern(Windows)のあとに関数宣言を書くだけでいけた。見づらいように感じたが妥協する。
・弾幕作成
・相対論勉強
弾幕を書いた。ネタ切れ感あふれる弾幕。
JOIが終わって一息ついたので相対論の勉強を久しぶりに再開。以前一度ざっと読んだ本をもう一度最初からゆっくりと読み進めている。二週目だと理解度が上がる。数日のうちに必要な式へたどり着きそう。
・JOI本選
昨日今日とJOI本選にいってきた。今年ずっとの連続更新記録が途絶えた無念。
本選問題はやや解けた。クイックソートの使い方を知らなかったことと、scanfの使い方を十分把握していなかったことで得点がだいぶ落ちた。高速なソートぐらい勉強しておけばよかった。
JOIでやったことがゲームプログラミングにおいてどう役立つかを考えてみたが、どうも当たり判定の軽量化ぐらいしかないらしい。でもそれも2Dでは実際に効果があるかわからない。ホーミングの処理に使えるのではないかと思ったがそれも微妙。
ゲームの面白さについて考察してみた。「一杯のお汁粉はおいしいけれど面白くない。百杯のお汁粉はおいしくないけれど面白い」という理論で、ゲームの正統な面白さの方向で行き詰ったら、別の軸へ向かって伸ばすことでゲーム全体の面白さが成立する、というもの。問題はその別の軸をどう見つけるか。お汁粉は量という軸でいけるが、ゲームは別の軸がグラフィックやら音楽やらシナリオやらとすでに出尽くしている感がある。
・弾幕作成
暫くぶりの弾幕作成。レーザーで遊んでいる。それと、蘇生5面の道中の構成を妄想してみたり。今までと製作の順序が逆転している。弾幕のネタが浮かばないのが大きな要因。
明後日はJOIなのだがろくに準備をしていない。アルゴリズムを広く浅く学ぶなんてことはできないし、ヤマを張って当てたところでそれが何かの役に立つわけでもないから。行雲流水の如く。
・絵制作
・JOI勉強
描きかけだった絵を仕上げた。これで主要なボスキャラクターの正面からの絵が揃ったわけだが、肝心の主人公の絵はデザインすら、ちゃんと決まっていない。主人公はただの人間なので装飾をつけにくいのが問題のひとつ。それにしても目のデザインが違うだけで印象が大きく変わる。
JOI三日前なので最低限の勉強を開始した。DでやっていたことがCでもできるようになったところで、昨年の本選の1番を素朴に解いた。ソートのアルゴリズムも勉強したが役に立つかは不明。予選でやっていたことからのパラダイムシフトがないとまともに解ける問題がないように見えるが、3日程度でそう考え方を変えることができるかは甚だ疑問。
・Re:Action構想いろいろ
・絵作成
アイデアが降っては来ないが、暇があったのでどうすればバランスが取れるかを考えてみた。およびその案を実装している。その案だとシステムの車輪の片方が崩れてきて、それとフィーチャーとして考えているアクションの存在意義が薄れてきそうな見込み。その案の一部は採用して、他のアイデアが降って来るのを待つということになりそう。
それで時間を持て余したので復讐の絵を描いていた。今までは紙にはほとんど書き出さず直接ドット絵を描いていたのを、趣向を変えて紙に下絵をある程度書いたあとその輪郭をドットで打って塗るという方式に変えてみた。それで今は水のボスを描いた。主人公は横顔問題含めて絶賛放置中。横顔も紙に書き出したりすれば何とかなると楽観視している。
・Re:Actionマウス操作対応
・Re:Action新背景製作
・新作製作開始
ゲームをやっていたらRe:Actionの入力にはキーボードよりもマウスのほうが向いているのではないか、と思ってマウス操作に対応させてみた。それに伴いライブラリのマウス関係の機能を強化。
それと背景に内トロコイドを使っていたのをいじって、背景に線を使うようにしてみた。どうしてかはわからないが3Dのように見えて綺麗。
そのあとRe:Actionを暫くテストしていたのだが、質量が重いと敵との衝突でぜんぜん動じないため、下手に動かずにいたほうが安全という状態。なのでそれを改善しようと思っているのだが、今思いつく限りの方法では上手くいかないのでアイデアが降ってくるまで熟成させておくことにした。
その間物理ゲームを進めないで置くのもどうかと思ってパラボラマスターのシステムを組むことにした。物体の挙動は式を使える形に整理できるまで書けない。
opCallとopIndexが便利。
・サイト模様替え
・Re:Action進行
・復讐絵制作
数日前に書いた、模様替えを適用。フレームを廃止して、CSSを使ったデザインにした。HTML,CSSは手書き。あまり変な事をやろうとしなければ、HTMLはあまり覚えることがなくて楽。メニューの項目を毎回コピーして書いているのだが、それを外部ファイルにまとめるようなことはできないものか。出来るのであれば教えてもらいたい。あと、地味にディレクトリの区切り文字がローカルのものと違っていて嵌った。
Re:Actionもちまちまと。壁との衝突処理で、テストとして書いた部分を直していなかった場所があったのでそれを直して、それと演算子オーバーロードの間違いを修正。画面がさびしかったので内トロコイドを使って背景を作ってみたが、背景としては主張が強すぎるのが悩み。そのまま弾幕になりそうな感じの背景。
昨日いろいろとやっていたので今日も結構絵を描いていた。主人公の横顔を書いていてどうにも上手く描けなかったので、思い切って正面からも新しく描き直して見た。しかし締まりがなくて困ったので放置した。
その代わりに、二転三転していた土属性のボスを描いた。結局虚数方向へと転んで天使だかシスターだか死神だかわからないものへと落ち着いた。それで残るは水属性のボスだけとなり、描いてみたが思ったように描けない。実際の設定と脳内設定で矛盾しているのが原因かもしれない。
・絵いろいろ
どうもプログラムを書く気がおきなかったので絵を描いていた。プログラムを書かなかった一日というのは何日ぶりか。JOIまであと1週間だというのに。
前から溜めてあったキャラを実際にゲーム中で使うために、横を向いた姿を描こうとしたのだが全く描き方がわからない。特に横顔にどうパーツを配置すればいいのかがかなりきつい。ゲーム中としては正面向きよりも横向きのほうが見る機会が圧倒的に多いため、まともに描けないといけないので困った問題。
描けない理由の分析。
・人間の顔は横から見ることよりも正面から見ることのほうが多い。横から見る場合よりも正面から見るほうがまじめに見ている。その結果横顔についてのデータベースが自分に不足している
・リアル以外の人間の顔も真横から描かれることが少ない。やはりこれも横顔のほうが印象が薄い。
・Z軸のない世界に生きている。そのためX-Y方向から見てばかりでZ-Y方向から見ないし、見えない。
解決策
・髪などで全部隠す。-表情が見えない。アニメーションさせるときに髪をいちいち揺らさないと不自然なので描くのに手間がかかる
・そもそも描かない。-開き直ってZ軸なしにするということ。つまりみんなペラペラ。見分けをつけにくい。
・常にカメラ目線のキャラクターたち。-キャラクターが自意識過剰になりすぎる
・常にややカメラ目線のキャラクターたち。-斜め前を向いている。微妙に描きにくい。微妙に自意識過剰。
4番目をとりあえず採用してみることにする。
あと、気晴らしに蘇生の5面の雑魚敵を描いて見ている。小さなサイズでそれなりに描き込む必要性があるので、デフォルメをどうするのか考えている。デフォルメは苦手なのでこれもまた難しい。
・復讐いろいろ強化
・Re:Action再開
復讐の主にキャラクター関連の機能を強化した。それでキャラクターの向いている向きを取得したり、穴に落ちたときの処理を作ったりした。
デストラクタバグがゲーム中に発生するようになったがGCを手動制御したら起こらなくなった。起きてもそのまま例外を無視して動くようにしてみたが、弊害があるかもしれない。
物理ゲーム製作のモチベーションが急に上がってきたのでとりあえず手をつけられるRe:Actionの製作を再開した。それでボスとして使う予定のフラクタルを実装。適当にやったら面白くなったのでスクリーンショットもつけておく。
・エディタバグ原因捜索中
昨日のバグがいまだに取れない。設計を変える以前からたまに起きていた記憶があるので設計を変えたことは直接の原因ではないはず。
表面的にはオブジェクト一式を初期化するときと、描画するときにアクセス違反が発生している。調べによれば、起動した直後には起きずに、何度もその操作を繰り返しているとアクセス違反となる。そのあたりから、オブジェクトを削除したあとに何かしらが残っていて、それが悪さをしているように感じる。SDやOpenGLを操作するときに何か問題があるのかもしれない。
今のところはマップエディタでしか確認していないから、それの連続使用を避ければ実用において問題はないのだが、ゲームは何度もリセットを繰り返すということをまだテストしていなく、プレイヤーによりそのような操作が取られる可能性はありえるので、ゲームでも発生するのであれば解決しなければならない。
例外が起きたときに、assertのようにどこが例外をthrowしたのかわかる機能があればデバッグが便利になるのだけど。
今日で年齢が5桁になった。そのお祝いとしてのケーキが、通常よりも2,3回り大きいどら焼きにクリームをはさんで、さらにその上にクリームを乗せて団子と抹茶のアイスクリームを飾ったというカオスなもの。
・復讐ステージ読み込み機能作成
・復讐敵配置機能作成中
今日は復讐を進めていた。
まずはステージを外部ファイルから読み込む機能。エディタを作ろうかと思ったけれども、手書きでテキストファイルとして作ったほうが効率がよさそうだったので手書きすることに。
次に、今まで置いておいた、敵のマップエディタ上からの配置を作り始めた。しかし設計を変更したので同じコードでは通らずその修正が大変だった。それで本題のマップエディタ上からの配置は、システム的にはイベントの配置の流用でいけているのに、何故か全く関係のなさそうなところでアクセス違反を起こす。それで今とまっている所。
敵の配置が完成したら、システムのコア部分は完成。あとはキャラクターのアニメーション用に絵を描いたり、会話ボックスを表示したりが今後の課題。この調子で進めていけば2月中旬ごろに遊べるものができそうだが、そろそろJOIのための勉強をしたり、物理ゲームを本格的に作ったりしないといけない。
・復讐設計変更
昨日課題として出てきたステージの管理方法。もともとは敵をステージ内でどのように管理するかというところからでてきたのだが、その設計を考えていたら、ステージを使ってゲーム内の全てのオブジェクトを管理してしまうということになった。
大幅な設計の変更だったので、Poseidon付属のファイル圧縮機能を使ってバックアップをとってから組み始めた。それで、予測したとおりに動かなくなったので、バックアップを参考にして調べようということになったら、圧縮されたファイルが解凍できなくてはまった。結局フラッシュメモリに以前バックアップしたソースを参照した。
それでも詰んでいて、原因不明で呻っていたら原因が見つかった。原因は、コンストラクタ内で生成中のオブジェクトを参照していることだった。冷静になって考えてみれば、
hoge = new Hoge();
と書いた時に、コンストラクタが終わるまではhogeに値は返されず、そのためコンストラクタの中ではhogeは初期化されないのだから当たり前といえば当たり前。結局コンストラクタ内に書いてあった処理を丸々別の関数に移転して、コンストラクタが終わったあとにその関数を呼び出して解決。
・蘇生曲名作成
・復讐ボス絵作成
・ウェブサイト模様替え開始
昨晩から考えていた、蘇生の曲名。結構すらすらと決まった。曲名のリストと、作曲者の薩摩芋氏によるコメントなどはこちらから。それに伴ってゲーム内でも曲名が表示されるようにした。漢字は便利。
あと、蘇生の0.61の置き場所がわかりにくいので、わかりやすい場所置いておいた。
復讐のボス絵も描いている。稲荷を新しく描いて、それと以前の白虎を改善。なかなか良く描けた。ボスのテーマが五行に変わったので、デザインは同じキャラクターでも蘇生とは違ったものになっている。あと書いていないのは5人中2人。描きあがったら主人公とあわせて適当に公開する予定。
サイトのデザインに駄目出しをされた記憶があるので、模様替えを開始した。外部スタイルシートは結構便利。
想像力が枯れた原因にプログラミング疲れがあるのではないかということで、今日は蘇生の曲名表示以外にプログラムを書かなかった。復讐のステージ管理方法という考えるネタが出てきたので、明日はそれを考えて、作るつもり。
・弾幕作成
・復讐攻撃作成
・復讐木ボス描画
数日前に構想した弾幕を作った。5面なので難易度高め。そのうち調整をすることになるだろうけれど。レーザーを実装したから作れるレパートリーはかなり広がった。
それと、蘇生の曲のタイトルを考え始めた。現在1面道中曲のタイトルを考えた。語呂が良くて曲にあってゲームにもあうものをがんばって考えている。
復讐も進めた。主人公の攻撃を実装。およびキャラクター対キャラクターの当たり判定後の処理を強化して、貫通や反射といった処理を作るための土台を作った。
それでプログラムを書くのに疲れて、描きかけだった復讐の木ボスを完成させてみた。なかなかいい感じに描けた。
ここ一週間ぐらい、想像力が枯れている。普段、暇なときには何かネタを考えるのだが、この頃だと何を考えるか考えているだけで暇がつぶれてしまう。原因を分析して、ありえそうなのは遊んでいないから、もしくはタスクの積みすぎ。今のところは新しいものを考えずに作れるものや、以前考えたものを作ってこの状態をしのいでいる。タスクの積みすぎなのだとしたら、さっさと完成しそうなRe:Actionを完成させたい。
・蘇生弾幕作成
・復讐空中ダッシュ作成
・Re:Action進行
まず、レーザー弾幕を改善。そのためにレーザー上の点を取得する関数作成。弾幕としてのコンセプトがやや失われたがバランスが良くなった。次に花っぽい弾幕を作りたかったのでスプリンクラーを4重に重ねてみた。スプリンクラーは軌道が単純だけど隙間が狭くなりがちで避けにくい。
次に復讐。ただのダッシュというのはいまいちだと思ったので空中ダッシュにした。緻密なアクションとかを要求したいのでそれにあった性能にするべく調整をしている。
最後にRe:Action。昨日の改善によって新たに出たバグを多分つぶした。もともと再現性が結構低いものだったので撲滅できているかどうかは怪しいが、理論的には大丈夫のはず。
それからRe:Action花形のパーティクル関係の部分を製作。別にたいして難しいことはなかった。
・蘇生弾幕作成
・Re:Action製作
・復讐キャラ構想
久しぶりにまともな弾幕を作った。それと弾幕の名前をいくつか考えたり。5面は中ボスの弾幕から先に完成しそう。
Re:Actionにも手を着けた。以前書いていた衝突の処理から発想を転換して作った結果、だいぶうまく行くようになったのだが、その方法ではそれはそれでバグがでてくる。原因は大体見当が付いているので何とかなりそう。
そして復讐のボスでまだ構想が決まっていなかった木属性のボスを構想して、描き始めてみた。蘇生の風神雷神をそのまま使っても良かったのではあったけれど、他のキャラクターとの調和を考えて新しいキャラにした。
今日は暇だったのでいろいろと考えた結果がこれ。
・復讐敵弾実装
・蘇生隠しボス実装
このところ、復讐のキャラクターの実装を進めている。今日は敵が弾を撃てるようにしたのと、キャラクター全般の機能強化。せっかく多角形判定ライブラリを作ったのでそれも実装。あとは主人公の攻撃を書いて、敵をマップエディタで配置できるようにすればひとまずベースシステムは完成となる。
それと、ちまちまと進めている蘇生。隠しボスをシステム的に実装して、残るはそれを呼び出す場所と、勝ったときのご褒美の作成。
この頃SSばかり作っていて、物理ゲームを進める気がしない。
・復讐ジャンプ調整
・復讐敵との体当たり実装
・蘇生レーザーいじり
復讐のジャンプを調整。いままでマップスクロールのデバッグ用にFPSを3倍の180で動かしていて、それを戻し忘れたままジャンプを作ってしまったので60FPS用に調整しなおした。
次に蘇生のレーザーをいじっていた。回転3Way極太レーザーを作ってみた。ワインダーに使えそう。レーザーをキャラオーバーの255本まで撃って、回転処理を施したりもしたが全く処理落ちしなかったので、レーザーはソースのややこしさほどには重くないらしい。
そして後は復讐のキャラクター同士の当たり判定を作成。まだ弾を撃ったりするのを作っていないので、とりあえず敵との体当たり。
タイムアタック要素を盛り上げるために高速移動でもつけてみようかと思っている。そのほかにも、何かの条件によって主人公を発狂させるとか。
・復讐ジャンプ正式版実装
・復讐効果音実装
・復讐敵エンジン製作開始
・蘇生レーザー本格使用開始
今日はずいぶんと進めた。連休で寝るのにも遊ぶのにも飽きたから。
まずは仮実装しておいたジャンプをちゃんとしたものにした。押しっぱなしでジャンプの高さが変化するように。
それで、このときジャンプ力と重力とのバランスを取るべくテストを繰り返していて、着地したときに音を鳴らせばわかりやすくなるのではないか、と思って効果音を実装。結局バランスが取れなかった原因はバグだった。
次に敵のエンジンを作ってみた。まだソース上から直接敵を生成するだけだが、それでも動きはする。キャラクター同士の当たり判定はまだない。
で、それにも飽きて、蘇生のレーザーを正式に使えるようにした。回転やら全弾消しやらに対応。ためしに弾幕を作ってみたが詰むのでまだまだ。普通の魔法による弾消しやカスリは面倒なので対応させない。
昨日配列が何とか、と書いたのは、refと書かなくても配列はもともと参照渡しだったからだった。
・Re:Actionシステム作り
・復讐入力周り
・絵作成
Re:Actionを何か進めないといけないと思ってとりあえず難しいことを考えずに作れるシステム周りを作成。タイトル画面とゲーム画面の接続を関数ポインタとかを使って作って、タイトル画面を動かさないといけないという話を聞いたので文字通り動かした。このとき、自作ベクトルクラスのバグに気が付いたので修正した。正月記念のやつのバグの原因もこれだった。
それで飽きたので次は復讐をいじった。だがこっちはこっちでマップ周りがひと段落して次にどこに手をつけるか迷ったので、入力を整理した。で、何を思ったかリプレイを作り始めた。
そのときにキー入力を格納した静的配列を参照渡しとして引数にしようとしたのだが駄目だといわれた。だからといって動的配列に変換して参照渡しすることもできず、結局静的配列の中身を一度動的配列にコピーして、その動的配列を参照渡しして、結果を再び元の静的配列に戻すという面倒なことになった。ポインタを使えばいけるのかもしれないがD言語でわざわざポインタを使うのも嫌。何かいい解決法はないのだろうか。
それと、蘇生の5面ボスと復讐のボスの絵を描いた。5面ボスでは絵の輪郭線をつけるかどうか悩んでいる。4面のボスの絵には輪郭線をつけたのだが、それはとぐろを巻いているという特殊な理由があったから。
復讐のボスの絵のほうは以前描いたものの修正。身軽なイメージで書くべく努力しているのだが、どうもうまく描けない。
・C#とXNA導入
興味があったので導入してみた。感想としては、C#は結構使いやすい。D言語と似ている部分が結構あるので習得も簡単そう。VisualC#はC++よりも機能が強力に感じる。
そしてXNAも導入。ほとんどコードを書かなくても動くのが不思議な感覚。今のところは2Dのテクスチャの描画と2Dの文字列の描画と入力を受け取るところ。3Dモデルの描画を試してみようと思ったが標準で付いていなかったことには若干驚いた。手書きしてもOpenGLで自作するよりははるかに短いコードで済むようだけど。
少し触った感想としては悪くない感じ。機能の全貌をまだ見ていないからまだはっきりとしたことはわからないが、こだわって作るのには向いていそう。ひとまず卓球をXNAで作ってみようと思っている。
・復讐構想
・3Dシューティング風作成
昨晩、イベントエディタができてそれでイベントを書いていて、セーブイベントを作るかどうかと考えたときに、復讐をいったいどのようなゲームにするのかを明確に決めていないことに気が付いた。
横スクロールアクションということは、作っていたのだから決まっているのだが、それでシナリオ性のある長いマップにするのか、それともストーリーはあまり語らない短いマップにするのかが未定だった。で、そのときに思いついたコンセプトが「スコアアタック」。クリアするだけであればあまり難しくないが、スコアを稼ぐための高度なパターン化や精密操作を要求するというやりこみ属性。いわばシューティングの精神をアクションゲームに当てはめたという感じ。
今日作ったのは3Dシューティング風。弾幕を3Dにしたら面白いという話があがって1時間程度で作ってみた。弾が3Dで飛んできて当たり判定も3D。ただ、3Dで何かを作るときに常に壁となるのが操作方法。ボタンを押すことで操作する座標軸を切り替える、というようなシステムを考えては見たが多分使いにくい。
これはもうこれ以上作り進める気はないが、卓球に向けた3Dの練習にはなった。あとglutを使うと落ちることも確認。gluは使えた。
・イベントエディタ完成
・マップ移動作成
イベントエディタを完成させた。開発にEntice Designerを使っていたのだが、手書きでコードを書いてやるのもなかなか。Dfl使っていて、イベントを入れるのにやや手間がかかって、一度にたくさんコントロールを入れると入れ間違いや、入れ忘れが出てきて混乱。順番を考えずに一度にやるのが悪かった。
手書きでやることが多い分、融通が利いて使っているうちにわかってくるのがいい点かもしれない。
イベントエディタができたので、早速本来の目的であったマップ間の移動を作った。想定していたよりもソースが汚くなったので要改善。
一段落したので今度こそ物理ゲームを進めるべき。
・イベントエディタ製作中
相変わらず。wxWidgetsならばSDLやOpenGLと一緒に使うための情報がいろいろあったので、昨日の失敗にめげずに何度も試してみた。公式な情報と同じ手順でやったり燃してみたのだが、結局ことごとく同じエラーで通らずついに断念。
原因として考えられるのは、D1.0系列だからか、Vistaだからか、D以外の環境が入っていてそれが影響しているのか、TangoではなくPhobosを使っているからなのか。
で、結局Dflを使って製作を継続中。だいぶ使い方がわかってきて、APIリファレンスも発見したので調子が乗ってきた。でも結構時間がかかっている。
今日の日記は試しにWindows Live Writerで投稿してみる。