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

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

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

1か月でアプリダウンロード数表記が、1万になりました。

Android単体で、5000~1万DL表記に切り替わりました。1日数DLの3年越しとかではなく、1か月で到達したのでありがたいです。しかし次は閑話休題的な謎アプリなので、落差でショック死しないようにせねばw 自己満謎アプリなのに日数かかってしまい、なおショック死の模様ですが、日々がんばります。

f:id:hisashi_vc:20150612102555p:plain


達成したゲームアプリ

放置系モナータップRPG - Google Play の Android アプリ

iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 放置系モナータップRPG


そういえば高いノーパソ買ったのに、HD容量がやたら低いのがバレるとショック死しそうなので、64GBのSDメモリーカードをアキバのヨドバシで買ってドーピングしたんですが、Amazonみたら同じ値段で128GBが変えるのに気づき、ショック死乱舞の毎日ですw てか128GBのメモリーカードが普通の値段(数千円)で売ってるのか。。昔を考えると凄過ぎる。

www.amazon.co.jp

自転車を買いました&欲しいスーパー自転車アイテム

引き出物の自転車(無料)がバグってきたので、クロスバイク買いました。

2万円台中盤で、12キロ代で、サスペンション付きで、秋葉で乗ってても恥ずかしくない黒ベース+レッドピンク。前の半端な折り畳み自転車より断然速くなりました。軽いので漕ぎ出しも良好。

これでミニマライズ(なるべく金使わない)ライフがはかどります。デスクワークばかりなので、運動自体ありがたいです。何より自転車漕いだ日は、よく眠れるようになりましたw

Amazon.co.jp | DREADNOUGHT(ドレッドノート)DN8001 (ブラック×オレンジ) サスペンション&シマノ7段変速 700C軽量アルミフレーム クロスバイク自転車 コイルロック+LEDライト付き | スポーツ&アウトドア 通販


自転車に乗り出したら、欲しいグッズが山盛りなことに気づいたので紹介。

▼これはなんと100g以下のサドルです!フルカーボンで3000円とか安すぎる。カーボンなんて、F1マシンと戦闘機のイメージしかなかった。しかも高弾性と、神仕様。アプリ当たったら欲しい。。

Amazon.co.jp | 超軽量 98g 高弾性 フル カーボン シート サドル レール ロングベースサドル ロードレース | スポーツ&アウトドア 通販


▼これは椅子自体をサスペンション化する夢サドル棒です。アルミ合金製なので軽いのも魅力。切れ痔や前立腺肥大も怖くないw

Amazon.co.jp | DOPPELGANGER(ドッペルギャンガー) ハイブリッドサスペンションシートポスト DSP095-BK ブラック φ27.2×350mm プリロード調整 アルミ合金製 | スポーツ&アウトドア 通販


▼これは軽くて回転力もあるアルミペダル。超足回りなので、効果も期待できます。足回り重要性の例えで凄くわかりやすかったのが、1キロの靴が100グラムになったら、超足早くなるという説明。 1000円代なので買い易いのも魅力。

Amazon.co.jp | MKS(三ヶ島) アイシーライト [IC-LITE] ペダル ブラック | スポーツ&アウトドア 通販


高価な自転車はさすがに買いづらいですが、パーツ別なら超高価級のアイテムでも買い易いですね。まるでRPGの装備品みたいな感じ。アプリが当たったら買おうw




最近つくったゲームアプリ

放置系モナータップRPG - Google Play の Android アプリ

iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 放置系モナータップRPG

アプリ開発で、ユーザーからデータ復旧を求められた場合 サンプルソース

アプリを開発していると、課金や障害や端末事情で、ユーザーからデータ復旧を求められる場合があります。データが破損した場合も。

ソシャゲならサーバーデータ変更して終了かもしれませんが、普通のアプリはユーザーの端末内にセーブデータなどを保存しているので、ますますどうしようもない感じがします。

