「メテオス」に関する日記(4)

<前 次>

JavaScriptによる制御

なんだかJavaScriptから直接Javaアプレットの変数を指定しようとすると、配列や一部のクラスの仕様の違いからうまく動かないようです。
なので、極力いろんなオブジェクトにアクセスしたりしないように、アプレットそのもののメソッドをできるだけ少ない引数で、つまり一つの文字列で呼び出すようにすればうまく制御できるかなと思っています。
あと、使用中の変数の値をいきなり変えたりしたら、元の値であることを前提として動いているプログラムが誤動作を起こすこともあるので、前処理・後処理を入れるためにもメソッドを呼び出す方式がよさそうです。
Qから返事があるまでは地味なところの改良でもしていようと思います。

Q公認がつけばいいな

メテオスもどきの使用許可を得るためにキューエンターテインメントに問い合わせをしてきました。

お世話になっております。今回は相談したいことがあって連絡いたしました。
私は今、遠からずサービス終了してしまうメテオスオンラインを忍びなく思い、以下のURLにてメテオスオンラインに似せたJavaアプレットによるゲームを作っております。
http://tgws.fromc.jp/akiyame/meteonsim/
今回相談したいことというのは、このゲームの公開を許可してほしいということです。
私はこれによって利益を得るつもりはなく、キューエンタテインメント様に損害を与えるつもりもございません。
むしろこのような形でメテオスを体験できる機会を増やすことでもっとメテオスが広まってほしいと思っております。
最初は自分でプログラムを書いているので大丈夫だろうと思って作っていたのですが、メテオスというゲームの優れたルールはキューエンタテインメント様の発明であり、そのルールを使ったプログラムを勝手に作ることは好ましくないと思い、連絡させていただきました。
許可しないというのであればその理由を、許可してくださる場合は使用条件と使用可能な範囲を教えていただきたく存じます。
許可されなかった場合はファイルをサーバー上から撤去し、許可された場合は可能な限り条件に従いたいと考えております。
いずれの場合も、状況と結果の報告のためにこのやり取りは私のホームページ上で公開したいと思っております。
前向きなお返事を期待しております。

新しいアイコンですよ

掲示板にいずみさんとネコブラのアイコンを追加しました。
大きいほうの画像は既にできていたのですが、16x16のサイズの小アイコンを作るのが難しくて時間がかかってしまいました。

メテオスもどきのほうは今JavaScriptを使って惑星データのセーブ&ロードを実装しようと試みているところです。
これはこれで…色々とややこしいですね。
Qに送る文章も考え中です。

ツールの登録

DirectMusicツールの更新のときに書いた、「次の機会」のところを更新しました。
とはいっても、ほぼ定型文なので大した内容にはなりませんでしたが。
あと、ツールの作り方のページでのメッセージの扱いについて少し修正しました。

メテオスもどき、縦切り離し点火の特例ができたのでアップしてきました。
Qに送る文章も考え中です。
自分を正当化しつつ、相手にとっても損がないように、考えてるところです。

時の重み

マップシステムについて、だんだん思い出してきました。
マップチップとキャラをまず全部3D空間上に配置してZソートして奥から順番に表示、表示対象をCBWWindowにしても正常にクリッピングして表示、マウス操作対応のため見た目の座標と内部座標の対応、データ部と表示部のプログラムの分離、などなどなど…。

NeoMuplで、なんとなくランダムのくせに選ばれる曲が偏る気がしたので、スキップ率に加えて、時の重みというパラメータをつけて、最近再生されていない曲を優先的に選ぶようなオプションをつけました。
正直、100倍優先にしても数千曲の中だと焼け石に水のような気もしますが、なんとなく水なりの効果はあるような気がしてます。

メテオスもどきはシュートのおかしな挙動を少し改善しました。

ほぼ完成

