<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GEOQUAKE Backstage &#187; Flash</title>
	<atom:link href="http://geoquake.jp/blog/tag/flash/feed/" rel="self" type="application/rss+xml" />
	<link>http://geoquake.jp/blog</link>
	<description>ゲームとか鋭意制作中のブログ</description>
	<lastBuildDate>Wed, 09 Nov 2011 21:37:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>AIR＋FlashDevelopでブラウザ・PC・Android・iPhone一挙開発</title>
		<link>http://geoquake.jp/blog/2011/06/27/airtemplate/</link>
		<comments>http://geoquake.jp/blog/2011/06/27/airtemplate/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 12:39:23 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1297</guid>
		<description><![CDATA[そもそもAIRって何なんでしょうか？（芸術以外で） Adobeのページを読むと、Adobe Integrated Runtimeの略称で、&#8221;a cross-operating system runtime&# [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/multiplatform.png" alt="" title="multiplatform" width="600" height="338" class="alignnone size-full wp-image-1595" /></p>
<p>そもそもAIRって何なんでしょうか？（芸術以外で）</p>
<p>Adobeのページを読むと、Adobe Integrated Runtimeの略称で、&#8221;a cross-operating system runtime&#8221;などと書いてあるんですが、どうやら最近のAdobeの方針として、Flash等で作ったものがアプリケーションとしてどこでも動く、いわゆるWrite Once, Run Anywhereな実行環境を整備しようとしているようです。そのためのランタイムがAIRという理解でいいのかなと。自分の印象だと、どうもFlash自体がJavaに近い方向に向かってるみたいですね。</p>
<p>ちなみにAdobeはゲーム方面にも力を入れはじめているようで、Flash 11以降で、GPUを用いた3D描画や、ゲームコントローラのサポートが予定されているようです。</p>
<p>さて、AIRでは、以下のようなアプリケーションを開発できます。</p>
<ul>
<li>iOS（iPhone, iPod touch, iPad）アプリ</li>
<li>Androidアプリ</li>
<li>WindowsやMacにインストールするアプリケーション</li>
</ul>
<p>ActionScriptで書いたプログラムが、ブラウザで表示するFlashとしてだけでなく、各プラットフォームのアプリケーションとして配布できるのはすごくお得そうに見えます。あちらではAndroid SDKでJava、こちらではiOS SDKでObjective-Cというのは大変ですから。JavaScriptは？　というのはちょっと今回は置いといて（笑）。</p>
<p>要は、<span style="color:#f00;font-weight:bold;">FlashでiPhoneアプリだろうがPCゲームだろうが作れるよ！</span>ってことです。</p>
<p>AIRアプリケーションは、Adobeが無料で配布しているFlex SDKとAIR SDKを使って作成できます。今回の趣旨ですが、フリーのActionScript用統合開発環境である<a href="http://flashdevelop.jp/">FlashDevelop</a>と、ちょっとしたバッチファイル群を使って、ひとつのソースコード群から各プラットフォームのアプリケーションを手軽にビルドできないものかと試行錯誤してみました。</p>
<p>前置きが長くなりました。動くものをということで、こちらが今回のサンプルです。まだ癖が強い環境ですので、いろんなAPIを軽くテストするような感じになっています。</p>
<p><a href="http://geoquake.jp/experimental/AIRTemplate/"><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/screenshot.png" alt="" title="screenshot" width="600" height="449" class="alignnone size-full wp-image-1712" /></a></p>
<ul>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/">Flash版</a></li>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/AIRTemplate.apk">Android野良アプリ（AIRTemplate.apk）</a></li>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/AIRTemplate.exe">Windows用インストーラ（AIRTemplate.exe）</a></li>
</ul>
<p>さしあたって、Flash版をクリックして見ていただくのがいいかと思います。この気楽さがウェブアプリのいいところですね。</p>
<p>iOS版については、配布するにはApp Storeに登録するしかなく、こんなテスト用プログラムでは審査を通りませんので公開できません。代わりにiPhone 4で動かしている様子を撮影しましたのでご覧ください。</p>
<p><iframe width="599" height="341" src="http://www.youtube.com/embed/UuwSOSqeiRA?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>FlashDevelopプロジェクトはこちらです。</p>
<ul>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/AIRTemplate.zip">AIRTemplate.zip</a></li>
</ul>
<p>FlashDevelopは4.0.0以降を使用します。2011-06現在、4.0.0はまだベータ版なのですが、3.3.4では駄目なので……不具合など不安な場合は正式版になるまで待ってください。ベータ版は<a href="http://www.flashdevelop.org/community/viewtopic.php?f=9&#038;t=3529">こちら</a>で配布されています。また、iOS版のパッケージングには<a href="http://developer.apple.com/jp/programs/ios/">iOS Developer Program</a>への加入が必要です（<a href="http://help.adobe.com/ja_JP/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7ff0.html#WSfffb011ac560372f284e44b012cd1e700c0-8000">ここ</a>を読むと、もしかしてMacがなくてもなんとかなるんでしょうか？）。</p>
<p>プロジェクトの簡単な説明と、そのあとAIRの所感にも触れたいと思いますが、その前に回り道になる人が出ないよう２点ほど。</p>
<p>ここではフリーソフトのFlashDevelopを使っていますが、Adobeの<a href="http://www.adobe.com/jp/products/flash.html">Flash Professional CS 5.5</a>や<a href="http://www.adobe.com/jp/products/flash-builder.html">Flash Builder 4.5</a>では正式にマルチプラットフォーム書き出しができます。高価ですが、なにしろ公式サポートなのでずっと楽です。Flash Builderの体験版を試してみたところ、インストールして数分でiPhoneとAndroid実機での実行までできました。</p>
<p><a href="http://clockmaker.jp/blog/2011/06/adcmeetup-01/">ADC MEETUP ROUND 01 発表資料「Flashによるマルチデバイスアプリ開発ワークフロー」 | ClockMaker Blog</a></p>
<p>また、iOSやAndroidのパッケージングについて、すでにエントリを書いている方々がいらっしゃいます。Adobe公式のドキュメントなども非常に詳しいです。まずこちらで基本的な手順を確認したほうがいいかもしれません。</p>
<p><a href="http://ton-up.net/blog/archives/668">AIR2.7でAIR for iOSを試してみた | ton-up blog &#8211; とんぶろ</a><br />
<a href="http://blog.alt-scape.com/archives/409">FlashDevelop4ビルド版でAIR for Android(ver 2.7)のセットアップメモ | alt</a></p>
<p><a href="http://help.adobe.com/ja_JP/air/build/index.html">Adobe AIR * Adobe AIR® アプリケーションの構築</a><br />
<a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-8000.html">Adobe AIR * モバイルデバイス向けの AIR アプリケーションの開発</a></p>
<p><a href="http://www.atmarkit.co.jp/fsmart/articles/airaios01/01.html">iPhone/iPadアプリ開発の扉を開くAdobe AIR 2.6とは（1/3） &#8211; ＠IT</a></p>
<p style="text-align:center;">*</p>
<p>というところで、ようやくプロジェクトファイルについてです。通常のFlashDevelopプロジェクトにいくらか手を加えてあります。使いかたとしては、</p>
<ol>
<li>FlashDevelop上でSWFファイルをビルドする</li>
<li>証明書などを用意</li>
<li>build.batまたはbuild.bat debugを実行してAIRアプリケーションとしてパッケージング（ipa、apk、air、exeファイルの作成）</li>
</ol>
<p>となります。なお、Androidプロジェクトでは、FlashDevelopのビルドで実機での実行・デバッグまでできるようにしてあります。それぞれ詳しい手順については、README.txtをご覧ください。</p>
<p><strong>ソースコードの共有</strong></p>
<p>FlashDevelopでは通常ひとつしかないプロジェクトファイル（*.as3proj）ですが、複数用意することで、ひとつのソースコードからそれぞれのプラットフォーム向けのビルドを行っています。プロジェクトは、Projectパネルでas3projファイルをダブルクリックして簡単に切り替えられます。当然ですが、プロジェクトのプロパティやライブラリの登録などはそれぞれ独立していますので、変更した場合に忘れないよう注意が必要です。as3projファイルはXMLファイルですので、どんな情報を保持するファイルなのか、テキストエディタなどで見ておいたほうがいいでしょう。</p>
<p><strong>条件付きコンパイル</strong></p>
<p>プラットフォームによってコンパイルされるソースコード内容を変更するために、ActionScriptの条件付きコンパイルを用いています。</p>
<p><a href="http://cuaoar.jp/2010/10/actionscript-30.html">ActionScript 3.0 の条件付きコンパイル &#8211; akihiro kamijo</a></p>
<p>FlashDevelopでコンパイル定数を設定するには、プロジェクトのプロパティ、Compiler OptionsタブのCompiler Constantsを開きます。MY_CONFIG::PLATFORMとMY_CONFIG::AIRを設定し、以下のようにビルド・実行するコードを変更しています。</p>
<pre class="brush: jscript; title: ; notranslate">
config namespace MY_CONFIG;

MY_CONFIG::AIR {
	...
}

if (MY_CONFIG::PLATFORM == &quot;iOS&quot;) {
	...
}
</pre>
<p>条件付きコンパイルではなく、Capabilitiesなどの参照でなんとかなることも多いかもしれません。</p>
<p><strong>アプリケーション記述ファイル</strong></p>
<p><a href="http://help.adobe.com/ja_JP/AIR/1.1/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7ff1.html">Adobe AIR * AIR アプリケーションプロパティの設定</a><br />
<a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html">Adobe AIR * モバイルアプリケーションプロパティの設定</a></p>
<p>AIRアプリケーションをパッケージングするときに必要な設定ファイルです。プロジェクトのルートにapplication.xmlを配置するとFlashDevelopのProjectパネルのボタンから設定ウィンドウを開けるので、ここに配置して全部のプラットフォームで共有しています。</p>
<p>アプリケーションアイコンについては、全部のプラットフォームで使用するサイズのアイコンをまとめて設定してしまっています。</p>
<pre class="brush: xml; title: ; notranslate">
	&lt;icon&gt;
		&lt;image16x16&gt;icon16.png&lt;/image16x16&gt;
		&lt;image32x32&gt;icon32.png&lt;/image32x32&gt;
		&lt;image36x36&gt;icon36.png&lt;/image36x36&gt;
		&lt;image48x48&gt;icon48.png&lt;/image48x48&gt;
		&lt;image72x72&gt;icon72.png&lt;/image72x72&gt;
		&lt;image57x57&gt;icon57.png&lt;/image57x57&gt;
		&lt;image114x114&gt;icon114.png&lt;/image114x114&gt;
		&lt;image128x128&gt;icon128.png&lt;/image128x128&gt;
	&lt;/icon&gt;
</pre>
<p>こうすると、使用されないアイコンまでパッケージに含まれ、パッケージの容量がやや増えてしまいますが、まあ気にしないでいいのではないかと（富豪的パッケージング）。各サイズのアイコンは、バッチファイルで<a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>を使用してひとつのicon.pngからまとめて作成しています。</p>
<p>*</p>
<p>モバイル版AIRを試してみて気づいたことです。</p>
<p><strong>解像度</strong></p>
<p>スマートフォンのディスプレイ解像度は多種多様です。が、デフォルトでは、Flashがアスペクト比を保ったまま画面の内側からフィットするようにステージをスケーリングしてくれますので、ゲームなどではこれに任せて、物理的な解像度についてはあまり気にしなくてもいいのかなと思います。Flashが元来ベクターグラフィックスに強いのも幸いしています。ただし、ディスプレイのアスペクト比の違いが問題になります。たとえば、iPhone向けにステージサイズを640&#215;960に設定したSWFを、Galaxy Sの480&#215;800の画面で表示すると、ステージの上下が余分に表示されてしまいます。</p>
<p>この対策は３つ考えられると思います。</p>
<ul>
<li>DisplayObject.maskでステージ内のみ描画するようマスクを設定する</li>
<li>ステージの外部をオブジェクトで覆い隠す</li>
<li>アスペクト比にあわせて表示要素を外にずらす</li>
</ul>
<p>マスクを使うのが楽なのですが、やはり描画にマスク判定が入ると重いのか、端末や描画モードによってはパフォーマンスがかなり落ちてしまいます。iOSのCPUモードではフレームレートが半減することもありました。２番目、３番目の組みあわせになるでしょうか。</p>
<p>なお、StageScaleMode.NO_SCALEを設定すると、物理解像度の座標系で描画できるようになります。詳しくはこちらのページに解説があります。</p>
<p><a href="http://www.adobe.com/jp/devnet/flash/articles/authoring_for_multiple_screen_sizes.html">複数の画面サイズ向けのモバイルFlashコンテンツのオーサリング | デベロッパーセンター</a></p>
<p>StageScaleMode.NO_BORDERというものもあります。こちらは外側から画面にフィットしてくれます。</p>
<p><strong>CPUモードとGPUモード</strong></p>
<p>モバイル版AIRには、CPUモードとGPUモードの２つの描画モードがあり、アプリケーション記述ファイルのrenderModeでどちらを使用するか指定します。GPUモードのほうが速そうに思えますが、端末や描画内容によってまちまちで、正直よくわかりません。AIR 2.6と2.7で特性が大きく変わったりもしているようですし、各種ベンチマークをまとめて取るプログラムを作る必要があるかもしれません。サンプルではAndroid版はGPUモード、iOS版はCPUモードでパッケージしています。</p>
<p>GPUモードではDisplayObjectのフィルタが使えない等いろいろな制限があります。制限事項がこちらのページにあります。</p>
<p><a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffd.html">Adobe AIR * 一般設定</a></p>
<p>ちなみに今後、モバイル版AIRでもMolehillのハードウェア3D APIが使えるようになるそうですので、そうなるとGPUモードを重用するようになってくるのかなと思います。</p>
<p>あと、このエントリを書いている最中に、AndroidのGPUモードに不具合らしいものを見つけました。cacheAsBitmapをtrueにすると、アプリを中断して復帰するときに表示が化けるようです。フィルタを設定しただけでもtrueになるので要注意です。</p>
<p><strong>互換性と実行速度</strong></p>
<p>実際、ActionScriptコードがどれくらい動いてくれるのかですが、こいつ、動くぞ！って感じです（笑）。<a href="http://www.libspark.org/wiki/keim/SiON">SiON</a>でMMLが演奏できたり、<a href="http://away3d.com/comments/away3d-lite-v1-0-fastest-and-smallest-3d-engine-in-flash">Away3D Lite</a>で3Dモデルが表示されたりするほどですから、大抵の処理は問題ないんじゃないでしょうか。つまり、ActionScriptの豊富なコード資産がそのまま使えるということです。</p>
<p>ただ、パフォーマンスについてはスマートフォンのCPUパワーなりです。<a href="http://geoquake.jp/experimental/AIRTemplate/">サンプル</a>の「Sound (SiON)」でLoad Complex MMLで呼び出せる曲（超手前味噌ですみません……）がGalaxy Sではほぼ正常に鳴ってますが、iPhone 4では処理が追いつきませんでした。上の動画で音が途切れている様子がわかりますのでご覧ください。</p>
<p>また、描画についてはかなり軽い描画内容でしか高フレームレートが維持されず、すぐ30fps以下になってしまいます。個人的には60fps大好き人間なのでつらいところですが、このあたりについてはランタイムの最適化が進むか、あるいは時間が解決するというやつで、今後数年でスマートフォンの性能が上がれば大丈夫なんじゃないでしょうか。</p>
<p><a href="http://geoquake.jp/blog/wp-content/uploads/2011/06/Uncompiled-AcionScript.png"><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/Uncompiled-AcionScript-200x300.png" alt="" title="Uncompiled AcionScript" width="200" height="300" class="alignleft size-medium wp-image-1341" /></a></p>
<p>あと、細かな制限があるようで、例えばiOSではActionScriptを含んだSWFをLoaderやEmbedで読み込めないようです。ipa-debugターゲットで読み込もうとすると、&#8221;Uncompiled ActionScript&#8221;というエラーメッセージが出ます。</p>
<p>また、ipa-app-storeターゲットでは何も表示されず、以後の読み込みがすべて失敗します。うっかりActionScript入りSWFを読み込んでしまうことは多そうですから、割と地雷の予感……。</p>
<p style="clear:both;">
<p>それからGalaxy SでMP3の再生開始に間があります。「Sound (MP3)」でSEボタンを押して確認できますが、ゲームの効果音の再生に支障がありそうです。iOSでは瞬時に鳴ります。</p>
<p><strong>タッチパネルの判定</strong></p>
<p>スマートフォンの小さい画面にウェブページと同じサイズでボタンを表示すると、なかなかタップできないことがあります。ボタンを大きくしてもいいですが、当たり判定だけを大きくする方法もあります。実際、サンプルではBackボタンの反応が悪かったので、タッチパネルの場合だけひとまわり大きい透明な矩形をaddChildして判定を広げてみました。このテクニックは使いでがあるんじゃないかと思いました。</p>
<pre class="brush: jscript; title: ; notranslate">
// タッチパネルなら当たり判定を広げる
if (Capabilities.touchscreenType == TouchscreenType.FINGER) {
	var rect:Rectangle = backButton.getBounds(backButton);
	rect.inflate(10, 10);

	var touchArea:Shape = new Shape();
	var g:Graphics = touchArea.graphics;
	g.beginFill(0xFF0000, 0);
	g.drawRect(rect.x, rect.y, rect.width, rect.height);
	g.endFill();

	backButton.addChild(touchArea);
}
</pre>
<p><strong>リモートデバッグ</strong></p>
<p>最初、実機でのデバッグのやり方がわからなかったのですが、</p>
<ul>
<li>SWFをDebugビルド</li>
<li>Androidではapplication.xmlでandroid.permission.INTERNET権限を許可しておく</li>
<li>adtでパッケージングするときに -connect [FlashDevelopが動いているPCのIPアドレス] オプションをつける</li>
<li>FlashDevelopのデバッガを Debug > Start Remote Session で待機させてから</li>
<li>実機でアプリを起動</li>
</ul>
<p>というようにすればいいようです。iPhone、AndroidともにFlashDevelopのデバッガでステップ実行が可能です。</p>
<p><strong>iOSでのテストが手間</strong></p>
<p>iOSのパッケージングがとにかく遅いです。SandyBridgeのCore-i5 2500K機で、今回のサンプルのパッケージングに1分30秒かかっています。また、パッケージしたアプリを実機に転送するのにiTunesを使うのですが、「同期」ボタンを押して、転送が完了するまでさらに1分30秒近くかかります。ビルドの間にラーメンができます。パッケージングのほうは、最適化をしないipa-debug-interpreterターゲットを使えば数秒で終わるんですが（実行速度がだいぶ遅くなります）、実機への転送はiOSがクローズドなため改善されるとも思えず、困ったものです。Flash Builderでもipaファイルを自分で転送するように指示する表示が出ます。</p>
<p>Androidならパッケージング、転送、起動全部込みで10秒かかりませんので、Androidでのテストが基本になりそうです。</p>
<p>それと、アプリケーション記述ファイルのversionNumberを変更しなければiTunesでアプリを更新できません。どうしても変更を忘れてしまうので、versionNumberを0.0.1増やすPerlスクリプトを作ってパッケージングの際に自動的に呼び出すようにしています。</p>
<p><strong>Flexフレームワーク</strong></p>
<p>まだFlashDevelopでは試していないのですが、モバイル版のFlexフレームワークを使えば、一般的なスマートフォンのアプリケーションのようなユーザーインターフェースを作成できるようです。<a href="http://www.appcelerator.com/">Titanium</a>や<a href="http://jquerymobile.com/">jQuery Mobile</a>みたいな感じですかね。</p>
<p><a href="http://www.atmarkit.co.jp/fsmart/articles/fb4_5_android/01.html">Flash Builder 4.5でAndroidアプリを作ってみた &#8211; ＠IT</a><br />
<a href="http://codezine.jp/article/detail/5895">Android女子部が初体験 Flash Builder 4.5で作るAIR for Androidアプリ（1/4）：CodeZine</a></p>
<p><a href="http://opensource.adobe.com/wiki/display/flexsdk/View+and+ViewNavigator">View and ViewNavigator &#8211; Flex SDK &#8211; Adobe Open Source</a><br />
<a href="http://corlan.org/2011/01/12/understanding-flex-mobile-views-and-viewnavigator/">Understanding Flex Mobile View and ViewNavigator : Mihai Corlan</a></p>
<p><strong>制限事項</strong></p>
<p>AIRの制限ですが、現状ではスマートフォン固有のAPIにアクセスできないため、アプリ内課金や、iOSのGameCenterなどが使えません。といっても、この辺は公式フォーラムでどうにかしてと言ってる人が大勢いるので、すぐになんとかなるんじゃないかと思います（笑）。現時点でも、かなりトリッキーな方法で実現している方もいるようですが。</p>
<p>こちらのエントリで、AIR for Android/iOSでできないことが簡単にまとめられています。</p>
<p><a href="http://hi-posi.jp/?p=1050">hi-posi  Blog Archive  AIR for Androidでできない事。</a></p>
<p><strong>Androidへのインストール</strong></p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/device-180x300.png" alt="" title="device" width="180" height="300" /><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/air-180x300.png" alt="" title="air" width="180" height="300" style="margin-left:10px;"/></p>
<p>AndroidでのAIRアプリケーションの実行にはランタイムが必要です。</p>
<p>AIRアプリケーションを初めてダウンロードして起動するとき、ランタイムがないということで上のようなダイアログが出て、「インストール」をタップするとマーケットのAIRダウンロードページにジャンプします。このとき最初のAIRアプリケーションは終了してしまいますので、AIRをインストールしてから再度起動する必要があります。一度入れれば問題ないのですが、ちょっとしょっぱいなーと思います。</p>
<p>そして、「250,000超件のダウンロード」ということで、これがAIR for Androidの現在の利用状況ということですかね？</p>
<p><strong>パッケージの正体</strong></p>
<p>パッケージングして完成したairファイル、ipaファイル、apkファイルは、実はどれもZIPアーカイブです。拡張子をzipに変更すれば展開できますので、最終的にいったいどういうファイルが作られたのか、のぞいてみるといいかもしれません。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/zip.png" alt="" title="zip" width="518" height="284" class="alignnone size-full wp-image-1627" /></p>
<p>いまさら情報かもしれませんが、バイナリの先頭に「PK」が見えたらたぶんZIPです。</p>
<p><strong>コード署名証明書</strong></p>
<p>WindowsにAIRアプリケーションをインストールしようとすると出てくるおなじみの警告ダイアログ。最近はネイティブアプリケーションへの風当たりが厳しいですね。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/install.png" alt="" title="install" width="512" height="327" class="alignnone size-full wp-image-1747" /></p>
<p>発行元不明をなんとかしたければ、自己署名ではなく、ちゃんとしたコード署名証明書が必要です。国内で個人を対象に発行してもらえるのは<a href="http://jp.globalsign.com/service/codesign/">グローバルサイン</a>だけのようですが、高すぎるんですがどうにかなりませんか……。ちなみにインストールするときだけでなく、「プログラムのアンインストールまたは変更」でも発行元がUNKNOWNになってしまって結構目立ちます。</p>
<p><strong>困ったら</strong></p>
<p>やはりまだまだ発展途上の環境なので、謎の現象がいろいろ起きます。特にスマートフォンで疑わしい挙動に出くわしたら、Adobeのフォーラムやバグデータベースに当たるといいのではと思います。</p>
<ul>
<li><a href="http://forums.adobe.com/community/air/development/mobile?view=overview">Adobe Forums: Forum: Mobile Development</a></li>
<li><a href="http://bugs.adobe.com/">Adobe Bug Reporting System</a></li>
</ul>
<p><strong>まとめ</strong></p>
<p>さて、下準備にだいぶ手間がかかりましたし、今のところ人柱度も相当高めですが、これで一応、ブラウザだろうがデスクトップだろうがiPhoneだろうがAndroidだろうが、APIを調べまわったりせず、同じ手順で何かを動かせるわけです。自分としてはかなり気が楽になったなと思います。必要が生じればネイティブなSDKに切り替えればいいわけですしね。タッチパネルで何か実験しようと思ったらすぐActionScriptで書けますし、比較的パフォーマンス要求のないアプリなら、全プラットフォームで同時リリースなんてこともできるかもしれません。</p>
<p>これからのFlashのアップデート、特にゲームコントローラのサポートにも夢が膨らみます。最近はJavaScriptがトレンドですが、個人的にはFlashとももう少し長いつきあいになりそうな気がしています。</p>
<p>今後の課題としては、どうすればモバイルで描画パフォーマンスが出るか、あと今回はAndroiｄ MarketやApp Storeでリリースするところまで行ってませんので、そのためのアプリを何か考えないといけないなと。</p>
<p>そうそう、デスクトップ版AIRで、簡単に透明ウィンドウにできるのも面白いです。application.xmlのtransparent周りを変更してみてください。</p>
<p>久しぶりのエントリが思いもかけず長くなりました。日頃ウェブの情報にお世話になりっぱなしですし、こういうアウトプットもしておかないとということで。ひとまず置いて実制作に戻りたいなと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2011/06/27/airtemplate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Flashでジョイスティックを使う実験</title>
		<link>http://geoquake.jp/blog/2010/02/10/flashjoystick/</link>
		<comments>http://geoquake.jp/blog/2010/02/10/flashjoystick/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 12:09:39 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1161</guid>
		<description><![CDATA[Flashはブラウザゲームのすぐれたプラットフォームですが、ジョイスティックが使えないのが欠点のひとつです。一方、新興のゲームプラットフォームにUnityがあります。こちらのプラグインはまだほとんど普及していませんが、ジ [...]]]></description>
			<content:encoded><![CDATA[<p>Flashはブラウザゲームのすぐれたプラットフォームですが、ジョイスティックが使えないのが欠点のひとつです。一方、新興のゲームプラットフォームに<a href="http://unity3d.com/">Unity</a>があります。こちらのプラグインはまだほとんど普及していませんが、ジョイスティックに対応しています。</p>
<p>FlashにもUnityにも、それぞれブラウザのJavaScriptとの連携手段が用意されています。それなら、Unityからブラウザを介してFlashにジョイスティックの状態を送れば、Flashでもジョイスティックが使えるんじゃ？　と思いついたので、実際にやってみました。</p>
<p><a href="http://geoquake.jp/experimental/UnityJoystickSensor/"><img src="http://geoquake.jp/blog/wp-content/uploads/2010/02/UnityJoystickSensorClip.png" alt="" title="UnityJoystickSensorClip" width="500" height="400" border="2" class="alignnone size-full wp-image-1163" /></a></p>
<ul>
<li><a href="http://geoquake.jp/experimental/UnityJoystickSensor/">Unity Joystick Sensor</a>（ソース一式あり）</li>
</ul>
<p>ジョイスティックの状態を送る一連のプロセスについて。まずUnity側からです。Unityでは、物理デバイスの入力を整理・抽象化して、それぞれ名前をつけて扱うようになっています。メニューの Edit > Project Settings > Input にその設定があります。今回はひとまず生データを送りたいので、レバーの軸とボタンを一通り登録します。レバーのデッドゾーン（Dead）もゼロにしておきます。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2010/02/InputManagerClip.png" alt="" title="InputManagerClip" width="500" height="452" class="alignnone size-full wp-image-1190" /></p>
<p>気分の問題ですが、遅延を少なくするために、Unityの最大フレームレートを上げておきます。</p>
<pre class="brush: jscript; title: ; notranslate">
function Awake()
{
	Application.targetFrameRate = 300;
}
</pre>
<p>次に、ジョイスティックの状態の変化をブラウザに毎フレーム送信します。ブラウザとの通信については<a href="http://unity3d.com/support/documentation/Manual/Unity%20Web%20Player%20and%20browser%20communication.html">Unity Web Player and browser communication</a>に説明があります。Application.ExternalCall()でHTML内のJavaScriptを呼び出すことができます。実際のスクリプトとしては以下のようになります。</p>
<pre class="brush: jscript; title: ; notranslate">
var axes = new float[9];

function Update()
{
	for (var i = 1; i &lt;9; i++) {
		var position = Input.GetAxis(&quot;Axis&quot; + i);
		if (axes[i] != position) {
			axes[i] = position;
			turnOnLed();
			Application.ExternalCall(&quot;axisHandler&quot;, i, position);
		}
	}

	for (i = 0; i &lt; 16; i++) {
		var buttonName = &quot;Button&quot; + i;
		if (Input.GetButtonDown(buttonName)) {
			turnOnLed();
			Application.ExternalCall(&quot;buttonHandler&quot;, i, 1);
		}
		if (Input.GetButtonUp(buttonName)) {
			turnOnLed();
			Application.ExternalCall(&quot;buttonHandler&quot;, i, 0);
		}
	}
}
</pre>
<p>ちょっとしたテスト兼演出として、関数を呼び出したときにLEDが点灯するようにしました。</p>
<pre class="brush: jscript; title: ; notranslate">
function turnOnLed()
{
	GameObject.Find(&quot;Led&quot;).SendMessage(&quot;TurnOn&quot;);
}
</pre>
<p>次にHTMLです。Flashの埋め込みには<a href="http://code.google.com/p/swfobject/">SWFObject</a> 2.2を使用しています。Unityから呼び出されたJavaScriptの関数axisHandlerとbuttonHandlerが、ExternalInterfaceで登録したActionScriptの関数を呼び出します。</p>
<pre class="brush: jscript; title: ; notranslate">
var attributes = {
	id:&quot;Flash&quot;
};
swfobject.embedSWF(&quot;Game.swf&quot;, ...);
...
&lt;script type=&quot;text/javascript&quot;&gt;
	function axisHandler(no, position) {
		document.getElementById(&quot;Flash&quot;).axisHandler(no, position);
	}

	function buttonHandler(no, state) {
		document.getElementById(&quot;Flash&quot;).buttonHandler(no, state);
	}
&lt;/script&gt;
</pre>
<p>ExternalInterfaceは、ローカルファイルシステムではセキュリティのため動作しません。ローカルにApacheを立ててそこでテストするのが簡単です。また、ExternalInterfaceはいろいろ罠があって、ちょっとしたことで動かなくなることが多いようです。今回もそれでなぜかIEでだけ動かず、しばらくはまったんですが、教訓としては、SWFObjectのtest suiteから始めるのがいいと思います。</p>
<ul>
<li><a href="http://code.google.com/p/swfobject/wiki/test_suite">SWFObject 2.2 test suite</a></li>
</ul>
<p>ここの&#8221;Browser communication test page&#8221;がブラウザとの通信のサンプルです。test suiteというだけあって動くことが保証されていますので、このサンプルがサーバ上できちんと動くことを確かめてから少しずつ書き換えていくのがいいんじゃないでしょうか。</p>
<p>Flash側では、以下のようなクラスを作ってコールバック関数を登録し、メッセージを受け付けます。</p>
<pre class="brush: jscript; title: ; notranslate">
package
{
	import flash.external.ExternalInterface;

	public class Joystick
	{
		public static const AXIS_MAX:int = 9;
		public static const BUTTON_MAX:int = 16;

		private var axes:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;(AXIS_MAX);
		private var buttons:Vector.&lt;int&gt; = new Vector.&lt;int&gt;(BUTTON_MAX);

		function Joystick()
		{
			if (ExternalInterface.available) {
				ExternalInterface.addCallback(&quot;axisHandler&quot;, axisHandler);
				ExternalInterface.addCallback(&quot;buttonHandler&quot;, buttonHandler);
			}
		}

		public function axisHandler(no:int, position:Number):void
		{
			axes[no] = position;
		}

		public function buttonHandler(no:int, state:int):void
		{
			buttons[no] = state;
		}

		public function getAxis(no:int):Number
		{
			return axes[no];
		}

		public function isButtonPressed(no:int):Boolean
		{
			return (buttons[no] == 1);
		}
	}
}
</pre>
<p>これでUnityからFlashまでジョイスティックの状態が伝わるようになりました。</p>
<p>ちなみに、いったんここまで作った後で、逆の方法に思い当たりました。つまり、UnityからFlashにジョイスティックの状態を流し込むのではなく、FlashからUnityにジョイスティックの状態を問い合わせるやり方です。もしこちらができれば、通信量も間違いも少なく好ましいでしょう。が、ブラウザからUnityの関数をSendMessageで呼び出したときに、戻り値が取得できないので断念しました。</p>
<p>さて、これで、「Unityのプラグインがインストールされていればジョイスティックでも操作できるFlash」ができました。アクロバティックなやり方ですが、信じがたいことにIE8、Firefox 3.6、Google Chrome 4それぞれで<a href="http://www.amazon.co.jp/gp/product/B000CFX42E/">Xbox360コントローラ</a>などを使って普通に操作できるようです。特にアナログレバーを動かすとかなり頻繁にメッセージが送られるのでもつだろうかと心配だったんですが、レスポンスは悪くないし、CPU使用率もたいして上がりません。作る前はデータの間引きなども考えていたんですが、必要なさそうなのでやっていません。</p>
<p>で、実用性はどうかというと、微妙かなと思ってます。まず、ブラウザゲームでジョイスティックを使う文化がないですよね。それに、ジョイスティックを使いたい人はすでに<a href="http://www.vector.co.jp/soft/win95/util/se101657.html">JoyToKey</a>などを使っているはずです。アナログレバーが使えるという違いはありますが、Flashゲームはまずマウスとキーボードで遊べるように作りますから、ゲームにアナログレバーの必要な操作を持ち込むわけにはいかないでしょう。そもそも、ジョイスティックを使うゲームなら最初からFlashではなくUnityで作れよという気もします。</p>
<p>あと、１つのウェブページに２つの標準でない技術を使うことになるので、それなりにリスクがありそうです。Unityの出力するHTMLファイルも結構複雑ですし（ちなみにコメントで説明が書かれているので読んでおくのがおすすめです）、環境によっては不具合が発生するかもしれません。導入には結構ためらうものがあります。</p>
<p>もしUnityのプラグインがある程度普及すれば（20％くらい？）メリットのほうが大きくなるかもしれません。また、いずれにせよFlashでジョイスティックを使う方法ができたということで、ウェブではなく、どこかへの展示用のFlashなどでしたら役に立つかもしれません。</p>
<p>……ということで、どうもひたすら微妙な感じ。こんな<strong>変態的</strong>なことをさせる前に、そもそもAdobeがFlashでジョイスティックをサポートしてくれたらいいんですけどね……。<a href="http://jessewarden.com/2009/06/flash-player-11-gaming-platform.html">ゲーム志向にするとか考えてる</a>ならその辺検討してほしいなあ。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2010/02/10/flashjoystick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>N700系男子</title>
		<link>http://geoquake.jp/blog/2009/09/24/n700%e7%b3%bb%e7%94%b7%e5%ad%90/</link>
		<comments>http://geoquake.jp/blog/2009/09/24/n700%e7%b3%bb%e7%94%b7%e5%ad%90/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 20:38:28 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1067</guid>
		<description><![CDATA[Super Express &#8211; wonderfl build flash online タイトルに意味はありません（笑）。このところXNAやiPhone周辺をずっと調べてたんですが、だいぶ落ちついてきたので、 [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;width:465px;margin-bottom:16px;"><iframe title="Super Express - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/0ff37c7bc76fc3ef5b5da93ae81235975ca153b0" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/0ff37c7bc76fc3ef5b5da93ae81235975ca153b0" title="Super Express - wonderfl build flash online">Super Express &#8211; wonderfl build flash online</a></div>
<p>タイトルに意味はありません（笑）。このところXNAやiPhone周辺をずっと調べてたんですが、だいぶ落ちついてきたので、久しぶりのwonderfl新作です。ぼーっと眺めるのにいいんじゃないでしょうか。</p>
<p>架線柱のティアリングがちょっとひどいです。入れたとたんに一気に作る気をなくしかけたくらい。たぶんワーストケースに近いんじゃないかと……。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/09/24/n700%e7%b3%bb%e7%94%b7%e5%ad%90/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google MapsにPapervision3Dでオーバーレイ表示</title>
		<link>http://geoquake.jp/blog/2009/07/31/pv3dovergooglemaps/</link>
		<comments>http://geoquake.jp/blog/2009/07/31/pv3dovergooglemaps/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 11:33:40 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=908</guid>
		<description><![CDATA[Google Maps API for FlashにMap3Dクラスが新設されて、マップを傾斜・回転できるようになりましたが、Papervision3Dを使用すると簡単に3Dオブジェクトをオーバーレイ表示することができま [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/intl/en/apis/maps/documentation/flash/3d-maps.html">Google Maps API for FlashにMap3Dクラスが新設</a>されて、マップを傾斜・回転できるようになりましたが、Papervision3Dを使用すると簡単に3Dオブジェクトをオーバーレイ表示することができます。サンプルを作ってみました（ソースコードつき）。</p>
<p><a href="http://geoquake.jp/experimental/HelloPerspectiveWorld/"><img src="http://geoquake.jp/blog/wp-content/uploads/2009/07/pv3doverlay1.jpg" alt="pv3doverlay1" title="pv3doverlay1" width="300" height="300" class="alignnone size-full wp-image-949" /></a></p>
<ul>
<li><a href="http://geoquake.jp/experimental/HelloPerspectiveWorld/">Hello Perspective World</a></li>
</ul>
<p>通常のマウスドラッグだけでなく、Shift＋ドラッグやCtrl＋ドラッグで回転操作ができるので試してみてください。Google Earthとだいたい同じ操作になっているようです。</p>
<p>短いコードですが、コアになるのはGoogleMapsCamera3Dクラスで、PV3DのCamera3Dクラスを拡張して、マップに同期する投影行列を与えています。Googleマップのワールド座標系は、東方向がX軸プラスで0?256、南方向がY軸プラスで0?256、上方向がZ軸プラスの左手座標系になっていますが、この座標系上に直接PV3Dのオブジェクトを描画することができます。</p>
<p>せっかくなので、もっと面白いものを表示してみましょう。</p>
<p><a href="http://geoquake.jp/experimental/HelloPerspectiveWorld2/"><img src="http://geoquake.jp/blog/wp-content/uploads/2009/07/pv3doverlay2.jpg" alt="pv3doverlay2" title="pv3doverlay2" width="300" height="300" class="alignnone size-full wp-image-951" /></a></p>
<ul>
<li><a href="http://geoquake.jp/experimental/HelloPerspectiveWorld2/">Hello Perspective World 2</a></li>
</ul>
<p>東京駅前にワイバーン。3Dモデルは<a href="http://www.geocities.jp/oirahakobito2/">26℃さん</a>制作のをお借りしました。かっこいいですねー。</p>
<p>なにかいる</p>
<p><a href="http://geoquake.jp/experimental/HelloPerspectiveWorld2/"><img src="http://geoquake.jp/blog/wp-content/uploads/2009/07/pv3doverlay3.jpg" alt="pv3doverlay3" title="pv3doverlay3" width="300" height="300" class="alignnone size-full wp-image-953" /></a></p>
<p><a href="http://geoquake.jp/experimental/HelloPerspectiveWorld2/"><img src="http://geoquake.jp/blog/wp-content/uploads/2009/07/pv3doverlay4.jpg" alt="pv3doverlay4" title="pv3doverlay4" width="300" height="300" class="alignnone size-full wp-image-954" /></a></p>
<p><a href="http://www.phinox.net/">ズサさん</a>のねぎミクモデルを<a href="http://blog.r3c7.net/?p=121">rectさんのところ</a>からお借りしました。ありがとうございます。こんな感じで、小さなものから大きなものまで大丈夫です。ちなみに<a href="http://geoquake.jp/blog/2009/07/31/drivingsimulator3d/">拙作</a>でも同じ方法で車体を描画しています。</p>
<p>あとは平面投影シャドウあたりが欲しいですね。PV3Dでどうするのがいいのか調査中。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/07/31/pv3dovergooglemaps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2D自動車シミュレーター on Google Mapsを3D化</title>
		<link>http://geoquake.jp/blog/2009/07/31/drivingsimulator3d/</link>
		<comments>http://geoquake.jp/blog/2009/07/31/drivingsimulator3d/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 11:31:47 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[2D自動車シミュレーター]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=881</guid>
		<description><![CDATA[Google Maps API for Flashが3D表示、というかマップを傾斜表示できるようになっています。 3D Perspective in the Maps API for Flash! Google Maps [...]]]></description>
			<content:encoded><![CDATA[<p>Google Maps API for Flashが3D表示、というかマップを傾斜表示できるようになっています。</p>
<ul>
<li><a href="http://googlegeodevelopers.blogspot.com/2009/07/3d-perspective-in-maps-api-for-flash.html">3D Perspective in the Maps API for Flash!</a></li>
<li><a href="http://code.google.com/intl/en/apis/maps/documentation/flash/3d-maps.html">Google Maps API for Flash &#8211; 3D Maps &#8211; Google Maps API for Flash</a></li>
</ul>
<p>Google Maps APIの担当者さまのご好意でAPIを公開前に触らせていただきましたので、2D自動車シミュレーターを3D化してみました。まだ2車種しかないし、モデリングも適当だし、ホイールも回らないし、ブレーキランプや方向指示器も点灯しないしでやることが山積みなんですが、とりあえず仮公開。</p>
<p><a href="http://geoquake.jp/en/webgame/DrivingSimulatorPerspective/"><img src="http://geoquake.jp/blog/wp-content/uploads/2009/07/2ddrivingsimulator1.jpg" alt="2ddrivingsimulator1" title="2ddrivingsimulator1" width="500" height="441" class="alignnone size-full wp-image-992" /></a></p>
<ul>
<li><a href="http://geoquake.jp/en/webgame/DrivingSimulatorPerspective/">2D Driving Simulator on Google Maps (Perspective)</a></li>
</ul>
<p>右のCamera Controlで視点を操作できます。ドロップダウンメニューで、車体前方を上にするか、北を上にするかを切り替えることができます。</p>
<p>Googleマップ版でも画面が回転するようにしてほしいという要望は結構いただいてたんですが、これまでAPIの制約でできませんでした。今回のアップデートで、回転できるようになっただけでなく、傾斜で遠方まで見えるようになったので、だいぶ走りやすくなったんじゃないかと思います。</p>
<p><a href="http://geoquake.jp/en/webgame/DrivingSimulatorPerspective/"><img src="http://geoquake.jp/blog/wp-content/uploads/2009/07/2ddrivingsimulator2.jpg" alt="2ddrivingsimulator2" title="2ddrivingsimulator2" width="500" height="441" class="alignnone size-full wp-image-993" /></a></p>
<p>実のところ、もっと視点を下げて3Dレースゲーのようにしたいんですが、手前のタイルが欠けたり、遠方のタイルの読み込みと描画でパフォーマンスが極端に悪くなってしまうので難しいようです。まあ、そこまで極端な視点を使いたいのはこのアプリくらいでしょうからね（笑）。</p>
<p>あと、困ったことがひとつあって、「2D自動車シミュレーター」なのにうっかり3D表示になってしまったという……。2Dを取っても3Dに変えてもつまらない名前になってしまうし、内部的には2D処理のままだし、そのままでいいかみたいな（……いいのか？）。</p>
<p>2D自動車シミュレーター自体根本的にどうにかしないとと思ってるんですが、他にやることがいろいろあって進展がないです。<small>iPhone版とかどうでしょうね？</small></p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/07/31/drivingsimulator3d/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>やわらかボール</title>
		<link>http://geoquake.jp/blog/2009/06/04/yawarakaballs/</link>
		<comments>http://geoquake.jp/blog/2009/06/04/yawarakaballs/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 23:22:58 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=750</guid>
		<description><![CDATA[Yawaraka Balls &#8211; wonderfl build flash online 剛体を動かすにはもうBox2Dのような物理エンジンを使えばいいので、何か自分で動かすならやわらかいものかな、でも布とか [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;width:465px;"><iframe title="Yawaraka Balls - wonderfl build flash online" src="http://wonderfl.kayac.com/blogparts/b99bd4e71710fe9cf74e413730825e8a69c02226" width="465" height="490" style="border:1px black solid;" frameborder="0"></iframe><a href="http://wonderfl.kayac.com/code/b99bd4e71710fe9cf74e413730825e8a69c02226" title="Yawaraka Balls - wonderfl build flash online">Yawaraka Balls &#8211; wonderfl build flash online</a></div>
<p></p>
<p>剛体を動かすにはもう<a href="http://box2dflash.sourceforge.net/">Box2D</a>のような物理エンジンを使えばいいので、何か自分で動かすならやわらかいものかな、でも布とかメタボールとかもう皆やってるしなーとあれこれ考えていたところ、ローテクなやわらかボールを思いついたので作ってみました（というか自分ローテクしか無理）。たぶん意外となかったタイプ。</p>
<p>ばね法則でボールをやわらかく反射させつつ、ボールと壁、またはボール同士の距離によって見た目を変形させてます。ここまで単純化すると２点以上に同時に接触した場合に対処できないので、どうなるか心配だったんですが、ぎりぎり許容範囲？　ボールの数が多いとさすがにエラーが目立つ感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/06/04/yawarakaballs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>格ゲーコマンド入力判定</title>
		<link>http://geoquake.jp/blog/2009/05/20/fightinggame/</link>
		<comments>http://geoquake.jp/blog/2009/05/20/fightinggame/#comments</comments>
		<pubDate>Tue, 19 May 2009 16:08:51 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[ゲームプログラミング]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=430</guid>
		<description><![CDATA[格ゲーコマンド入力判定 &#8211; wonderfl build flash online 対戦格闘ゲームの必殺技コマンド入力の実験をしてみました。カーソルキーまたはテンキーでレバー、スペースキー・Ctrlキーでパン [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;width:465px;"><iframe title="格ゲーコマンド入力判定 - wonderfl build flash online" src="http://wonderfl.kayac.com/blogparts/c038aaa3abe4c506cdcc8c9c44f991a80876d2be" width="465" height="490" style="border:1px black solid;" frameborder="0"></iframe><a href="http://wonderfl.kayac.com/code/c038aaa3abe4c506cdcc8c9c44f991a80876d2be" title="格ゲーコマンド入力判定 - wonderfl build flash online">格ゲーコマンド入力判定 &#8211; wonderfl build flash online</a></div>
<p><br/></p>
<p>対戦格闘ゲームの必殺技コマンド入力の実験をしてみました。カーソルキーまたはテンキーでレバー、スペースキー・Ctrlキーでパンチボタン、Shiftキーでキックボタンです。技の名前は気にしない方向でひとつ。</p>
<p>判定方法は、リングバッファに過去一定フレームの入力状態を蓄積して、バッファに各コマンドのパターンが含まれているかどうかを毎フレームチェックしています。</p>
<p>いろんな種類のコマンドを、できるだけ簡単なスクリプトひとつで検出できるよう考えてみたんですが（<a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%8A%E3%83%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">コナミコマンド</a>も大丈夫！）、実際のゲームで汎用的に使えるかどうかは自信がないです。たぶん何か不都合が出てくると思う。そうでなくても、たとえば溜めコマンドなら、溜めはじめた時点でモーションを移行したりする必要が出てくるでしょうし。</p>
<p><a href="http://geoquake.jp/blog/2009/05/11/warpsmash/">Warp Smash</a>にしょーもないバグを発見。あとでこっそり直しておこう……。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/05/20/fightinggame/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warp Smash</title>
		<link>http://geoquake.jp/blog/2009/05/11/warpsmash/</link>
		<comments>http://geoquake.jp/blog/2009/05/11/warpsmash/#comments</comments>
		<pubDate>Sun, 10 May 2009 16:48:48 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[ゲーム制作]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=355</guid>
		<description><![CDATA[Warp Smash (Pong variation) &#8211; wonderfl build flash online どこかの絵を見て連想したので作ってみました。いわゆるポンのバリエーションで、マウスクリックで [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;width:465px;"><iframe title="Warp Smash (Pong variation) - wonderfl build flash online" src="http://wonderfl.kayac.com/blogparts/ed0c2c3b52880e0d9cefdafd7a89722a4d2e5b4f" width="465" height="490" style="border:1px black solid;" frameborder="0"></iframe><a href="http://wonderfl.kayac.com/code/ed0c2c3b52880e0d9cefdafd7a89722a4d2e5b4f" title="Warp Smash (Pong variation) - wonderfl build flash online">Warp Smash (Pong variation) &#8211; wonderfl build flash online</a></div>
<p><br/></p>
<p>どこかの絵を見て連想したので作ってみました。いわゆる<a href="http://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%B3_%28%E3%82%B2%E3%83%BC%E3%83%A0%29">ポン</a>のバリエーションで、マウスクリックでパドルが反対側にワープします。せっかくなので、BlurFilterを使ってパドルにモーションブラーをかけてみたりしました。</p>
<p>パドルをボールに合わせるのに加えて、パドルを早く反対側に移動させないとボールが返しにくい、でも早くクリックしすぎても駄目というタイミングゲームにもなっているのがミソかなと勝手に思ってます。だいたいゲームというのは、アクションにせよ何にせよ、プレイヤーに２つ以上のことを同時にさせると面白くなるんじゃないかと。１つだとどうすればいいかすぐ分かってしまうので。</p>
<p>ただ、マウスカーソルがFlashからはみ出さないように頑張るという不自然な３つ目が出てきてしまって微妙。マウスカーソル自体邪魔だし、ブラウザゲームでは、マウスが使えるといってもネイティブアプリケーションと同じようには扱えないってことでしょうか。</p>
<p>今日活躍のプチ関数。</p>
<pre class="brush: jscript; title: ; notranslate">
private function clamp(n:Number, min:Number, max:Number):Number {
	if (n &lt; min) { n = min; }
	if (n &gt; max) { n = max; }
	return n;
}
</pre>
<p>スコアのカンストつき加算にまで乱用してたり。</p>
<pre class="brush: jscript; title: ; notranslate">
　
score = clamp(score + 1, 0, 9999);
　
</pre>
<p>作る前は<a href="http://d.hatena.ne.jp/ABA/20090130">100行ゲーム</a>を意識してたんですが、こういうのが好きな体質なので無理っぽいです……。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/05/11/warpsmash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>気体のような何か</title>
		<link>http://geoquake.jp/blog/2009/04/17/gas10000/</link>
		<comments>http://geoquake.jp/blog/2009/04/17/gas10000/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 10:39:02 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=298</guid>
		<description><![CDATA[気体のような何か &#124; wonderfl build flash online wonderflのパーティクル祭りがすごいことになってるので急遽制作。マウスでピストンを動かして圧縮したりできます。物理的ツッコミはなしの方向 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wonderfl.kayac.com/code/56b9cc2acbe9ef50de46a96645b3eac62a215957"><img src="http://geoquake.jp/blog/wp-content/uploads/2009/04/gas10000.png" alt="gas10000" title="gas10000" width="465" height="465" class="aligncenter size-full wp-image-299" /></a></p>
<ul>
<li><a href="http://wonderfl.kayac.com/code/56b9cc2acbe9ef50de46a96645b3eac62a215957">気体のような何か | wonderfl build flash online</a></li>
</ul>
<p><a href="http://wonderfl.kayac.com/">wonderfl</a>のパーティクル祭りがすごいことになってるので急遽制作。マウスでピストンを動かして圧縮したりできます。物理的ツッコミはなしの方向で……。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/04/17/gas10000/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>うごく三角形トリック</title>
		<link>http://geoquake.jp/blog/2009/04/01/triangletrick/</link>
		<comments>http://geoquake.jp/blog/2009/04/01/triangletrick/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 21:31:49 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=203</guid>
		<description><![CDATA[Famous Triangle Trick &#8211; wonderfl build flash online Tweenerの練習がてら、有名な三角形トリックをアニメーションさせてみました。けど、こうやって動かすと [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;width:470px;"><iframe title="Famous Triangle Trick - wonderfl build flash online" src="http://wonderfl.kayac.com/blogparts/39d3cac8ab2ec540c0755246ac9306d915bc7ab2" width="465" height="490" style="border:0px black solid;" frameborder="no"></iframe><a href="http://wonderfl.kayac.com/code/39d3cac8ab2ec540c0755246ac9306d915bc7ab2" title="Famous Triangle Trick - wonderfl build flash online">Famous Triangle Trick &#8211; wonderfl build flash online</a></div>
<p><br/></p>
<p><a href="http://code.google.com/p/tweener/">Tweener</a>の練習がてら、有名な三角形トリックをアニメーションさせてみました。けど、こうやって動かすとバレバレになってしまうかなー。</p>
<p>配色や線の太さなどがなかなか決まらなくて、かなり無駄なリビルドを繰り返しました。これくらい簡単な絵でも、最初にきちんとスケッチしたほうがいいようです。僕の場合。</p>
<p>で、Tweener面白いですね（いまさらすぎる。何周遅れだろう？）。正直、ウェブでぼーっと眺めていた限りでは、こんな処理をライブラリ化する必要があるんだろうかと首を傾げてたんですが、簡単なシーケンスも組めるし、ベジェ曲線や<a href="http://nutsu.com/blog/2009/020520_as_tween_spline.html">スプライン曲線でも</a>動かせるし、何より動きを試すコストがぐっと下がるのが大きいです。なるほど、Flasherの人たちはこれで心地よい動きをさくさく作ってたのか、と納得。</p>
<p>簡単そうなことが実は意外に重荷になっていて、さらに簡単にすることで大きな利益が得られるようなことがあるのかもしれないなと思いました。その系統だと、例えばこういうプチ関数が好きなんですが、どうでしょうね。</p>
<pre class="brush: jscript; title: ; notranslate">
// [n, m)の乱数を取得
function random(n:Number, m:Number):Number {
	return n + Math.random() * (m - n);
}

// 自乗を取得
function square(n:Number):Number {
	return n * n;
}

// nを[s0, s1]から[d0, d1]に変換
function linearTransform(n:Number, s0:Number, s1:Number, d0:Number, d1:Number):Number {
	return (d0 + (n - s0) * (d1 - d0) / (s1 - s0));
}
</pre>
<p>インライン最適化のないActionScriptだとちょっと使うのをためらいますが。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/04/01/triangletrick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

