AS3仕様へのリファイン

ヒマ時間での合間作業。
FlashCS3 + ActionScript3.0環境へのバージョンチェンジにあたり、いくつかの機能見直しを行う。


  • SWFObjectを導入

http://blog.deconcept.com/swfobject/

HTMLへの埋め込みに、SWFObjectを採用する。これにより、埋め込みスクリプトの記述を簡略化、効率的なFlashVarsの送信を期待できる。


  • クラスの役割分担の見直し

細かい部分でごちゃごちゃになっているので、表示系と処理系をなるべく差別化できるように。


  • AS3移行に伴い、以前のバージョンとの互換性

FlashCS3から大きく仕様変更されたので、過去のバージョンで作られたswfは直接の互換性が無い。(AVM1Movieという型で認識される)
対応策として、LocalConnectionを使う。
ゲーム製作者は、Flash8以前の環境で外部ファイルをオーサリングする場合は下記のようなスクリプトを頭に記述する。

var conect:LocalConnection = new LocalConnection();
//conect.allowDomain('*');
conect.connect('_PrototypeConnectName');
/**
 *  ユニークなコネクション名を決める手続き。
 *
 *  @param   realName   :swfAdvから来るユニークネーム
 */
conect.onConnectionName = function(realName:String)
{
  conect.close();
  conect.connect(realName);
}

/*
 *  製作者の追加メソッド
 */
conect.hogehoge= function()
{
  //てきとうに書く
}


21:10 追記

LocalConnectionで送信した後、相手側が受信したかどうかを監視するイベントが見つからなかったので、とりあえず接続名は読み込み側で決めることにした。

キャラクターファイルの例

var swfadvconnect:LocalConnection = new LocalConnection();
var date:Date = new Date();
var date_str:String = (String(date.getFullYear())
     + String(date.getMonth())
     + String(date.getDate())
     + String(date.getHours())
     + String(date.getSeconds()));
var realName:String = "_maidConnectionName" +date_str; // 接続名


swfadvconnect.connect(realName);
try{ swfadvconnect.send("_PrototypeConnectName", "onConnectionName", realName); }
catch (e:Error){ }



var _this = this;
swfadvconnect.expression = function(name:String)
{
  _this.gotoAndStop(name);
}
swfadvconnect.lip = function(flag:Boolean)
{
  if(flag){ _this.expression.mouth.play(); }
  else{ _this.expression.mouth.gotoAndStop(1); }
};

・参考
http://d.hatena.ne.jp/holidays-l/20071126/p1

何故ユニーク名を再設定する必要があるかというと、LocalConnectionは他の貼り付けFlashや他のウインドウのFlashに対しても送信してしまうため。多窓でswfAdvを展開していた場合誤動作を起こす可能性がかなり高い。
よって文字列+日付時間などでダブりそうもない接続名を動的に生成するのがベターなのだ、ということみたい。

かなり難解なスクリプトを書かせてしまうので、ここもクラスにした方がいいかもしれない。
本当はキャラクターファイル作成にもテンプレートクラスを用意して使うのがまっとうな手段なのだが、デザイナーさんに「クラス割り当て」と言われても?な場合が殆どなので、自由度が無いけどわかりやすい手段にしたかったのだが・・・。
FlashCS3ならこれまでと同じ感覚で作れるが、実際問題、絵描く程度なら8のままでも不自由が無い。その8で面倒起こしてしまうのなら、いっそのことロジックしやすい方向にしてしまうべきだろうか。

衝撃吸収新素材

今朝のテレビで見たニュース。

普段はガムのような柔軟性を持っているが、ある一定を超えた速度で衝突すると硬化する素材があるみたい。
ゆっくり変形させる時は分子結合を緩く、勢いのある衝撃時には分子を結束させて状態を変化させるみたい。飽和状態の片栗粉のような印象。
デモンストレーションで、新素材の片を陶器皿に乗せその上からハンマーで叩いたり、新素材を使用して作られた衣服を身に着けたレポーターの肘や足をシャベルでバシバシ叩いている映像が流れた。叩かれたレポーターはほぼ痛みを感じていない様子。勢いの割には体があまり揺れず衝撃も分散されているように見える。


