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

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

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

11連ガチャを公開しました。

魔法石10個で11回できますw
また、上から下に書いてたプログラムがさすがに厳しくなってきたので、全体をクラス化しました。これで拡張や修正や使い回しがし易くなります。

あとはショップやマップや新ステージやフレンドランキングや服装アイテムやGPU処理最適化や分割ダウンロードや課金実装したいなあ。

f:id:hisashi_vc:20140530195926p:plain

ヘルプページの公開

ファンレター(?)が100通くらいきたので、ヘルプページというか、よくある質問の回答ページを作りはじめました。アプリからもWebViewで見れます。

http://hisapo.sakura.ne.jp/pazumona/page/help.php


作ってるゲームアプリ… http://goo.gl/knd4G8

エンタープライズ版のプロビジョニングファイルの罠回避法

iPhone開発するとき、社員が400人以上いる場合は、エンタープライズ版のprovisioningファイルを使うと便利です。
http://plus.vc/iphone/3355/

しかし最近クライアントから、ipa配布用のHTMLからアプリがダウンロードできなくなったという知らせが。。原因を調べたところ、iOS7.1にアップデートすると、https越しじゃないとダウンロードできなくなるようです。さくらインターネットの場合は下記設定ですぐhttps使えます。
http://support.sakura.ad.jp/manual/rs/web/ssl_shared.html

注意点としては、Download用のページのみならず、そのHTML内のhttp記述と、その先のplist内のhttp記述もみんなhttpsにする必要があるという点でした。

しかしエンタープライズ版のプロビジョニングファイル、ベンチャーやインディーズにも公開して欲しいなあ。


個人で作ってるゲームアプリ→ http://goo.gl/knd4G8

ゲームアプリプレイヤーの方の反応 アイコン作ってもらいました

ダイレクトメッセージやツイッターで日々感想を頂き、それを元に(糧に)パワーアップのPDCAサイクルになってきました。

申し訳ないほどありがたいことに、ツイッターの自分のアイコンにしてくれた女子高生の方も現れ、日々予想外の展開。
f:id:hisashi_vc:20140519110042j:plain

アプリ:http://goo.gl/knd4G8

ガチャUIを新たに開発開始

ユーザーからオーダーもあったので、ガチャを改めて開発開始
上の禿げ頭から出てくるのは、ノリで作ったけどボツ案wで、下のブタ貯金箱で完成目指す予定です。

f:id:hisashi_vc:20140509162323j:plain

f:id:hisashi_vc:20140509162332j:plain

https://itunes.apple.com/jp/app/kong-feibushimamurakun/id825465264
https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production

iPhoneアプリの審査スピードが速くなる裏ワザ

審査速度が速くなる裏ワザが判明しましたが、こういうのは知ってる人は知ってて、かつ人に話すわけにもいかないので、ネット上にも流れないのでしょう・・w
存在するという情報は共有できるのでメモ。

https://itunes.apple.com/jp/app/kong-feibushimamurakun/id825465264
https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production

毎日自動でPHPプログラムにPHPプログラムを書かせるようにしました。

PHP連想配列変数くらい、PHPに毎日自動で更新してもらうことにしましたw
デイリー過去ログランキングのリンクと、1位の名前の配列更新。

画面キャプチャと、役に立つか謎なプログラムはこんな感じです。includeするphpを自動で更新してます。自動イベント運用も夢じゃない!
f:id:hisashi_vc:20140508005035j:plain

include_once "rankerInfo.php";

$mod = filemtime("rankerInfo.php");
//print "最終更新日:".date("Y/m/d H:i",$mod);

$isYesterdayUpdate = date("d") != date("d", $mod);