メテオスもどき、落下メテオによる押し下げも実装して、ドッキング関係もきれいに書きなおして、あとはいくつかの不具合を直して演出をつければ単体としては完成ということになります。
なので、そろそろ本家の開発元のQに問い合わせてみようと思っています。
動画のときもファンサイトキットのときも終了告知のときもつれない返事ばかりでしたが…。

シュート!

久々に本家のメテオスオンラインをやって対戦を楽しみつつ色々調べてました。
タイムアクセル時のメテオの降りかたは通常時の4~5倍程度、シュートして上のカタマリにくっつけた場合はシュートしたメテオの速度などは考慮されない、カタマリ同士がドッキングした場合は下のカタマリのパラメータが優先される、などなど。
で、今日作ったのはシュートして固まりにくっつけたときの正しい挙動です。
つまり、下にくっつかずに中に入り込みます。

還元もできました

メテオスもどき、ついに還元が実装できて、メテオスの基本ルールはあらかた網羅できました。
他には、メテオの移動可能範囲の表示、落下メテオやシュートしたメテオはつかめないようにする、打ち上げたメテオの内訳を表示する、などの細かい機能を色々つけました。
そして、最初手抜きで作っていた自然発火しないメテオの並びを探すアルゴリズムも改良して、得点もつけました。
あとは、細かいパラメータなどを実装するだけです。

エラーを起こす

メテオスもどき、本来ありえないところにカタマリが発生してゲーム進行に支障が出る深刻なバグがあったので、その解決のために、メテオに安全装置をつけました。
つまり、何もないところにカタマリをセットしようとしたり、何もないところに色を設定しようとするとエラーが起こるようにしたのです。

そして滅亡もできた…

メテオスもどき、演出面の貧弱さを除けば、ほぼ9割方できた感じです。
切り離し点火も知っている限りでは完全に実装できたし、上昇・落下速度リミッターも問題なく働くし、最下方点火ボーナスもきっちり考慮されるし、上まで積みあがればHPが減って0になると滅亡するし、あとはカタマリの還元と、その他諸々の係数の実装をすればゲーム部分は完成といえます。
ためしに反重力惑星を作ってみるとなかなか面白い動きになってました。

縦点火もできました!!

縦点火も実装できました。
一部アルゴリズムを間違えて縦点火が逆噴射になっちゃったり、くっついてないのにドッキングする問題を発見したり、まだまだ問題もあるわけですが、とりあえずなんとかメテオスの基本ルールは実装できたかなというところです。
同時点火ボーナスや最下方点火ボーナスなども実装して、あとはゲームオーバーやシュート相殺なども実装すればいよいよゲームとして成り立つようになります。

横点火ができました

まぁ、色々問題も孕んでいるわけですが、なんとか横点火も実装できました。
上昇と下降が同時に起こることによるすり抜け、メテオの数え漏れによる存在しないカタマリのデータの蓄積、Y方向オフセット値の増大による著しい速度低下、カタマリがうまくドッキングされない、点火されるはずのメテオが点火されない、カタマリの中のメテオを引っ張り出したり巻き込んだりするとカタマリの形が変わる、直ったものもあればいまだ調査中のものもあります。

落下メテオと高速移動

切り離しも上方逆L字点火も実装できそうな気がしてきました。
今のプログラムでは横点火の後に縦点火を処理しているので、縦点火のときに横点火の形跡を見つけたら同時点火として処理するのです。
全消しの判定も結構簡単に作れそうな気がします。
で、今日作ることができたのは、落下メテオの出現と、高速移動。
落下メテオは時間がたつとちゃんとたくさん降るようになってくれます。
これでずいぶんとメテオスらしくなってきました。
いまだに点火しても打ちあがらないんですけどね!

無理矢理止めてみる

今日はNeoMuplでMIDIの再生が止まらなくなる問題を半ば強引にですが解消しました。
マシンの動作が非常に重たいときに確率的に起こるものなのでデバッグしにくいのですが、とりあえず無理矢理全部止めれば何とかなるだろうと思ってやったので、本当に解決しているかどうかはわかりません。