現在実用されている例として

  • こけても怪我しにくい「スキーウェア」。
  • ドリブル時の柔軟性を保ちつつ、より勢いのあるシュートを打てる「サッカーボール」。


素材の名前を失念。ぐぐってもニュース記事を発見できなかったのでメモする。

DTMマガジン - 初音ミク特集

http://www.dtmm.co.jp/miku_xmas/miku_xmas_demo.html
http://www.nicovideo.jp/watch/sm1686851
(ニコ動のタグ貼れんのかしら)

鏡音リンの声初公開!
ボーカル打ち込みはクリプトン社の技術者さんが製作されたこともあり、素晴らしいクオリティ。全く違和感がありません。
がんばればこうも作れる。こんなにも創れる。

私としてはホッとするような気持ちになってもらえたら、これ幸いです(礼)


12/7追記
予定通り5日に、担当の方の手で粛々と削除されました。
最後に見た段階で一万八千ビューで二万届かず。
公式がいつまでもユーザーコミュニティの中に居座るのも格好のいい話ではないので、良い引き際だったと思います。


他人のふんどしではありますが、少なからず自分が関わった成果物に対する遠慮ない評価を直接見る機会はそうそう無くよい刺激になりました。
ほんとありがたいことです。

アサシンクリードの映画的演出

アサシンクリードとは先週末に発売したゲーム。
プレイヤーはエルサレムやダマスカスといった歴史の舞台を暗躍する暗殺者となる。アサシンギルドより下される依頼を完遂すればゲームクリアだ。

本作は、所謂ステルスアクションゲームの新作である。
すんげー奇麗な画質とファンタジーチックな舞台設定でメタルギアができる的ものと想像していただければ良いだろう。
非常に詳細なアクションパターンを限られたボタンで駆使できるようになっており、馴れるとすんげーカッコイイ動きができる。
町に住む人々もきちんと個性を持って行動している。
走ってぶつかると罵声を飛ばし、ムカッとして殴るとヘタレなら一目散に逃げていく。
戯れに家屋の屋根をヤマカシのように飛び移ってると「何やってんだアイツ」「どうかしてるぜ」と住人が野次を飛ばす。注目を浴びると警備の騎士が何事かと警戒ゲージを上昇させる。実にこの現場に存在していると感じさせられて気持ちが良い。
ゲームとしてはとても良くできてるし純粋に面白いなあと思える作品だ。


サテ、遊びは面白いのだが本作はゲームらしからぬ妙な演出があり、そいつがどーも鼻につくのだ。
エストなりミッションなり何か出された課題をクリアした時に、ゲームではリザルト画面に移行するのが普通である。クリアタイムが何分で、何人殺しただとかそーいうやつだ。そして「次のミッション」なりを選択すると速やかに次のステージが開始する。
その間の主人公の日常生活や便所でクソ垂れたなんかのイベントは省略される。
アサシクリードの場合、時間軸の移動の際は「時間をスキップします」的な演出が施される。
本作の設定上、プレイしている舞台は(本当の)主人公がマシンを通して見ている仮想世界、という設定がある。つまり仮想世界の中の人が見ている仮想世界を遊んでいるということらしい。
場面の転機が訪れると、攻殻機動隊というかマトリックスというかいかにもな画面演出とともに背景がぐにゃりと歪み、時間遷移する旨のメッセージダイアログが表示される。画面中央イにはタイムマシンに乗るノビタよろしく主人公キャラが立っている。そいつを操作することもできる。
この手の手法は、主人公の記憶がフラッシュバックしてその時間の描写が始まるなど、映像作品ではありふれた演出なんだと思う。ここで場面が転換しますよと宣言をしているのだ。
ただゲームにおいてはどうなのだろうか。
正直、自分はこの画面がでる度に「現実」に戻されて少々イラッとしてしまった。せっかくゲーム世界の中に入り込んで「ウッヒョー、俺スゲェ飛んでる」といい気になっているのに無理矢理ストーリーの本筋に戻されてしまうのだ。少し前まで主人公のアサシンの気分だったのが、いやおうがなしに視聴者の立場を自覚させられてしまう。
ゲームプレイヤーとしては少々寂しいことだ。
さんざん苦労してクリアしたのに、やって当たり前のように「時間をスキップします」とアナウンスされ、次の瞬間にはこれまでと全く違う風景が広がっている。映画なら頭の切り替えもすんなりできるのだが、何分感情移入が深いため前触れの無い場面転機は面食らってしまうのだ。
これなら、おめーのプレイはランクFマイナスだぜと採点されるほうがマシな気がした。
映画としてはエンドロールまで到達することが一つの区切りのだろう。ゲームはステージ1が終わり、ステージ2に進むというのがある意味すり込まれた自分の区切りどころになってしまっているのだ。
そういう意味で「STAGE2 ダマスカス」と出てくれた方がおいらはホッとできたかもしれない。


