RetroWeb ~iPhoneとAndroidでハイブリッドゲームアプリ開発~

AIR for iOS+AndroidでSmartPhone Game ハイブリッドアプリ開発

最近作ったアプリ
100億本の抜け毛 100億匹のモナー DQ3闘技場アプリ モナーペット(進化)

AIRアプリの起動を200%高速にする方法

先に結果の秒数はこんな感じです。

①GalaxyS3の場合…7338=192%高速化(ちなみに空アプリは37)
②IS03の場合…17381=214%高速化(ちなみに空アプリは57)

そしてそのアプリのAndroid版。(いつものしまむらくん。数日中に起動高速化版(Ver1.4.3)が、反映されるはず。。)
https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production

iOS版も審査通る気がするけど、確認中(なのでまだ未反映)
https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=825465264

で、やったことは単純で、.swcでnewしてたAsset一式を、.swfにしてAIR for Android設定の含めるファイル内にいれて、バイナリロードからのnewにしただけ。引数のurlは、.swfのファイル名だけで読めるので楽ちん。これでアプリ起動が遅いAIRアプリが、200%高速に。

function LoadByte(url:String, callBack:Function):void {
	var urlLoader:URLLoader = new URLLoader();
	var req:URLRequest = new URLRequest(url);
	urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
	urlLoader.addEventListener(Event.COMPLETE, onCompleteUrlLoader);
	urlLoader.load(req);
	urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(e):void{
		trace("265_IOエラーです。"+url);
		trace("e.text = " + e.text);
	});
	
	function onCompleteUrlLoader():void {
		var ba:ByteArray = urlLoader.data;
		var lc:LoaderContext = new LoaderContext();
		//if(Com.IsAir()) 
		lc.allowLoadBytesCodeExecution = true;
		var loader:Loader = new Loader();
		loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteLoader);
		loader.loadBytes(ba, lc);
		function onCompleteLoader():void {
			var apd:ApplicationDomain = loader.contentLoaderInfo.applicationDomain;
			callBack(apd);
		}
	}
}


ロードしたswfから、リンケージしたクラスを抽出するときは、下記メソッド。

function getClass(d:ApplicationDomain, s:String):Class{
	return d.getDefinition(s) as Class;
}

アプリにご要望フォームを実装

GameFeatの広告を実装したiPhone版を審査に出しつつ、Android版にご要望フォームを実装しました。WebViewだと融通聞かなかったりするので、UIごと作成。ご要望をサーバーに保存しつつ、自分の携帯にもメールが来ます。ついでに微妙な気がしたゲーム内セリフウィンドウをいったん隠すw。 機能山盛りで、アプリの起動に時間かかるようになってきた気がするので、そろそろなんとかせねば~。
f:id:hisashi_vc:20140423013037j:plain

ane競合時の謎エラー対策

自作aneを作って、AdobeのGameCenterのaneと合わせて使ったら、下記エラー;

ArgumentError: Error #3500: The extension context does not have a method with the name getAuthenticated.
	at flash.external::ExtensionContext/_call()
	at flash.external::ExtensionContext/call()
	at com.adobe.ane.gameCenter::GameCenterController/get authenticated()
	at Test3$/initGameCenter()[C:\Users\hisashi_vc\Adobe Flash Builder 4.7\Test3\src\Test3.as:41]
	at Test3()[C:\Users\hisashi_vc\Adobe Flash Builder 4.7\Test3\src\Test3.as:24]
[SWF] com.starbrain.devpush.HelloWorld3 - 2,995 バイト (圧縮後)
[SWF] Test3.swf - 2,321 バイト (圧縮後)

原因に心当たりなく謎。ネットではリリースビルドにすればError #3500消えるという情報を見かけましたが、どうもいろいろやってもダメぽ。最終的にextention.xml内の下記記述回りを一通りユニークな名前にしたら、なおりました。

<initializer>ExtInitializer</initializer>
<finalizer>ExtFinalizer</finalizer>

<initializer>ExtInitializerHisa</initializer>
<finalizer>ExtFinalizerHisa</finalizer>

ネイティブ側言語の記述も合わせて修正して、メソッド名や参照名全部ユニークにして、aneを再生成したらなおりました。

AIRアプリで、ハイブリットGameFeat広告を実現

iOSも外部ライブラリ連携を調査し。まだオフィシャルにも出てないane完成w 今回の実装で、AndroidiOSも、AIRアプリ内で、事実上あらゆるネイティブライブラリを使えるようになりました。アイコン広告にも対応したら、本番ゲームアプリにも実装せねば~。
f:id:hisashi_vc:20140420002250j:plain

今後のスマフォゲームヒット条件1.プレイ時間設計

フラッピーバードがヒットしたのは、プレイ時間が極端に短い(すぐ死ぬから)おかげで、再プレイコストが極端に低かったため、何度もやってしまい、その結果、ハマりプレイヤー発生率が上昇したからだと思われます。

つまりプレイ時間設計と、プレイ時間成長率設計、そしてそのアナリティクス検証(自ゲーム他ゲーム問わず)が、次の時代の覇者条件になってくるはず。特にLTV(総収益)が高いカジュアルゲームの、プレイ時間アナリティクス傾向は気になるなあ。

図鑑にキャラ表示

ちょい図鑑ができてきました。
図鑑に登録したキャラを、マテリア穴っぽいのに登録して、ゲーム中に特殊効果とかやってみたいな~。

f:id:hisashi_vc:20140316153903j:plain

Androidゲームアプリ申請から1か月経過

現在iPhone版との合計で400DL超えたくらいなので、iPhone版公開日からの1か月でカウントすると、500ダウンロードくらいの検証結果かな~。ノープロモ&ほぼオーガニック流入(自然流入)のみ&デザインとモチーフの引きほぼ無しのサンプル。来月か再来月くらいに1000ダウンロード到達できれば嬉しい。

今後の妄想
Amazonのアプリストア進出
・pixivのアプリストア進出
・即売会に進出
コミケに進出
カジュアルゲームフレームワークの完成
カジュアルゲーム・マネタイズシステムの完成
Googleから初の売り上げ振り込み。
・モチーフ変えて3ゲームくらいリリース。
・年内に合計1万ダウンロード突破

カジュアルゲームのプレイ回数データ

空飛ぶしまむらくん、なんと数日で1000回近くプレイして頂いてる方がいることが判明!

1プレイ平均30秒だとすると、なんと8時間もプレイして頂いてます。

カジュアルゲームプレイヤーの方って、実はコアゲームプレイヤーよりも熱意が高いんじゃ。。