メイン | 2006年07月 »

2006年06月28日

FlashPlayer9リリース

ついにきました、FlashPlayer9正式版リリース!
ActionScript3.0対応ということでFlash職人の多くが挫折する可能性が高いのですが、なんとかしがみついていきたいところです。

開発者用に ActionScript3.0 で組めるFlash Professional 9 ActionScript 3.0 Previewも同時リリースされています。
基本機能は Flash8 のままですが、ひとまず先行して ActionScript3.0 で開発できるようになっています。

これまでの作品も移植すれば格段に処理が速くなるのは分かっているんだけど、ものすごく大変・・・
でもやりたいこといっぱーい。

2006年06月22日

部分が全体 全体が部分

ほんのりアートな作品を公開しました。
DRAW COMPLEXITY

テーマは複雑系?
右上のパレットに描いた図形がそのままパーツとなって、さらにそれに各グリッドの色が乗算された形で左側のスクリーンに描画されます。
これが「部分が全体」に相当。

さらにスクリーンをクリックすると、そのクリックしたグリッドの部分がパレットに転写されます。
そして同時に転写されたパレットがパーツとなって、左側のスクリーンに反映されます。
これが「全体が部分」に相当。
転写の処理上の問題なのか、ちょっと色がおかしくなることがありますが原因不明。

まあ、理屈なんてどうでもいいのでてきとーに楽しくお絵描きしませう。
とはいえ構造上、ものすごく汚い絵になりやすいのだけどもw
描いた絵をアップできても楽しそうですね。
そのうち用意します。

2006年06月21日

オンラインモードについて大切なお願い

THE DAY OF SAGITTARIUS 0.3ですが海外をはじめ色んなところからリンクされ始めているのか、TOPページのアクセスカウンタがありえない回転数になってます。
3日前まで1日20人いるかいないかだったのに、一昨日で500人、昨日は3300人とかwww
VIPの開発スレからも流れ込んでるようですが、ゲームのページやこのブログからはTOPページへリンクはってないのになぜカウンタがまわるのか・・・

せっかく来てくれた人に申し訳ないんですが、オンラインモードはFCSのホスティング仕様上同時5人までしかプレイできません。。。ごめんなさい。。。中身のないオフラインモードで我慢してください。
5人を超えるとロビーにすら入れないので、こちらで誘導することも難しいのです。

せめて10人接続できればなあ。。。誰かFCS鯖立ててくれないかなあw


閑話休題。
海外からのお客さんが居座って開発スレ住人が遊べなくなっている状態を懸念して、アクセス制限をかけました。
また、オンラインモードはプレイ時間を5分に制限、5分経つと自動切断するようにしています。
他にも上手い対策ができないか考えていますが、ユーザ登録制にはしたくないなというところです。
なので、できれば多くのユーザに遊んでもらえるように一度オンラインモードで遊んだ人はすぐに入り直さずに少し時間を置いてくれると助かります。
というか、開発者自身がロビーに入れないってどうよwww

2006年06月20日

リアルタイムストラテジーにおける同期の話

しばらくTHE DAY OF SAGITTARIUS 0.3の開発ブログと化します。
そこで今日は同期について。

移動については各プレイヤーの座標に変化が生じる度にサーバに座標データを投げて、同じ対戦部屋にいるプレイヤー(今は1部屋ですが)にブロードキャストしています。
このため、20fpsでしか動かないプレイヤーの画面では40fpsで動いてるプレイヤーの行動が倍速に見えるわけです。
内部で設定されているプレイヤーの最高速度は一定のため、フレーム落ちしているかのように見えます。
動き続けていると常にサーバにデータを投げる状態になり、帯域にもやさしくないため改善の余地はありありですがもうしばらくこのままでいきます。