世界観としては非常に明確になっている。主人公は機械につながれてこんな映像を見ているんだろうなーとは思う。ただ、おいらはこの「アサシンとシンクロしている主人公」とはシンクロできないんだよね。

200「ツーハンドレッド」

http://wwws.warnerbros.co.jp/300/

西洋圏では大ヒットした映画「300」
圧倒的な武力を誇るペルシア軍10万に対し、たった300で当たるスパルタの戦士たちの話だ。
絶望、未練、すぐ傍にまで迫る死。
どんなに理不尽な運命でもなお、闘わねばならなかった兵士達の歴史は、伝えるにはあまりにも過酷過ぎて聞くに堪えない酷い話なのだが、そんな歴史は結構少なくないのだ。
そして、その人間ドラマは人の生き方の本質に語りかける何かがある。
男として生まれた以上成せばならない、護らねばならない。
以下の話は映画とは関係ないが、似たような絶望的な状況を生き抜いた人たちの話なんだ。
何でこんなことを書いてるのかねおいらは。恐らく本日行ったsumile TOKYOの酒があまりにも美味しかったのが原因なのだ。


884年ヨーロッパ。
ヴァイキング遠征の真っ盛りの時期で、同時にキリスト教暗黒時代に指しかかろうとしているこの頃、あまり知られてないけど歴史的に大きな変革を齎す事件が起こる。
当時ノルウェーには強大な力を持つ勢力が台頭しており、その指導者ハーラル烈王は反目する勢力の存在を全く許さない程の徹底した政治を行った。
様々な勢力が入り混じっていたヴァイキングは一つに平定され、排他された者は漫画「ヴィンランド・サガ」のようにアイスランドに落ち延び、或いは他国へ追いやられる運命にあった。
“徒歩”のロルフと呼ばれる若きヴァイキングの貴族もその一人だった。
ロルフは故郷を逃れ、デーン人(デンマークヴァイキング)を味方につけ、セーヌ川を登り今のドイツまで勢力を伸ばす。
時にはジークフリードとも伝えられることもある最後のヴァイキング、後の初代ノルマンディー公と呼ばれる男だ。

一方、セーヌ川の辺にあるフランス、パリにはロベール家の長男ウードという若者が居た。
かつては地方の弱小貴族だった家計だが、父ロベール・ル・フォールの偉業によりパリ周辺の領地や修道院の管理を任されていた。
父の激しい気性を受け継ぎ、後にパリ伯の称号を得る男だ。