//PHPファイルを更新する。
if($isYesterdayUpdate){
	function get_filename_arr($dir, $ext0){//$match) {
	    $filename_arr = array();
	    $dh = opendir($dir);
	    while(($filename = readdir($dh)) !== false) {
			$ext = substr($filename, strrpos($filename, '.') + 1);
	        if($ext === $ext0){
	            $filename_arr[] = $filename;
	        }
	    }
	    return $filename_arr;
	}

	$logNames = get_filename_arr(".", "log");

	$todayStr = date('y')."d".date('z').".log";
	$thisWeekStr = date('y')."x".date('W').".log";

	$dailyArrayStr = "";//14d122.log
	$weeklyArrayStr = "";//14x18.log

	for($i=0; $i < count($logNames); $i++){
		$fileName = $logNames[$i];
		if($todayStr !== $fileName && strpos($fileName, "d")){
			//ファイル名先頭から名前取得?
			//echo $fileName."@日間<br>";
			//ロード
			$fp = fopen($fileName, 'r');
			if ($fp){
			    if (flock($fp, LOCK_SH)){
					$rank1Name = fgets($fp);
					$rank1Name = substr($rank1Name, 0, strpos($rank1Name, "\t"));
			        flock($fp, LOCK_UN);
			    }else{
			        //print('ファイルロックに失敗しました');
			    }
			}
			fclose($fp);
			$dailyArrayStr = "'".str_replace(".log", "", $fileName)."'=>'".$rank1Name."',\n".$dailyArrayStr;

		}else if($thisWeekStr !== $fileName && strpos($fileName, "x")){
			//ファイル名先頭から名前取得?
			//echo $fileName."@週間<br>";
			//ロード
			$fp = fopen($fileName, 'r');
			if ($fp){
			    if (flock($fp, LOCK_SH)){
					$rank1Name = fgets($fp);
					$rank1Name = substr($rank1Name, 0, strpos($rank1Name, "\t"));
			        flock($fp, LOCK_UN);
			    }else{
			        //print('ファイルロックに失敗しました');
			    }
			}
			fclose($fp);
			$weeklyArrayStr = "'".str_replace(".log", "", $fileName)."'=>'".$rank1Name."',\n".$weeklyArrayStr;
		}
	}


	$phpTxt = "<?php\n".
		"\$dailyRank1Array = array(\n".
		$dailyArrayStr.//"	'14d125'=>'あんっー',\n".
		");\n".
		"\$weeklyRank1Array = array(\n".
		$weeklyArrayStr.//"	'14x18'=>'(ま゜ー゜さ)ノ'\n".
		");\n".
	"?>";

	//phpでまるごと保存
	file_put_contents("rankerInfo.php", $phpTxt);
}

https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production&0508

なぜかイベントが発生しない、サーバーエラーやnull系エラーはどうすれば良いか。

あたりまえかもしれませんが、下記で揉み消せましたw
拾えないネットワークエラーや、テスト時で埋め込みフォント(などのクラス)が存在しないエラーなどを静かにさせました。

try{
	//ここにエラー起きそうな処理を書く。
}catch(e:Object){
	trace("●エラー!e="+e);
}

https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production&0507n6

報酬配布機能を強化

魔法石以外にも、コインやアイテムを配布できるようにしました。
https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production&0507n5
f:id:hisashi_vc:20140507143853j:plain

カジュアルゲームでイベントを実現

初のイベントを開催しました。ウィークリーでイベント終了までのカウントダウンも実装。
無事終了し、成績上位者に報酬と賞状を配布しました(賞状はテスト用のデータのものです)
https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production&0507n4
f:id:hisashi_vc:20140507143736j:plainf:id:hisashi_vc:20140507143743j:plain

自動アップデート機能を搭載

限界ギリギリまで、サーバー側で随時更新できるようにしました。
アプリ自体のファイル、ローカルファイル、キャッシュファイル、サーバー側ファイルで場合分けしてやり取り。

iPhoneは審査通るかな~

https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production&0507n3

サーバー側のセキュリティ強化

そろそろユーザーデータが蓄積されてきたので、サーバー側のセキュリティを強化しました。
PHPのファイル数、そろそろ2ケタの大台に乗るかなw

https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production&0507n2

殿堂ランキング(日々の過去ログ)を搭載

ひさびさの更新ですんません。日々少しづつアップデートしてますー。
これで日々のランキング上位者の名前が消えずに、永久の歴史に残るようになりましたw
https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production&0507
f:id:hisashi_vc:20140507142542j:plain