エラーを起こす
メテオスもどき、本来ありえないところにカタマリが発生してゲーム進行に支障が出る深刻なバグがあったので、その解決のために、メテオに安全装置をつけました。
つまり、何もないところにカタマリをセットしようとしたり、何もないところに色を設定しようとするとエラーが起こるようにしたのです。
メテオスもどき、本来ありえないところにカタマリが発生してゲーム進行に支障が出る深刻なバグがあったので、その解決のために、メテオに安全装置をつけました。
つまり、何もないところにカタマリをセットしようとしたり、何もないところに色を設定しようとするとエラーが起こるようにしたのです。
今日はなんとなくYomi-Searchと独自ドメインについて調べてました。
個人の嗜好に合わせて表示結果を操作し、好きなカテゴリを含むサイトを優先的に表示するカテゴリサーチを作りたかったので、とりあえず既にあるものを見てみようということになったのです。
独自ドメインは、どうせやるなら別サイトとして、と思ったのですが、ついでのものにお金をかけるつもりはなかったので、とりあえず保留にしておきました。
要望にあったふわふわふにゃのマウス操作を作りました。
やっていることはキャラから見たマウスの相対位置を入力として使うというシンプルなものですが、マウス操作だと「どの方向に」じゃなくて「どこに向かって」移動するかなので操作感が違ってこれはこれで楽しいですね。
ふわふわふにゃでは加速度で動いているのでマウスカーソルに振り回されるような動きをしますが、キー操作と組み合わせると細かい動作もできるようになりそうです。
ちなみに、キー入力による加速も同時に行っているので、マウスがあるのと同じ方向にキー入力すると猛烈な加速度で一気に飛んでいく…ような気がします。
そういえば、ダブルクリックでゲームオーバー画面から戻るとすぐに次のゲームが始まってしまうバグを見つけました。
今度また直しておきます。
メテオスもどき、演出面の貧弱さを除けば、ほぼ9割方できた感じです。
切り離し点火も知っている限りでは完全に実装できたし、上昇・落下速度リミッターも問題なく働くし、最下方点火ボーナスもきっちり考慮されるし、上まで積みあがればHPが減って0になると滅亡するし、あとはカタマリの還元と、その他諸々の係数の実装をすればゲーム部分は完成といえます。
ためしに反重力惑星を作ってみるとなかなか面白い動きになってました。
縦点火も実装できました。
一部アルゴリズムを間違えて縦点火が逆噴射になっちゃったり、くっついてないのにドッキングする問題を発見したり、まだまだ問題もあるわけですが、とりあえずなんとかメテオスの基本ルールは実装できたかなというところです。
同時点火ボーナスや最下方点火ボーナスなども実装して、あとはゲームオーバーやシュート相殺なども実装すればいよいよゲームとして成り立つようになります。
まぁ、色々問題も孕んでいるわけですが、なんとか横点火も実装できました。
上昇と下降が同時に起こることによるすり抜け、メテオの数え漏れによる存在しないカタマリのデータの蓄積、Y方向オフセット値の増大による著しい速度低下、カタマリがうまくドッキングされない、点火されるはずのメテオが点火されない、カタマリの中のメテオを引っ張り出したり巻き込んだりするとカタマリの形が変わる、直ったものもあればいまだ調査中のものもあります。
切り離しも上方逆L字点火も実装できそうな気がしてきました。
今のプログラムでは横点火の後に縦点火を処理しているので、縦点火のときに横点火の形跡を見つけたら同時点火として処理するのです。
全消しの判定も結構簡単に作れそうな気がします。
で、今日作ることができたのは、落下メテオの出現と、高速移動。
落下メテオは時間がたつとちゃんとたくさん降るようになってくれます。
これでずいぶんとメテオスらしくなってきました。
いまだに点火しても打ちあがらないんですけどね!
今日はNeoMuplでMIDIの再生が止まらなくなる問題を半ば強引にですが解消しました。
マシンの動作が非常に重たいときに確率的に起こるものなのでデバッグしにくいのですが、とりあえず無理矢理全部止めれば何とかなるだろうと思ってやったので、本当に解決しているかどうかはわかりません。
メテオスもどきはドッキング処理を作っていよいよ点火の処理が作れそうなところです。
シュートの挙動も改善しましたし、ドッキングも再帰処理により案外簡単に記述できましたし…。
問題は切り離し点火だ!!
切り離し点火をとりあえず実装するのは難しくないんです。
難しいのは、必要以上の切り離しをどう抑制するかなのです。
今考えているアルゴリズムではどうしても上方逆L字点火が切り離されてしまうのです。
メテオスもどき作ってました。
メテオスのプログラムで最も難しい部類に入ると思われるドッキング関連の処理です。
それでも今は静止したメテオとシュートされたメテオのドッキング、つまり着地だけなので楽なほうなのです。
でも本家はあらゆるパターンのドッキングに加えて、いろんなアイテムでカタマリがかき回されるから桁違いに複雑なんだろうなぁ…。
これができたらいよいよ打ち上げることができるようになります。
ちなみに、点火の処理自体は既に出来ていて、飛ばずに燃えカスになります。
シュートを作りました。
メテオスもどきの。
まだメテオ同士の当たり判定を作っていないので一度飛ばしたら最後、二度を地に足つけることなく奈落の底まで落ちていきますが。
しかしこれで整然としたメテオの並びを崩すことができるようになったので移動処理などのテストもしやすくなりました。
点火のアルゴリズムなんかも考えてみたので近日中には打ち上げることが出来るようにはなるでしょう。
今日はプログラミングコーナーを更新しました。
国内ではあまり記述を見かけないDirectMusicツールについて書きました。
Bomber丸Worldで使う予定の技術なのでちょっとお披露目です。
今検索したところ、海外でもあまり丁寧な解説してくれてるサイトはないみたいですね。
今日はちょっと家に帰ってたら頭がふらふらして気分が悪かったです。
そんなわけで今日はあまり色々とできなかったのですが、とりあえず秀丸を使い始めてからは重いeclipseには戻れないのでMIFUMIDIAのソースを秀丸で編集するためのフォルダに移動しておきました。
メテオスもどきを作っていたのですが、どうにも動かない人が多いようなので、ちょっと色々試していました。
とりあえずappletタグからobjectタグに変えてみたのですが、結果は芳しくないようです。
後はプログラム側でうまく過去のバージョンでも動くようにするとか、JavaScriptでブラウザ判別するとか、そういった方法を試してみたいです。
一応、今日はメテオの移動制限を作りました。
実写版のトランスフォーマー見てきました。
自動車や飛行機などの機械だと思っていたものが実は宇宙人だったというお話です。
滑らかな映像は良かったのですが、あまりに速やかに変身してしまうもので、気付いたらいつの間にか変身完了してしまっているというのが少し残念でした。
そして、あわただしい割りに結構長い映画だったりします。
映画館で映画を見るのは久しぶりだったので、あの激しいアクションを3時間と言うのはちょっときつかった気がします。
全体としては、変形ロボットもののロボットに宇宙人という設定をつけたようなもの、ですかね。
戦闘機に変形して離脱というのはなかなか良かったとおもうのです。
なんだかウルトラマンレオが激しく見たくなってきました。
円盤生物ノーバの登場する49話を。
間違ってもメビウスの28話じゃありません。
照る照る坊主で人々発狂、クルクルまわって赤い雨、パンチもキックも効果なし、ノーバは正義のチームを全員飲み込み殉職させたシルバーブルーメに次ぐ凶悪な敵であります。
今日はちょっとナマライザに細かい新機能をつけました。
それが、フィルタの並べ替え。
フィルタ条件が多くなってくると見通しが悪くなるので、並べ替えたり整頓したりして見通しを良くしようということです。
あとは、どんなデータがやってきても例外を出さない安全なクリップボードを作って、解析中にエラーで中断されないようにしました。
今日のメテオスもどきは、縦移動を作りました。
昨日の段階で横移動と同じではうまくいかないということはわかっていたのですが、想像していた以上にてこずりました。
しかも、やっと縦移動できるようになった今現在の状況でも、縦移動した後すぐに横移動、そしてその逆もできない状況なので、その点の改善が必要になりそうです。
とりあえずメテオスもどきは横移動から作り始めたわけですが、思うようにマウス入力を受け付けてくれなくて困りました。
ダブルクリックと認識されるからマウスダウンイベントが来ないのかと疑って色々調べてみたところ、原因は入力状態の更新の直前で入力が来て、更新前の情報を使う前提のメソッドが正常動作しなかったのが原因でした。
マルチスレッドではこういったタイミングの悪さによる誤動作が起こりうるので十分気をつけていたつもりだったのですが、肝心なところを見落としていたようですね。
あと、動作速度一定化の方法を、一定FPSを保つ方式から、変動FPSで可能な最大の速度を出すようにしました。
ただ、それでゲームに不公平が出てはいけないので、内部的な動作は一定FPSの動作を再現して、描画だけを実際に変動FPSにしています。
メテオスもどき、今まではディジェの絵を使っていましたが、そろそろ画面の構成もつかめてきたので絵をオリジナルのものに差し替えることにしました。
背景は画面構成を示す枠のみ、メテオはデフォルトの一番基本的なデザインのものを30x30のドット絵に起こしなおしています。
プログラムのほうも色々やりたかったんですが今日はあまりできませんでした。
一応パラメータにどんなものがあるかを調べたりメテオの現れ方、消え方なども調べたりしたんですけどね。
メテオスもどき、メテオ降下割合を実装して初期メテオを配置するところまでできました。
もちろん初期点火防止措置もきっちりできていますよ。
プログラミングコーナーに書いてあるランダムセレクトのアルゴリズムが役に立ちました。
そしてこれで初めて気付いたのが、どの惑星にも、割合はどうあれ必ず5種類以上のメテオが降らなければいけないこと。
なぜかというと、燃えカスが還元した瞬間まわり4方向に繋がる可能性があるため、4方向が全て異なる種類でリーチであったとしても置けるメテオがあるように、5種類目のメテオが必要というわけなのです。
画面の比率とかはメテオスオンラインのをそのまま使っています。
今度はメテオをドラッグでずらす処理とシュートを作る予定です。
カタマリが絡んでややこしい点火関連は後回し…。
で、惑星パラメータ設定画面がいつでも作れるような状態、すなわち、骨組みができていつでも設定するパラメータを増やすことができる状態にまで持ってくることができました。
で、手っ取り早く惑星列幅と高さと降下割合を実装して、画面を出してみました。
それに伴って、惑星パラメータを色々調べたりもしています。
ひそレポに書いてあったのよりやっぱりパラメータはかなり多いですね。
メテオスもどき、リソースを読み込んで表示するところまでできたので、今日はキー&マウス入力処理を作りました。
Javaには現在のキー&マウスの状態を直接的に得る方法はないので、イベントを拾ってそれで状態を検出しています。
このあたりは昔VisualBasicでAPIに頼らずゲームを作っていた頃の知識を使っています。
メテオスもどき、効率の良いリソースの読み込みを考え中なのです。
ロード時間を体感的にゼロにしたいんですよね。
なので、最初に画像を必要としない画面を表示して、その裏で別スレッドでMediaTrackerを動かして読み込むことにしました。
あと、メインスレッドの動作をアプレットのクラスに組み込んで全体をすっきりさせたり、後々に響きそうな部分の最適化とかをしていました。
アプレットテスト用のPHPを改良して更新されていないクラスは再コンパイルしないようにしました。
クラスファイルの最終更新日時とソースファイルの最終更新日時を調べてソースのほうが新しければ再コンパイルします。
で、それで作っているメテオスもどきのほうは実はほとんど進んでません。
画像を出すぐらいは作りたかったんですけどね。
メテオスもどき作成中であります。
現在はフレームレート一定化と基本的な描画機能を作ったところで、最新版はアキヤメにアップしてあります。
まあ、こんな状態だから、ゲームとして遊ぶどころか、何も動いてもいないんですけどね。
どうも~。
とりあえず今日は前から更新しようしようと思い続けていてずっとしてこなかったActiveBasicのコーナーを更新しました。
当たり前のようにキャラ画像にマスク画像をつけていたので、それをつけなかった場合にどうなるか、というのを実際に試しました。
それと、ついでにActiveBasicの公式サイトのURLが変更になっていたのに合わせてリンク先も変更しました。
一日目:
準備には出席せず旅行にだけ参加するのはどうかと思ったが参加費を払っている以上行くことにした。
自動車に分乗して鳥取へ。
途中山を越えるとき、昼ごはんに流れる川の上の流しそうめん屋で流しそうめんを食べた。
一般的にイメージされる、流れるそうめんを途中で掬い上げる方式のものではなく、終着点で待ち構えて掬い上げ、掬えなかった分は自分のざるにたまっていく方式だった。
イベントなどでみんなで一斉に食べるのではなく、一人一人前を基準にしているからこういう方式になったのだろう。
着いたらさっそく海へ。
海は浅く、波は荒かった。
少し離れたところに小さな島が見えたが上陸は別の日にして、とりあえず泳ぐことにした。
少し泳いだ後、皆で陸に上がって休憩を取った。
そのとき、先輩の一人(以後よく出てくるので彼)が、砂ってあったかいなと言ったことがきっかけで埋められた。
そして調子付いた我々は寝かして埋められた彼を覆う砂を人の形に細工して、まあ誰でも考え付きそうな面白い体格が作られた。
彼は休憩中に2本飲んだビールのためか、ずっと笑顔だった。
砂から出た彼は、その後しばらくフリスビー投げをしていたのだが、それで酔いがまわったのか、完全に酔いつぶれてしまった。
石に頭をぶつけてもやっぱり彼は笑顔だった。
そんな笑顔のままぐったりと横たわる彼を見て民宿の人が溺れたのかと思ってこちらへ来てしまった。
だが、酔っ払っているのに海に入ろうとするのを止めるために再び埋められた彼を見せて事情を説明すると、納得してくれたようだった。
夜は民宿でやたら豪華な夕食を食べた。
酒は好きではないのでビールは飲まないといったら本当にお茶を用意してくれた(ちなみにビールは民宿のではなく講座で勝手に持ってきたもの)。
話をわかってくれすぎてちょっと怖いが、まあ無理に飲まされるよりは遥かに良いだろう。
その後の宴会ではさすがにいつまでも遠慮しているわけには行かないのでチューハイを少し飲ませてもらった。
もっとも、その何倍もの量のソフトドリンクを飲んでいたのだが。
そして、アルコール度数40%のウォッカ(一口分)の回し飲みが始まったのだが、私はビンが空く直前の最後の分だったためか若干多かったようだ。
注射の前の消毒のようなにおいだったが、意外とすんなり飲めてしまった。
某先輩は酔った勢いでピーナッツを猛烈な勢いで食べまくったり、周りがやめろといって阻止しようとしたのを振り切ってチューハイを混ぜて飲んでしまい、また酔いつぶれてしまった。
そして彼はいつ吐いても大丈夫なようにとトイレに連れて行かれたのだが、吐かずに寝てしまったらしい。
私は宴会のあと何もせずすぐに寝た。
二日目:
この日は丸一日泳げる日だった。
昨日上陸し損ねた島への上陸をすべきか昨日にも増して高くなった波に乗るか考えたが、とりあえず最初は島への上陸を試みることにした。
藤壺が多くて裸足では上陸できないと聞いていたので、サンダルを持って泳いでいった。
ウニもいるようだったが私には見つけられなかった。
島に上陸して気が住んだ私は、浮き輪を持って遊ぶことにした。
泳げるし足もつくのだが、浮き輪に乗って波に乗るのが楽しいのだ。
浮き輪に乗って都合の良い波に乗り、後はひっくり返らないようにバランスを取るのだ。
言ってみれば、浮き輪サーフィンというところである。
昼食は浜辺で弁当を食べたのだが、焼け付くような日差しが日焼け止めクリームを塗った肌にすら痛かった。
その後もずっと波乗りに挑戦し続け、ひっくり返ったり投げ出されたりうまく波に乗れたりもした。
夕食は相変わらず豪華で、この日は勧められたので少し酒も頂いた。
夕食後は一日目の続きで花火を打ち上げた。
一日目の分には書いていないが、一日目は途中で打ち上げ用の筒が詰まり、最後まで終わらなかったのだ。
大きな花火が何度も打ち上がり、その下で同期の人からコミュニケーション能力の低さについてお叱りを受けた。
そのときあたりから、海で体を冷やしたか夕食での酒が効いたのか、はたまた少し便秘気味なのにたくさん食べたせいかお説教が痛かったせいなのか、体調を崩して気分が悪くなってしまった。
その後の宴会の前に便所に行ったら治ったところを見るあたり、便秘と食べすぎが原因だったらしい。
ともかくその日はみんなが気を遣ってくれて、大量に残った酒を消費しなくてはならないのに無理に飲まなくてもいいといってくれた。
そんなわけで、同じくあまりまくったお菓子をたくさん食べていたのだが、そのうち周りが飲むのに疲れてくると、全員が酔いつぶれてしまったら後は頼むと頼まれてしまった。
一応体調が回復したので少しだけ飲んだのだが、やはりそれ以上に大量にお菓子を食べ、ソフトドリンク類を飲んでいた。
この日もすぐ寝た。
三日目:
つまり今日だ。
朝起きて朝食を取り、民宿を後にして鳥取砂丘へ。
海岸とは少し質の違う砂で、遠くのほうにあった丘のほうへ向かった。
登りやすい緩やかな坂と挑戦者を待ち受けるような急な坂があったので、もちろん急なほうを上ったのだが、やはりとても疲れてしまった。
馬車やラクダには乗らず、砂丘から勢いよく飛び降りる外人を見ながら砂丘をあとにした。
その後は車ごとに各自好きに観光しながら帰れば良いということだったのだが、乗っているメンバーがメンバーだったので、特に寄り道せず、まっすぐ帰ることになった。
帰る途中に寄った店で梅とろろざるそばを食べたのだが、仲間が少し残したのでその分も食べた。
今日から二泊三日で旅行です。
海で泳ぎます。
メテオスもどき作り始めました。
eclipseが重いのとアプレットビューアでは実際的な動作テストができないことから、ブラウザ上で効率よくデバッグできる方法を考えていました。
ブラウザ上でのデバッグの大きな問題点としては、ミディビのときにJavaのクラスローダキャッシュのせいでアプレットが最新版に更新されないという問題に直面していたので、今回はそのことを中心に対策しました。
まず考えたのが、URL単位でキャッシュを保存していることは知っていたので、JARファイルを返すアドレスの後ろに毎回異なる文字列をつけるというものでしたが、後半の文字列を無視して同じファイルと認識したり、ファイルとは別のものと認識してエラーを起こしたりしたため失敗でした。
そして最終的に考えたのが、ミディビを作るときに行っていた、ディレクトリ名を変える方法を自動化するやり方です。
要するに、アプレットをテストするページにアクセスすると、PHPスクリプトによって毎回違う値でディレクトリを作り、その場所にJARファイルのコピーを置くというもので、これは非常にうまく働いてくれました。
そうすると欲が出てくるもので、どうせ常に最新版に保つんだからコンパイルもアクセス時に同時にしてしまおうということになりました。
それはそれで、コンパイルするだけならバッチファイルに入れていたものをPHPに移植するだけで簡単だったのですが、ここで思わぬ問題が出ました。
エラーメッセージが出力されなかったんです。
バッチファイルでコンパイルしていたときも、コマンドプロンプトが瞬時に消えてしまっていたために見えなかったのですが、今回は標準出力をページに表示するなりファイルに出力するなりすれば簡単に見られると思っていました。
ところが、エラーの出力先は標準出力ではなく標準エラー出力であったため、標準出力には何もないという状態になっていたのでした。
最終的に、「2>&1」とすることで、標準エラー出力2に出たエラーを標準出力1にリダイレクトして、その結果をPHPで拾うことで無事表示させることができました。
そうそう、明日から二泊三日で旅行に行きます。
海で泳ぎます。
そんなわけで、アニメーションやリソース管理システムをいじりました。
これでマップを表示するときにアニメーションをコピーしまくってもメモリエラーを起こさないのです。
マップ表示自体は一から作り直すことになったのですが、流用を考えて中身をチェックしていたおかげで問題点がいち早く見つけられたように思います。
そんなわけで、明日からはマップ表示を一から作り直します。
こっそりメテオスもどきを作ってやろうかと画策中です。
遠からず終わってしまうメテオスオンラインに最後の光を与えることができるか、それともQに喧嘩を売ることになるのか、はたまた燃えカス1個ほども影響がないのか、わかりませんが、何か思い出に作っておきたいんです。
う~む、マップシステム、アニメーションの扱いが根本的に変わっているので以前と同じアルゴリズムではうまく動いてくれなさそうです。
それどころかまたアニメーションやリソース管理システムもいじらなければならないような気がしてきましたよ。
メテオンのページのほうは料金のページに画像を追加しました。
どこでどのようにお金がかかるかなどですね。