この二人の傑物が884年の冬(うろ覚え)、パリを舞台に激突した。
当時のパリの領主はカロリング家のカール三世。名高いカール大帝の子孫に当たる。
カール大帝の子孫らは、領地分乗の規則によりそれぞれ3つの領地を分配されていた。東フランク、中フランク、西フランクだ。
それぞれの子孫は自分が真の統治者だと欲の皮を突っ張らせ、領地の治安など省みもせず年から年中領地の奪い合いをしていた。
結果論から言えば、そのおかげでヴァイキングの略奪を許してしまっていたとも言えよう。
その時パリも、カール肥満王の遠征により軍の殆どは侵略戦争に使われていた。残ったのはたった200の騎士達。
そこにロルフ率いる三万(恐らく誇張で、三千だろうと言われている)のヴァイキングが襲撃。セーヌ川を船と鉄の武具で真っ黒に染め上げた。
ロルフはパリに上陸し、セーヌ川通行の許可を申し出る。
一方、カール肥満王に代わってパリを納めていたサンジェルマン・デ・プレ司教ゴスランはヴァイキングの略奪を恐れそれを却下する。
パリは戦場となった。

幸いパリには、シテ島をぐるっと囲む頑強な城壁があった。
いくらヴァイキングと言えど、これを落とすには一年の時間がかかると思えた。
結果、パリ周辺は地獄と化す。
ロルフ率いる軍は、帰るところを持たない、それこそ決死の軍なのだ。北欧の民が夏のひと時に行う冒険とはわけが違うのだ。
周辺の村、教会はことごとく彼らの餌食となったに違いない。
事実、パリに至る前に有るルーアン修道院は彼らの手に壊滅的被害を受けていた。
彼らは全知全能の神を恐れない。
北欧の神に習い、略奪を正当なものと認識し何の躊躇いも無く人を襲うことができるのだ。
しかしながら若い指導者ロルフは、これに躊躇いを感じていたのではないかと私は考えている。
後にノルマンディー公国を建国した彼は、モラル意識の向上に力を注いでいた。どのくらいというと、井戸に金の鎖をぶらさげ、一日経っても誰も盗んで自分の物にしようとしない程に徹底されたものだった。
当時からすると、非常に高いモラルの水準だったと言えよう。
ロルフはならず者のカリスマ的存在でありながら、非常に先見を持った人物だったのだ。

話を戻そう。
パリ城壁内も、略奪とは違う理由で地獄を味わっていた。
戦いで傷つき果てた兵、衰弱した民。死者は増える一方だった。
しかしキリスト教は遺体を焼くことを良しとしなかった。
司教ゴスランも矢張りそれを許さず、結果疫病がパリを蔓延することとなる。
悪魔の病、黒死病だ。
死の病、ヴァイキングの二重の絶望的な状況にパリは追い込まれる。
ゴスランは、その重圧からなのか死の病からなのかわからないが、戦時の途中で死去することになる。
ぼろぼろになったパリの後衛を任されたのはウードだった。

後のパリ伯になってからの記事や父ロベール一世の人柄から推測するに、ウードの指揮はゴスランに比べて的確だったものと考えられる。ロベール家の功績は、各地で暴れる海賊や叛徒の鎮圧が主なものだった。ヴァイキングの特色を理解し、事に当たったに違いない。
所詮蛮族、キリストの神の威光に適うはずなど無いとたかを括っていたゴスランとは違うのだ。

しかし翌年、ウードは無謀とも言える策を実行する。
三万の包囲を突っ切り、単騎で本隊のあるカール肥満王の下へ救援を要請する計画だ。あまりにも自殺行為甚だしく、胡散臭い話だ。真実は微妙に違うのかもしれない。
しかし計画は成功した。
事を理解した肥満王はパリに帰還。ロルフ軍の鎮圧に当たる。
ヴァイキングは恐怖の対象であったが、実は武力としてはそれほどの力を持っていない。軍としてのまとまりに欠けるロルフの軍は、正規の騎士に対してはその伝説的攻撃力を発揮することはできなかった。
彼らの武器は類稀な乗船術による電撃作戦にあったのだ。

