Flash Player と AIR のバージョン 15 の新機能を紹介の 3 回目です。今回はモバイル環境で使える新機能です。 (Mac で使えるのがひとつ混じってます)
追加された機能は、各プラットフォームごとに以下のとおりです。
Mac / iOS 環境
- StageText.drawViewPortToBitmapData の Retina 対応
- 新しい iOS パッケージングエンジンがデフォルトに
Android環境
- マルチプレーヤー対応などAIR Gamepad の強化
- AIR ゲームのクロスプロモーション
最後のクロスプロモーション機能は、「現在 iOS 用も開発中」 だそうです。
StageText.drawViewPortToBitmapData の Retina 対応
drawViewPortToBitmapData は StageText の表示領域をビットマップに書き込むメソッドです。これまで、データ書き込み用の BitmapData オブジェクトは StageText オブジェクトと同じサイズのものが前提でした。
AIR 15 からは、新しく追加された属性、Stage.contentsScaleFactor の分だけ大きな BitmapData オブジェクトを利用できます。HiDPI の Retina 上では contentsScaleFactor は 2 になるため、2 倍のサイズの BitmapData が使えます。
Event.COMPLETE を受け取る前にこの機能を利用すると、正しくデータを描画できない場合があるようです。これは、事前に解像度の情報を取得する必要があるためだそうです。
新しい iOS パッケージングエンジンがデフォルトに
iOS をターゲットにしてパッケージする際、新しいコンパイラーがデフォルトで使われるようになりました。もし以前のエンジンが使いたい場合、ADT の引数に "-useLegacyAOT yes" を指定します。
新しいコンパイラーは以前と比較して最大 20 倍ほど高速というデータがあります。高速化の主な理由は以下のあたりになるようです。
- Java から C++ で書き直し
- LLVM との JNI による通信のオーバーヘッドが無くなった
- オペコードを一つ一つ変換せず、中間表現に変換しておいて、まとめて最適化
- インクリメンタルコンパイルに対応、コンパイル済みライブラリの再利用が可能に
より詳細ははこちらの記事に説明があります。 (Faster compiling with AIR for iOS - 英語です)
AIR Gamepad の強化
AIR Gamepad は、同一ネットワーク上にある Flash コンテンツと Android デバイスの AIR ランタイムを接続します。今回は、デバイスを、よりゲームのコントローラーっぽく使えそうな機能が追加されました。
具体的には、
- マルチプレーヤーのサポート
- ジャイロセンサーからのイベント取得
- 地磁気センサーからのイベント取得
あたりです。タッチ以外の操作も使えるようになって、既存の Flash ゲームの作り直しも楽しくなりそうです。
SWC ファイルは SDK に含まれている frameworks\libs\air\gamepad.swc です。日本語のものがないのですが、アドビの提供する ASDoc はこちらです。 (AIR Gamepad API)
Gamepad の基本的な使い方を簡単に紹介しておきます。まずは、デバイス側の準備です。
- もしまだの場合、AIR ランタイムアプリケーションをインストールします。Google Play から、もしくは SDK の runtimes\air\android\device\Runtime.apk を使います
- AIR アプリを起動します
- デバイスを振って、Gamepad の画面を表示します。PIN が表示されているのを確認します。PIN は 6 つの英数字からなる文字列で、Flash コンテンツと接続する際に使用します
つぎに、Flash コンテンツ初期化の手順です。
- AIRGamepad.getGamepad() を呼び出し AIRGamepad オブジェクトを取得します
- connect() を使ってデバイスに接続します。このメソッドを呼ぶと、 ユーザに PIN の入力を促す画面が表示されます
- ユーザがPIN を入力し "Connect" を押すと、デバイスの接続作業が始まります
関連するコードは以下のような感じになります。
// AIRGamepadオブジェクトの生成 var player1:AIRGamepad=AIRGamepad.getGamepad("player1"); // デバイスのGamepadに接続 try{ player1.connect(stage,"publisher","appURL"); } catch(e:IllegalOperationError){ trace("IllegalOperationError : "+e); }
getGamepad() メソッドの引数は、接続する Gamepad を識別する文字列です。マルチユーザーゲームの場合は、デバイスごとに異なる名前を指定します。この ID は、PIN を入力するダイアログに表示されます。
connect() メソッドの最初の引数は PIN 入力用のダイアログを表示するステージです。2 番目と 3 番目の引数は PIN と共に Gamepad との接続時のハンドシェイクに使われます。接続に成功すると AIRGamepadEvent.CONNECT イベントが発生します。
接続されたらデバイスに JPEG 画像を送信して、Gamepad のスキンとして表示させることができます。画像に簡単な操作方法やタッチポイントを描いておくとユーザーに喜ばれそうです。
画像を送信する手段は 2 つ提供されています。
drawImage(encodedImage:ByteArray):void drawSprite(sprite:Sprite, quality:int = 90):void
デバイスのスクリーン解像度は機種により異なるため、送信前に画像の大きさを調整することになります。大きなビットマップを縮小しながら使う場合は drawImage() が、Sprite を JPEG 画像に変換して使う場合には drawSprite() が便利です。
画像を自分でリサイズする場合、必要となるデバイス画面の大きさは AIRGamepad オブジェクトの height, width 属性から取得できます。AIRGamepad では、デバイスの上側を左に向けた横長の持ち方のみサポートされているため、常に width が height より大きくなるはずです。
デバイスでのスキン描画が完了すると AIRGamepadEvent.DRAW_COMPLETE イベントが通知されます。失敗した場合は AIRGamepadErrorEvent.DRAW_ERROR イベントが発生します。
デバイスにスキン画像が表示されたら、AIRGamepad をコントローラーとして使える状態です。デバイスからのイベントに応じて画面を更新したりデバイスを振動させる仕組みを足すと、Flash コンテンツの Gamepad 対応の完成です。
AIR ゲームのクロスプロモーション
最後の機能は AIR ゲームのクロスプロモーション機能です。AIR SDK に含まれる frameworks\libs\air\crosspromotion.swc を使うと、ゲーム内に他のゲームの広告を表示できます。AIR 15 では Android のみサポートです。 (ADViewer API)
開発者は、ゲーム内広告のインプレッションやクリック数に応じてポイントを獲得できます。集めたポイントは自分のアプリのプロモーション用に使われます。ポイントにその他の貨幣的な価値はありません。
他のゲームの広告を表示すると 1 ポイント、それがクリックされると 30 ポイント獲得です。逆に、自分のゲームの広告が表示されたら 1 ポイント支払います。それがクリックされた場合は 30 ポイントです。
保持するポイントが 0 ポイント以下になるとプロモーションの資格が停止されます。その後 1 ポイントでも獲得すれば、他のゲームへの広告が再開されます。
使い方は単純です。下のコードのように、ADViewer オブジェクトを取得したら、load()、show() と呼べばアドビのサーバーから取得した広告が表示されます。
var applicationId:String = "100001"; adViewer= AdViewer.getAdViewer(this.stage, applicationId); adViewer.load(); // Event.COMPLETEの後に adViewer.show();
上のコードの最初の行に定義している ID は、アドビにゲームを登録するともらえます。ID を省略すると API は利用できますがポイントが取得できません。 (他のゲームに自分の広告が表示されない状態、つまり、テスト用です)
ゲームの登録はアドビにメールします。宛先はこちら。その際、以下の情報を添付します。
- ゲームの名前
- ゲーム提供者の名前
- Google Play 上のゲームの URL
- 有償アプリか無償アプリか
- ゲームの画像 (最大 500KB)
ポートレート:幅 高さ アスペクト比 1080 1920 9:16 640 960 2:3 1536 2048 3:4 幅 高さ アスペクト比 1920 1080 16:9 960 640 3:2 2048 1536 4:3
注:送るのはポートレートかランドスケープどちらかだけです。両方の向きに対応するゲームは未サポートのため
事前に Cross promotion program agreement をご確認ください。
登録後に送付されるアプリケーションの ID を使えばクロスプロモーションが開始されるはずです。ポイントに従って広告が他のアプリに表示されることを確認する手段はなさそうですが。
コメントする