その状況を打破すべく、フロントエンド(ActionScript)と、サーバーサイド(PHP)のサンプルプログラム&キャプチャを公開しましたのでどうぞ~。データファイルはuid(ユーザーごとに割り振るユニークID)と同じファイル名を、PHPと同じ階層においておけばOK。add:が先頭についてるデータはインクリメントの指定です。復旧が済めば自動でリネームされる(データファイル名がend~となる)ので、進行状況も一目瞭然。変数や関数は名前からなんとなく判断してくださいw 一応グローバル対応もしてます。 loadTxtはAPIにPOSTでアクセスしてるだけで、showDialogは英語のままですw 最後に再起動させてるのは、その方がデータ的に安全だからです。

これでほぼすべてのデータがどうにかなるので、課金処理エラーにも辟易しなくて済みます。

・・・しまった!こんなのばかり作ってしまって、肝心のゲームが足踏み状態にw

そういえば今日未明に、iOS9やらAppleの新しげな取り組みが発表されまくってましたね。AppleWatch入手できたらアプリ作ってみたいなあと思ってたら、もう本が発売されてるw

www.amazon.co.jp



▼データファイル サンプル UTF-8で保存する

add:mahouseki=100
userLv=99

▼フロントエンド サンプルコード

Btn(m.BtnRepair, onRepair);

function onRepair():void{

	//ローダー表示
	showLoader();
	
	var loaderTimer:Object = {};
	
	T(loaderTimer, { d:8, st:function():void{
		endLoader();
		showDialogNetworkError();
	}});
	
	//ここでAPI(repair.php)にアクセス
	
	var url:String = _DOMAIN+"api/repair/repair.php";
	
	loadTxt(url, onLoad, onError, { 
		uid : _uid
	});
	
	function onLoad(s:String):void{ trace("L45 onLoad s = " + s);
		RT(loaderTimer);
		endLoader();
		
		var s2:String = RemBlank(s);
		
		if(!s2 || s2.length <= 2){
			
			showDialog1(_isEnglish ? "No recovery data for now." : "現在復旧データはありません。");
			
		}else{
			
			showDialog2( _isEnglish ? "Do you want to recover the data?" : "データを復旧しますか?", onRecovery);
			
			function onRecovery():void{

				//リカバリー処理					
				var lineArray:Array = s.split(_LINE);
				for(var i:uint=0; i<lineArray.length; i++){

					var s3:String = lineArray[i];
				
					if(RemBlank(s3)){
						
						var key:String = s3.split("=")[0];
						var value:Object = s3.substr(key.length+1);
						
						if(key.substr(0, 4) == "add:"){
							//インクリメントの処理
							key = key.substr(4);//4);
							addLocal(key, value);								
						}else{
							saveLocal(key, value);								
						}
					}
				}
				
				flushLocal();
				
				showDialog1( _isEnglish ? 
					"Done!\nApp is automatically terminated.\nPlease restart app.\nSorry to trouble you." : 
					"データを復旧しました!\nアプリを自動的に終了します。\nお手数ですがアプリを再起動してください。", onReboot, onReboot);
				
				//データ終了通知の送信
				loadTxt(url, function():void{}, null, { 
					uid : _uid, 
					isEnd:true
				});
				
				function onReboot():void{
					NativeApplication.nativeApplication.exit();
				}
			}
		}
	}
	
	function onError():void{ trace("L49 onError");
		RT(loaderTimer);
		endLoader();
		showDialogNetworkError();
	}
}

▼サーバーサイド repair.php サンプルコード

<?php
mb_internal_encoding('UTF-8');
$ua = $_SERVER['HTTP_USER_AGENT']; 

//if(!strstr($ua, 'AdobeAIR') && !strstr($ua, 'Shockwave Flash')){ return; }
//if(isset($_POST["devType"])){

//復旧用データとなるテキストをロードして表示する。
if(isset($_POST["uid"])){
	
	//レストアファイル存在チェック
	if(!file_exists($_POST["uid"])){

		//存在しなければ、何も返さない
	}else{
		//存在していればロード
		echo file_get_contents($_POST["uid"]);
		
		if(isset($_POST["isEnd"]) && $_POST["isEnd"]==true){ //復旧完了時の処理
			//ファイル名変更 end.~
			rename($_POST["uid"], "end".$_POST["uid"]);
		}
	}
}

?>

▼画面キャプチャ
f:id:hisashi_vc:20150609203856p:plain



最近つくったゲームアプリ