だがヴァイキングにはもう一つの、我々日本人、武士が共感できる究極の武器があった。
死を恐れないことだ。
ヴァイキングが崇拝する北欧神は戦争を愛し、武功を評価する。立派に戦った戦士は死後ヴァルハラへ招待され、神の世界へ参加する権利を得るのだ。ヴァルハラに募った戦士(ベルセルク)は、世界の終わりの戦争ラグナロクに向け永遠に闘い続ける。それこそがヴァイキングの男の生き様だと信じていた。
死を恐れない決死の軍は、時に信じがたい結果を残すこともある。
パリの勝利は明白であったが、それを引き換えに大きな犠牲を支払うこともまた確実であった。

結局、カール肥満王とロルフの間である契約が交わされた。
パリの安全を保障する代償に、銀を支払うというものだ。
パリは戦争に負けたのだ。
結果を見ると、初めからヴァイキングの通行を許してしまえば、犠牲を払うことはなかったのかもしれない。
二百人の優秀な騎士が犠牲になることはなかったかもしれない。
パリ側もヴァイキング側も無駄な犠牲を払っただけなのだ。

しかし、パリの民には若き指導者の勇敢な行いは寄って足りるものであった。
カール肥満王は、その管理能力を問われ失脚する。
代わりにウードがパリ伯に即位した。彼が統治する間は対ヴァイキング政策を徹底したと言われる。乱世の世では良き指導者だったのだ。私はそう解釈する。
しかしウードは898年に死去。次の統治はカルロング家に返還されてしまう。
語り継がれない歴史。あまりに切ない歴史。

パリ越えを果たしたロルフはキリスト教に改宗し、ノルマンディー公国を設立する。所謂ノルマンディーコンクエストだ。
同時期にロベールと名を変える(解かりにくい!)。私は、このパリの死闘を繰り広げた相手への敬意を表してこの名を選んだのだと思いたい。
その後、先述した通りのモラルの向上、高潔さを根ざした思想は彼の精神は息子に受け継がれる。ギョーム長剣王など武功にも精神的にも優れた傑物が生まれた。
フランク側ではウードの弟の子孫によるカペー朝が台頭するのはまた後のお話。


以上、激変の切っ掛けを創りながらもあまり語られない男たちの話でした。
20を超えてから、私はこういった男の生き様に惹かれるようになった。ケネディ暗殺に密接的に関わった大悪党サム・ジアンカーナしかり、今日の乱世を生み出した最高の技術者カラシニコフしかり。
人はこんなにも生きれる。ここまで生きれる。

尚、上記は私の未熟な知識と勝手な妄想がふんだんに組み込まれており、正史ではないことをご理解いただきたい。

ちょっと困った

サンプル用のシナリオをチビチビ書いているのだが、なかなか収束が付きそうにない。
仕様として、ある一つのテーマを決めて、そこから派生したほんとうに短いヒマなときにちょっと見れるblog的な短編をイメエジして考えていたのだが、うん、けっこーダラダラ延びちゃって微妙に面倒な具合になってしまった。
しかも次の続編のアイディアやらの方が浮かんでしまい、なんだかそっちを考えるのが面白いなあとうつらうつらしているうちに時が過ぎている。
日常会話だってゆっくりよく考えないと言葉を発せないおいらなので、文章ともなるとエライ迷ってしまうので余計に時間がかかる。
ライターの人は本当にスゴイ。優遇されない世界だけど。




これだけでは何なんで、シナリオ書きの心得として昔ほんの一瞬ライター業をやっていた時に知ったことをメモしておこう。人を楽しませる書き方や、日本語の正しい使い方、等については文系に特化している人がどこかにいるだろーから、彼らにまかせて、ここは理屈のお話。
文を読む上で、ある物事に対する表現の方法があれこれ毎度バラバラだと非常に読み難いと感じると思う。ある文学の世界では、ケニングという言葉遊びを用いて、名詞や人名をわざと違う名称にして書く習慣があったが、そういうものとはちょいと異なる。
例えば、会話を「」(カッコ)でくくるとか強調したい語句をどの記号を使う、といったPC上ならではの“どのバイト文字”を使用するかに関する問題だ。
掲示板を見れば、半角/全角を意識せずに書き込まれたレスをみて、んまあ読めなくはないけどちょっと変だよねと思うことは多々あると思う。こういった余計な違和感を読み手に与えないという配慮も必要ではないかなー、という話なのだ。
自分が習ったルール(エン○ーブレインルール?)では
・意図ある場合を除いて、語尾をです、ます、だ のどれかに決めて統一する。
・名称を示す場合は『』(二重カッコ)でくくる
・数字は一桁の場合は全角、複数桁は半角
・英字は半角
・句点は[、]か[,(カンマ)]のどちらにするか