攻撃については各プレイヤーが操作を行った瞬間にサーバにデータを投げています。
この時点で攻撃が命中するかどうかは全く判らないので、各プレイヤーの画面で当たり判定処理を行いますが、上に挙げた移動速度のズレによって同じ攻撃でも当たっている画面と当たっていない画面が出てきます。
このままダメージ処理も行ってしまうと同期が取れないので、ダメージ処理に関しては攻撃を食らったプレイヤーが責任を持って行います。
つまり、画面上で自身が攻撃を食らうとダメージ処理を行った上で残艦数をサーバに投げるわけです。
こうすることで少なくとも残艦数のズレはなくなりますが、攻撃が当たっているはずなのに残艦数が減っていないor攻撃が当たっていないのに残艦数が減っている、といった表示上のズレはどうしても残ってしまいます。

完全に同期を取るには全ての操作についてサーバが発行するタイムスタンプを上乗せして、各プレイヤーの画面で辻褄合わせをするなどの処理が必要になりますが、処理が重くなったり通信量が増大したりとトレードオフが生じます。
どこかに妥協点を見出さなくてはならないため、できるだけ演出でごまかすといった工夫が必要になってきますが、リアルタイムストラテジーではなかなか難しいですね。
たとえば攻撃時に必ずチャージを発生させて、そのチャージ時間を調整することで同期ズレを少なくするとかそういった感じです。

色々書きましたが、要はプレイして面白ければいいと思っています。
面白ければ些細なズレは気にならないし、ズレを解消した結果面白くなくなると本末転倒ですからね。

2006年06月18日

同期とるのって難しい

開発中のTHE DAY OF SAGITTARIUS 0.3ですが、ようやくオンライン対応しました。
といっても5人制限&64kbps制限というホスティング仕様上、いきなり止まるかも知れません。
また、開発の都合上いきなりオンライン機能をOFFにする可能性も。

座標は毎フレーム同期をとっていますが攻撃については発射時のみデータを送っているので、マシンスペックの高い人が前進しながらミサイルを撃つとマシンスペックの低い人の画面では艦隊がミサイルを追い越す可能性がありますw

そもそも、艦隊の移動を座標で同期とってるからそうなるのであって、速度とその変化した瞬間の座標で管理すれば大丈夫なんですが、それだときっと艦隊がワープしまくるw
オンラインゲームってここが難しい。

2006年06月17日

THE DAY OF SAGITTARIUS 3 を作ってみようとした

今をときめくアニメ(小説)、涼宮ハルヒの憂鬱の「射手座の日」という話に出てくるオンラインゲームをFLASHで造ってみようとしました。
が、さすがに重すぎて早くも挫折気味です。
やっぱりFLASHではこれが限界かー

THE DAY OF SAGITTARIUS 0.3

小説で読んだ時からこれFLASHで作れそうだなあと思っていたのですが、ゲーム画面の詳細がさっぱりだったのでベース部分しか作っていませんでした。
アニメが始まった時にも期待していなかったのですが、第11話にして放映が!
ばっちりゲーム画面が出てるーってことで、可能な限り近づけてみました。

が、肝心の操作方法が分からないw
なのですごく・・・適当です・・・

索敵艇無限に発射できるしw
敵味方関係なく攻撃できるしw
全滅させても何もないしw
そもそも対戦できないしw

ところでこの鯖、FMS2が使えるので5人までならオンライン対応にすることが可能です。
でも5人だとプレイヤーだけで埋まってしまうw
敵のAI作らなきゃダメじゃないかー
実はそこが一番難しいw

少しずつバージョンアップさせていくことになりそうです。
オンライン対戦は無理でも、協力プレイくらいはできるようにしたいところ。


--- エントリ投下10分後に見つけた ---
ちょ、VIPで実際に作ろうって企画がw
まとめサイトまであるしw
FLASHだと明らかにクオリティヒクス

さりげない機能強化

スクリプターな人たちの間では FlashPlayer8 の新機能としてビットマップばかりに目が行きがちですが、実はこっそりと機能強化されているメソッドがあります。

Array.sortOn