放置系モナータップRPG - Google Play の Android アプリ

iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 放置系モナータップRPG

釣りゲーのアイコンを作成しました。

本当はモナーが釣られる側なんですが、まあいいかw
これを釣竿と言い張る勇気が欲しい。

f:id:hisashi_vc:20150609154018p:plain


毎回やっつけなので、そろそろアイコン作成の勉強もせねば~

www.amazon.co.jp



最近つくったゲームアプリ

放置系モナータップRPG - Google Play の Android アプリ

iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 放置系モナータップRPG

成功する人と、しない人の違い

まだまだ成功までの道のりは長いですが、今まで色んな人や会社を見てきて、「成功する人としない人」の違いは、これしかないなあと思いました。


『確立の高いこと』を『やり続けている』


逆にしない人は、確立の低いことをやっているか、すぐやめてしまうかのどちらか(自分の反省も踏まえつつ・・w)。『やり続ける』が前提のロジックなので、目先の結果に一喜一憂してしまう波も、少しは減らせます。

というわけで、現在の手持ちカードで、なるべく確立の高い成果物を、出し続けようと思います~。
松下幸之助でも読んで、さらに確立を高めよう。

道をひらく



今日のアプリ開発は、ショップやクエストUIと、そのロジックを地道に作成。作業中にウケそうなゲームアプリを思いついたけど、まずは着手中のアプリを世に出して、ショックを受けてからw


f:id:hisashi_vc:20150608190712p:plain


ご利益ねらい自作アプリリンク

放置系モナータップRPG - Google Play の Android アプリ

iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 放置系モナータップRPG

個人アプリでMAU1万5千人到達しました

いわゆる月間アクティブユニークユーザー数です。
また日々こつこつ積み重ねよう~。

f:id:hisashi_vc:20150608003800p:plain

ユーザー数に貢献したゲームアプリ