・何文字で折り返され、全部で何文字入るか意識する(京極ルール)

以上のような決まりごとを自分の中で制定しておくのである。
当然、実際に表示した際に、どれが最も綺麗に見えるかなども考慮する。
物書きの人には常識だろうけど、これから何かを書こうという人の参考になれればありがたい。

サンプル制作 その2

続いてFlashでのキャラクターオーサリングに入る。

前回最後は一枚絵で保存していたが、本稿では「表情付け」を見越し、パーツごとに分割して画像ファイルを用意することにする。
最近のスタンドアローンで動くアドベンチャーゲームは表情を一枚絵でたくさん分用意しているのがほとんどだ。そのおかげで、一見なんて事ないアドベンチャーなのに矢鱈と容量を食う作品が多い。スタンドアローンなら問題が無いが、swfAdvはネットごしに動作するので容量はできるだけ抑えなければならない。なので、似たデザイン同士ならパーツを使いまわしてなるべく無駄を省くようなキャラクターファイル制作が必要。


1.パーツ分割

このように、目、口、眉、体の4パーツに分解した。レタリングの段階でレイヤー分けしていればこういった作業も簡単になる。


2.Flash上で結合

Flash上でレイヤー分けして再結合する。各パーツのビットマップは、当然グラフィックインスタンス化し無駄を抑えるようにする。
インスタンス化したときに、稀にビットマップが歪む現象が起こるケースがある。その場合、中心点を右下に(つまりビットマップの座標を{x:width * -1, y:height * -1})すると改善できるみたい。バグかな。


3.目のアニメーション
キャラクターにまばたきアニメをさせたいので、目のイメージだけをムービークリップにした。
コマ数は「開,閉,半目」の3パターン。多ければそれだけ綺麗になるが、この程度でもそこそこ良い品質になる。


タイムラインに配置。各コマのフレーム数はフレームレートから計算する。今回は60fpsでパブリッシュするので、20フレームでアニメーションを作ると0.2秒でまばたきすることになる。
さらに、まばたきする周期をランダムにさせたいので頭のキーフレームに適当なタイマーを入れる。

1フレーム目

  var time = Math.floor(Math.random() * (10-1+1))+1;
  time *= 1000;
  var overTime = getTimer() + time;

5フレーム目

  if(getTimer() >= overTime)
  {
    //経過
  }else{
    gotoAndPlay(this._currentframe - 1);
  }

上記は1〜10秒の間でランダムに待ち時間を設け、経過したら続きを再生するというスクリプト。これをまばたきアニメーションより前のフレームに書いておけば、数秒待った後一回まばたき→最初に戻ってまた数秒待ってまばたき・・・というループが行われる。
わざわざこれをタイムラインだけのアニメーションで実現すると面倒だが、ASを書くことで大幅に楽になる。


4.口パクのアニメーション
口も目と同様にアニメーションさせる。
口パクのon/offはswfAdv側で制御するので、こちらは単にループアニメにしておいた。


5.表情に実装
最後に、できたキャラクターをムービークリップインスタンスにまとめる。
同様の方法で3種の表情を作り、root階層のタイムラインに配置する。

各表情が配置されているフレームのフレームラベルに表情の名前を書く。swfAdvからはこの名前で表情へアクセスすることになる。


・完成したキャラクター(通常表情)直接貼れないのが面倒:-(
http://www22.atwiki.jp/swfadv/pub/source/sample/sample.swf

・flaサンプル
http://www22.atwiki.jp/swfadv/pub/source/sample/maid.lzh