メテオスもどきはドッキング処理を作っていよいよ点火の処理が作れそうなところです。
シュートの挙動も改善しましたし、ドッキングも再帰処理により案外簡単に記述できましたし…。
問題は切り離し点火だ!!
切り離し点火をとりあえず実装するのは難しくないんです。
難しいのは、必要以上の切り離しをどう抑制するかなのです。
今考えているアルゴリズムではどうしても上方逆L字点火が切り離されてしまうのです。

ドッキングの初歩

メテオスもどき作ってました。
メテオスのプログラムで最も難しい部類に入ると思われるドッキング関連の処理です。
それでも今は静止したメテオとシュートされたメテオのドッキング、つまり着地だけなので楽なほうなのです。
でも本家はあらゆるパターンのドッキングに加えて、いろんなアイテムでカタマリがかき回されるから桁違いに複雑なんだろうなぁ…。
これができたらいよいよ打ち上げることができるようになります。
ちなみに、点火の処理自体は既に出来ていて、飛ばずに燃えカスになります。

パツーンと

シュートを作りました。
メテオスもどきの。
まだメテオ同士の当たり判定を作っていないので一度飛ばしたら最後、二度を地に足つけることなく奈落の底まで落ちていきますが。
しかしこれで整然としたメテオの並びを崩すことができるようになったので移動処理などのテストもしやすくなりました。
点火のアルゴリズムなんかも考えてみたので近日中には打ち上げることが出来るようにはなるでしょう。

広い範囲に対応したい

メテオスもどきを作っていたのですが、どうにも動かない人が多いようなので、ちょっと色々試していました。
とりあえずappletタグからobjectタグに変えてみたのですが、結果は芳しくないようです。
後はプログラム側でうまく過去のバージョンでも動くようにするとか、JavaScriptでブラウザ判別するとか、そういった方法を試してみたいです。
一応、今日はメテオの移動制限を作りました。

縦移動は大変だった

今日はちょっとナマライザに細かい新機能をつけました。
それが、フィルタの並べ替え。
フィルタ条件が多くなってくると見通しが悪くなるので、並べ替えたり整頓したりして見通しを良くしようということです。
あとは、どんなデータがやってきても例外を出さない安全なクリップボードを作って、解析中にエラーで中断されないようにしました。

今日のメテオスもどきは、縦移動を作りました。
昨日の段階で横移動と同じではうまくいかないということはわかっていたのですが、想像していた以上にてこずりました。
しかも、やっと縦移動できるようになった今現在の状況でも、縦移動した後すぐに横移動、そしてその逆もできない状況なので、その点の改善が必要になりそうです。

マルチスレッドを甘く見てました

とりあえずメテオスもどきは横移動から作り始めたわけですが、思うようにマウス入力を受け付けてくれなくて困りました。
ダブルクリックと認識されるからマウスダウンイベントが来ないのかと疑って色々調べてみたところ、原因は入力状態の更新の直前で入力が来て、更新前の情報を使う前提のメソッドが正常動作しなかったのが原因でした。
マルチスレッドではこういったタイミングの悪さによる誤動作が起こりうるので十分気をつけていたつもりだったのですが、肝心なところを見落としていたようですね。
あと、動作速度一定化の方法を、一定FPSを保つ方式から、変動FPSで可能な最大の速度を出すようにしました。
ただ、それでゲームに不公平が出てはいけないので、内部的な動作は一定FPSの動作を再現して、描画だけを実際に変動FPSにしています。

新しいメテオのデザイン

メテオスもどき、今まではディジェの絵を使っていましたが、そろそろ画面の構成もつかめてきたので絵をオリジナルのものに差し替えることにしました。
背景は画面構成を示す枠のみ、メテオはデフォルトの一番基本的なデザインのものを30x30のドット絵に起こしなおしています。
プログラムのほうも色々やりたかったんですが今日はあまりできませんでした。
一応パラメータにどんなものがあるかを調べたりメテオの現れ方、消え方なども調べたりしたんですけどね。

<前 次>