全然関係ないけど、なでなで萌えスマフォアプリゲームCMの2人目が可愛い過ぎる('A`*)ナデナーデーナーデー♪

作ったゲームをプレイしあうことで、初めて気づいた落とし穴 ~オリジナルゲームを作るべきか~

友人のゲームが完成しそうなので、テストプレイさせてもらいました。

そして、「ここ強すぎてすぐ死ぬ~」とか、「攻撃タイミングがわからない」とか、普通のプレイ感想を述べました。

ところが友人は、「え、なんでそこでそう動くの?」「マジで、その動作伝わらないの?!」「あ~、そう動いちゃうのか~~」と、相当意外そうでした。

プレイヤーである自分としては、誰もが言いそうな、素直な第一感想を述べたまでだったので、作り手サイドの反応が謎だったんですが、今度は立場を逆にして、自分の作りかけアプリをいじってもらったところ。。

ええええー!

なぜそんな操作をするんだ!、なぜそこでそうしないんだ!!

・・・そうです、立場が逆転した途端、自分も同じ反応をしてしまったのです。自分の脳内では、ユーザーは当然こう操作するだろう、これは見ればわかるだろう、というのが、まったく通用しなかったのです。ちなみにシンプルなカジュアルゲームでした。自分の親の世代が謎操作するというのならまだしも、自分とおなじ世代の、ゲームやアプリを少なからず体験しているプレイヤーが想定外の操作をしたので、自分の未熟さを痛感しましたw とくにオリジナルルールのゲームだったので、なおさらです。

思い出されたのが、ニコニコ動画と角川の会長の、川上量生が新しく出した本「コンテンツの秘密 ぼくがジブリで考えたこと」の記者会見か何かで、「コンテンツはもうだいぶ前からネタが出尽くされていて、特にゲーム何かほとんど出尽くされてます」とか、SEGAの仕事やってたくらいの説得力で述べてたので、ゲームのルールはゼロから考えようとせず、既存ジャンルの進化前提で考えた方が、ユーザーに混乱を招かずよさそうですね。。

www.amazon.co.jp

アプリ広告のプロから聞いた、バナー収益最大化のコツと落とし穴

①アイコン系バナーは複数並べた表示がデフォルトだが、実はそれだと博打化するという落とし穴がある。つまり単価の低いアイコンバナーが混ざってしまい、それが押されてしまう可能性が出る。なので、アイコン1個か、少なめに表示するのがコツ。

②アイコンバナー文化は日本以外では存在しないに等しいので、海外展開時には要注意

③それに比べて、フッターバナーや大き目のバナー(レクタングル)は、広告のパイが大きくて在庫が安定している上に単価も高いのでお勧め。

Androidの戻るボタン押下時の大バナーは、ある意味当然クリック率が高いのでお勧め。

⑤単体サービスでのバナーより、広告ネットワークのバナーは2割くらいオークションになる。その結果、2割くらいは単体サービスのバナーより収益があがるのでお勧め。

⑤WebViewバナーとSDKバナーの差はほぼ無いが、WebViewだと動画視聴広告とかはまだ難しいかも。逆に謎のリジェクトはされ難い。

⑥広告ネタじゃないけど、アジア圏は猫アプリ強し。

「無料アプリ×広告」成功する24の法則

Smartphone Ads iPhone・Androidアプリへの広告の実装と管理テクニック

恐怖!自作アプリがある日突然全部動かなくなる現象と、その対処法

ある朝目覚めたら、iPhoneで自作の全アプリが動かなくなってました!
厳密にいうと、起動はするけどあきらかに画面がバグってて、ほとんどのボタンも押せない状態。

最初はサーバーエラーかと思ったんですが、同じサーバーを参照しているAndroid版は動いています。

デバッグツールAdobe Scoutでログを見て判明!、iPhone端末の容量がゼロのため、ローカル保存でエラーになってました。iPhoneは端末によっては結構容量シビアなので、ユーザーサイドでも時々人知れず発生してそうでおそろしい。。というかそんなエラー連絡きてました。。gkbr

下記がそのときのExceptionと、それに対応したASのコードです

## [Tweener] Error: [object Object] raised an error while executing the 'onStart'handler. 
Error: Error #2130
	at Error$/throwError()
	at flash.net::SharedObject/flush()
	at MonaRPG_fla::MainTimeline/saveLocal()
	at MonaRPG_fla::MainTimeline/sendRanking()
	at MonaRPG_fla::MainTimeline/nextEnemy()
	at MethodInfo-782()
	at MonaRPG_fla::MainTimeline/initCharas()
	at MonaRPG_fla::MainTimeline/initGame()
	at MonaRPG_fla::MainTimeline/init2()
	at MethodInfo-487()
	at Function/http://adobe.com/AS3/2006/builtin::apply()
	at caurina.transitions::Tweener$/updateTweenByIndex()
	at caurina.transitions::Tweener$/updateTweens()
	at caurina.transitions::Tweener$/onEnterFrame()
	function flushLocal():String{
		var s:String;

		try{
			s = _so.flush();
		}catch(e){
			showDialog1(_isEnglish ? "Low capacity\nFor example, please remove unnecessary app's,\nmove photo's another place.\nand plz reboot" : "端末の容量が不足しています!\n不要なアプリや写真を削除したり、\n移動したりした後、\n再起動してください。");
			trace("L88  _so.flush  e="+e);
		}
		
		return s;
	}

f:id:hisashi_vc:20150603105231p:plain

釣りゲー開発中、MAUが1万2千人超え、「彼女は最後にそう言った」について

自作アプリのMAUが1万2千人超えてアクエリオンレベルになったきました。ああ、あれは1億2千か、先は長しw。そして過去作のオタサーの姫に、昨日ニュースになってたオタサーの姫ゲーと勘違いした人が流れてきていますw 色々出しておくと、ひょんなことで得しますね。

f:id:hisashi_vc:20150602101547p:plain

釣りゲーも半分くらいはできてきたかな~。ヒット&吊り上げのロジックとモーション進行中です。今回はクエストも作って、ゲームの寿命の伸ばしたいなあ。簡易超展開ストーリもつけて、さらに寿命伸ばしたい。


そういえば話題のアプリ、「彼女は最後にそう言った」を30分くらいやりました。ドラクエあの花ひぐらしだね~と、ドヤ顔で言いたいですが、もうちょいプレイしてみます。しかしドラクエの町の人全員に話して記憶して進める系ストーリーなので、学生以外だと少ししんどいかも。アプリは気軽にやりたい。。何にしても今回の大成功で、このジャンル増えそうですね。「RPGノベル系」とでもなるのかな~。

今日は秋葉でパシりをしたけど売り切れてたので、ベローチェで飽きてきたコーヒーフロートをすすりながら作業した後、秋葉→御徒町→上野→湯島→東大前→東京ドーム→水道橋まで歩きましたw

今日のキャプチャ。動いてないんでわかりづらいですが、バトルしてるところ。気泡もでますw

f:id:hisashi_vc:20150602101816p:plain

今回のケイブ事件 裏話

あれ、この人、以前ゲーム発注MTGした人じゃ。。
スケジュールの都合で受けなかったけど、受けていたら重要参考人に。。('A`)ヒッ!
具体的に何で2900万円使ったのか開示してほしいw

blog.esuteru.com

開発近況5/30(土)

あ…ありのまま 今 起こった事を話すぜ!

「おれは 『タワーディフェンス』ゲームを作っていたと
思ったら いつのまにか『釣りゲー』になっていた」

な… 何を言っているのか わからねーと思うが 

おれも 何をされたのか わからなかった…

頭がどうにかなりそうだった… 催眠術だとか超スピードだとか

そんなチャチなもんじゃあ 断じてねえ

もっと恐ろしいものの片鱗を 味わったぜ…

f:id:hisashi_vc:20150531052321p:plain

人を感動させるストーリーパターン1 『ラーの鏡パターン』

全然アプリ関係ないですが、先日ラブライブを見て感動した瞬間が、劇団四季のライオンキングと同じだったことに気づきました。

①ライオンキングの場合…心折れた主人公が、井戸か何かを覗き込んだとき、死んだ父の面影が表れて、そいつに励まされ、素直な心(勇気)を取り戻した。

②ラブライブの場合…強がってる希が紅茶を覗き込んだら、覗き込んだ自分の姿が、幼い頃の本心の自分の顔になり、そいつに励まされ、素直な心(勇気)を取り戻した。

一般化すると、

①キャラクターの心が折れる
②水を覗いて自分が移る
③そいつが似てるだれかに変身する
④そいつに励まされる
⑤成長する(素直になる、勇気を取り戻す)

名付けて、「ラーの鏡パターン」

感動の山場に悩んだらどうぞw

アプリバナー収益を、実は下げてる落とし穴

アプリバナーはインタースティシャルにしても、アプリやめられない程度に表示しまくり、次のバナーを表示しまくりの方が良いと思いこんでました。

しかし考えてみたら、ここぞというときに表示しないと、だんだんバナー単価のショボい広告しかでなくなるから、思ったよりタイミングが重要な気がしてきた。特に放置系アプリの場合は長丁場なので、どんどん広告単価の低いバナー化してしまうので、なおさら。クリック数がそこそこ増えたところで、バナー単価が雑魚る方がやばそう;


AdMobが視聴課金動画バナーに対応してくれれば解決するんですが・・w

どんなキャプチャのゲームが売れるのか

いつも数値ばかりのせているのは、個人の感覚値をほぼ信用していないのと、数値に至った技を盗まれたくないからですがw、今日は1つだけ暴露します。

[ DL数が伸びるキャプチャの作り方 ]

たとえばスト2をアプリストアに出す場合、おそらくこんな感じのキャプチャにするでしょう。

・タイトル
・適当なステージ1
・適当なステージ2
・キャラ選択画面

しかしそれだとフワっとしてしまい、個人アプリはスルーされます。ではどんなキャプチャが今までDL数が伸びたかというと、

・キャラ1にむかってキャラ2がジャンプ大キック
・キャラ1が昇龍拳で撃退

こんな感じです。無声2コマ漫画に近いキャプチャを作ると、DL数が謎に伸びました。開発者がついついやりたくなる、ゲームの全体的なキャプチャとかいらないっぽいです。特に言語の通じない海外で強いと思います。この「事前・事後キャプチャ」をつかった、モナータップRPGとけん玉アプリが、いずれも海外でランクインしました(特にけん玉はクソゲーっぽいのにキャプチャだけでランクインw)

ああ、一切教えたくないのに教えてしまったw