LWF
サンフランシスコからこんにちは。エンジニアの坂本 一樹(@splhack)です。
このエントリは GREE Advent Calendar 2013 9日目の記事です。という書き出しで始まると思った人が大半だと思うのですが、残念ながらこの記事はAdvent Calendarの記事ではありません。こんなにAdvent Calendarの記事が並ぶなか、Advent Calendarの記事ではない記事が一緒に並ぶというのは、なかなか斬新な企画ではないでしょうか。これがシリコンバレー流です。言ってみたかっただけで、本当ではありませんが。
そもそもこれを書いている場所がシリコンバレーかというと、あれっ、サンフランシスコってシリコンバレーなんでしたっけ、という疑問が浮かんでしまうわけです。シリコンバレーって、アメリカ合衆国カリフォルニア州北部のサンフランシスコ・ベイエリアの南部に位置しているサンタクララバレーおよびその周辺地域の名称なので、やはりサンフランシスコはシリコンバレーではないのではないか、という結論に達したほうがいいのではないかと思いながら、どこで働いているの、シリコンバレーですよシリコンバレー、って言いたいわけじゃないですか。ソフトウェアエンジニアなんですから。
ちなみにそのサンフランシスコ、今年は超寒いです。一番寒い時は摂氏0度きってます。華氏だと、あ、アメリカだと気温は華氏を使うんですが、摂氏0度は華氏32度です。水の沸点は212度ですよ。212度。天気予報で、今日の最高気温50度です、とか言っているのを聞くと、きりが良い数字だなとか思うわけですが、実際きりがいい数字というのは原点考えると72度とかだよな、など思い直すことになるわけです。ええ。まぁ行数稼ぐのはこれくらいにして、本題に入らせていただきます。
「LWF for C++」と「Cocos2d-xレンダラ」をオープンソースとして公開いたします! しかも、安心のzlibライセンス。
LWFとは、Adobe Flashを利用したマルチプラットフォーム対応のアニメーションエンジンです。詳しくは http://gree.github.io/lwf/ や http://cr.gree.jp/blog/2013/11/683/ などをご覧くださいませ。
1年ほど前に、Unity向けにC#版を、HTML5向けにJavaScript版を公開したのですが、今回はC++言語で実装したものになります。
本当はC++11 ISO/IEC 14882:2011に沿ったいまふうのコードとしてリリースしたかったのですが、思いの外C++11が使えない環境が多いことに気づいたため、ISO/IEC 14882:2003 (C++03)に沿ったコードに直した経緯があったりします(「人類にはC++11は早過ぎたんだ!」とか言いながら)。といっても、C++03どっぷりではなく、C++03環境でのコンパイルではBoostを使用し、C++11環境でのコンパイルではC++11なりにBoost不要となっております。スマートポインタによりアプリケーション側でのメモリ管理はそれほど考慮しなくても大丈夫ですし、イベントリスナにはlambdaが使えますから、いまふうな書き方ができます。アプリケーションからのAPI使用感は、C#版、JavaScript版と同様になるようなスタイルで統一しています。ここ若干C++ぽくないんじゃない? というような部分は、だいたいそれが理由です。
LWF for HTML5では、Webkit CSS、Canvas、WebGL、Cocos2d-html5といった様々な描画環境に対応していることからわかるように、LWF for C++も描画環境、ゲームエンジンといったものからは分離した作りになっています。ただ分離したままだと、実際使うときにレンダラを0から書かなければいけないため、今回は標準描画環境としてCocos2d-xを選択しました。ただし、Bleeding Edgeな感じに、Cocos2d-x 3.0alpha1以上に対応したコードです。2.xで使用する場合は、改造が必要です。
使用方法は簡単です。FlashデータをCocos2d-xのノードとして扱える感覚です。メモリ管理もCocos2d-xに沿っています。
1 2 3 |
LWFNode *lwfNode = LWFNode::create("sample.lwf"); addChild(lwfNode); |
C#版、JavaScript版同様に、gotoAndPlayなどのアニメーション制御APIが使用できます。なお、LWF for HTML5では、アニメーション制御のためのコードを、Flash埋め込みのJavaScriptとして記述できるようになっています。FlashのActionScript、CreatJSのJavaScriptと同じです。LWF for C++でも同様に、C++からの直接制御ではなく、スクリプト言語から制御できるようにしました。スクリプト言語は、組み込みやすさ、パフォーマンス、メモリ使用量などのバランスを考慮した結果、Luaを選択しました。こんな感じです。
1 2 |
self:gotoAndPlay("attack") |
LuaよりJavaScriptが使いたい! と言われるんですが、いまどきのデバイス速いんで、それLWF for HTML5でいいんじゃないですか、というような感じです。ただJavaScript to LWF Lua Bindingとか実装してみたいところではあります。
そういえば、LWFは、ドキュメントがないものの代名詞になっちゃってますが、それも緩和されつつあります!
LWF for HTML5版中心のドキュメントですが、LWF for C++、LWF for Unityにもそのまま適用できる内容が多いです。APIもほぼ同一です。是非ご覧くださいませ。
なおLWF for C++はCocos2d-x専用ではありません。たとえば、iOSのUIKit上でFlashでオーサリングしたアニメーションをいい感じに動かしたりできるのです。是非レンダラを書いてオープンソースとして公開してくださいませ!
Happy Holidays and Hacking!