これは配列の要素同士を比較してソートするのではなく、配列の要素が持つ特定のプロパティ同士を比較してソートするのですが、これを使う時って他のプロパティ同士も比較してほしいことが多々あります。
たとえば、値段でソートをしたけれど同じ値段の場合はさらにサイズでソートされていてほしいとか。
FlashPlayer7 ではプロパティを配列で渡せば多段階ソートできたのですが、一方を昇順で他方を降順なんて都合のいいソートはできませんでした。

プロパティ price と size を持つオブジェクトを要素に持つ配列 arr に対して値段(price)の昇順でソートし、さらに同じ値段の場合にはサイズ(size)の降順でソートしたい場合は

arr.sortOn( ["price", "size"], [ Array.NUMERIC, Array.NUMERIC | Array.DESCENDING ] );

となります。
つまり、ソート条件も配列で渡せるようになっていると。

ヘルプにもしっかり書いてあるわけで今さら感はありますが、言及している人がいなかったので実はあまり知られていないんじゃないかと思いエントリにしてみましたー
探せば他にもこういうのあるかもしれない?

2006年06月15日

cacheAsBitmapの呪い?

mc.cacheAsBitmap = false;
mc.clear();
mc.lineTo() などで色々カキカキ
mc.cacheAsBitmap = true;

これらを1フレーム内で実行すると、描画が一切反映されないことがある。
等間隔で直線を引こうとして、間隔によって描画されたりされなかったりした。

mc.cacheAsBitmap = false; の前に mc.clear(); を呼んでおくと何故か大丈夫。
cacheAsBitmap の切り替えにフレームまたげば大丈夫。
mc.cacheAsBitmap = false; を実行しなければ大丈夫。

ということで。cacheAsBitmap の処理が呪いをかけているんだと思われ。
環境依存なのかそうでないのかはまだ分からな-い。

2006年06月08日

サウンドのループ回数

swf のファイルフォーマットを調べている時に、サウンドループ設定の「ループ」がどういう制御になっているのかが気になって、書き出した swf をバイナリエディタでチェックしてみた。

ループ回数に相当するビット列は ff 7f で、これはリトルエンディアンなので 0x7fff つまり 32767 回ということになる。
あれ、無限ループじゃなかったのねw
1秒の効果音でも9時間くらいかかるから問題ないのだけれど、どうせなら上限の 65535 回に設定すればいいのに。

オーサリングソフト上でサウンドループ設定を「繰り返し」にしてループ回数を 32767 に設定したら、自動的に「ループ」に変わったw
なにこの中途半端な親切設計。

2006年06月02日

外部ドメインの画像

調べりゃすぐに分かることなんだけど、FlashPlayer9 からは
外部ドメインの画像ファイルでも BitmapData.draw することが可能に。

ただし、crossdomain.xml でアクセス許可出してやらなきゃならない。
アクセスが許可されていなかったり、crossdomain.xml 自体が置かれてない
ドメイン上の画像については読み込むことすらできないという魔の仕様。

これにより、Amazon の画像ファイルを読みにいく Flash は全滅。
なぜなら images の方には crossdomain.xml が置かれてないから。
こりゃ参った。


こんなに仕様が変わってるとは露知らず、わざわざ URLLoader からバイナリ形式で
画像を読み込んで ByteArray に渡して画像を FlashPlayer で再生成してから
ビットマップ化してやろうと企んでいたのに、いざファイルをアップしてみたら
読み込み時にセキュリティ警告が。
そんなこんなで調べている内に、上記のことが判明したという。
いろんな意味で涙が出そうになった。

2006年06月01日

始動

ついに始動。
flashの習作や実験作を紹介していくつもり。

トップページもflashにしてみたけど、作品が出揃うまではちょっと寂しいね。
数が増えてきたらスクリーンを動かしてみよう、重いけど。

サイト名は void element で、ハンドルの void からとってみました。
で、その blog が void element blog なんていうひねりも何もない名前なので
他にいい名前がないか考えています。
void blog だとなんか中身がなさそうだw