エモンのブログ(スマホアプリ作成日記) -18ページ目

エモンのブログ(スマホアプリ作成日記)

エモンのブログです。

GooglePlayとAppStoreにアプリをリリースしてます。
「詰将棋パラダイス」4500問無料で公開。
「みんなのしょうぎ」投票型の将棋対局。いずれもソーシャルアプリなので、ソーシャルゲーム作成に興味があるかたは是非ご覧ください。

Adobe AIRを使ってスマホアプリを作ってます。半年前に起きた異変について書いておきます。
Android端末にて実機検証していて、自分は問題なくタップイベントを発生させていたのですが、
他人にプレイしてもらっているときに、どうもタップイベントが起きてないようなそんな動きをしていました。
そのときは、この人がスマホに慣れていないからなどという楽観視をしていたんですが、他の人にもテストプレイしていたところ、どうも同じような症状になるんですよね。
5人のうち3人がタップイベントをうまく発生できてませんでした。

こりゃあまずいってことで考えたのが、タップではなくタッチ開始イベントにしたらどうか。ってことです。
TAPではなくTOUCH_BEGINで判定するってことですね。
タップっていうのは、タッチスクリーンに一旦触れてから離れるまでの動作を指します。なので単純にタッチするよりもやや発生確率が下がるんですね。
PCで検証する際はマウスクリックではなく、マウスダウンにします。

PCと端末の違いを吸収するためのコードが以下です。
ドキュメントクラスでの記述
if(Multitouch.supportsTouchEvents) {
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
} else {
Multitouch.inputMode = MultitouchInputMode.NONE;
}

これはドキュメントクラスのコンストラクタに記述して必ず実行されるようにしときます。
これでAndroid端末ではタッチポイントモードになり、PCならばマウスモード?になります。

ボタンなどでの記述
if(Multitouch.supportsTouchEvents) {
this.addEventListener(TouchEvent.TOUCH_BEGIN, onBtnClick);
} else {
this.addEventListener( MouseEvent.MOUSE_DOWN, onBtnClick );
}

function onBtnClick( e:Event ):void{
//ボタン押下時処理
}

端末ではTOUCH_BEGINにします。これでPCと実機とで同じ動作になります。
この状況下で再び同じ人物にテストを頼んだところ、今度はタッチイベントがうまくいかないということはなく、大丈夫でした。
やっぱり色々な人にテストをしてもらうのがよいですなあ。

実際に作ったのが下です。


「山川悟の詰将棋」はスマートフォン用詰将棋アプリです。
Android端末(google play)⇒  iOS端末(app store)⇒
Technology By: Adobe AIR
エアホッケーゲームを作りました。壁にボールやパックがぶつかったら跳ね返るという、いたって昔からある古典ゲームです。ゲーム作成の基本ですね。どんなゲームかというと、まずはこちらの動画をご覧下さい。



パックの動作

ボールというかエアホッケーなので以下パックと表現します。
MovieClipの中にメンバ変数(フィールドとかプロパティとか言ったりする)にXとYそれぞれの変化量を示す変数を持たせておきます。
以下それぞれdy, dyとします。
単位時間にパックのX、Yがdx, dyだけ増加するようにします。するとパックが与えられた速度によって動作するわけですね。
なお蛇足ですがなぜ「d」なのかというとデルタって意味だと思います。


パックが壁にぶつかった時の処理

右端と左端に壁があるので、あたったら跳ねかえって欲しいわけです。方法としては、dxが-1倍すればよいです。
なんの条件もなく-1倍するとパックがブルブル震える変な動きが出てしまうことがあるので、右端、左端両方それぞれの処理を書いたほうがいいでしょう。
右端の壁にぶつかったらdxは負であり、左端の壁にぶつかったらdxは正になる。ここも条件に加えると良いでしょう。

マレットにぶつかる処理

今回のゲームでは、マレット(自機)にぶつかったときに色々な角度で跳ねて欲しいと思いつつも、ユーザ任意の角度に跳ねてほしかったので
マレットを正円にしました。これで色々な角度への跳ね返りが実現できます。


当たり判定ロジック

パックがマレットに当たったかどうかの判定は、パックの中心点とマレットの中心点の距離がマレットの半径+パックの半径以内であること。
さらに、直前のパックとマレットの距離も測って保持しておいて、その距離よりも近いことも当たり判定の条件につけておきます。
するとマレットにあたったときにブルブル震える現象がなくなります。


当たり後のパックの動作

パックのdx, dyはパックの中心点とマレットの中心点をつなぐ直線のベクトルを距離で割ります。単位ベクトルが取得できるので、ここから必殺技やパワーによって、この単位ベクトルにスカラを乗算すればいいですね。


相手(CPU)の動作

難易度によって色々変えて行きたいところですが、今回は未来予測する動きを実装しましょう。
未来予測というと複雑な計算をしなければならないように思いますが、そんなことはなく、透明で通常のパックよりも早く動作するMoveClipを作れば話は簡単なのです。
このMCをエピタフと名付けましょう。エピタフってなに?という方は JOJO エピタフで検索しましょう。
相手はこのエピタフを見て目標地点のX軸へ向かって動作すれば、まるで未来予知したかのように見えます。


「デコポニテの魔女エアホッケー編」コンピュータとの対戦型エアホッケーゲームです。
Android端末(google play)⇒  iOS端末(app store)⇒
Technology By: Adobe AIR
Unix系ならrsyncコマンドがありますが、windowsはどうでしょうか。xcopyがそれに近いですね。
最近迫られた課題は以下のとおりです。
(1)old_dirからnew_dirへコピーするが、ディレクトリ構成そのままにsyncしたい
(2)コピーする際に更新日付を見て新しいなら上書きしたい
(3)SVNディレクトリなので.svnはコピーしたくない
(4)画像ディレクトリが膨大すぎるので、それも見たくない※.gif, .png, .jpg
(5)面倒なので上書きするかどうかを聞かない

上記の条件を満たすコマンドはこれ
xcopy old_dir new_dir /D /E /I /Q /Y /EXCLUDE:xcopy-excludelist.txt

そしてコピーする際に、除外対象となるファイルを/EXCLUDEオプションで指定しますが、これはその条件が書かれたテキストファイルのパスを指定します。
同じ階層にxcopy-excludelist.txtを作ってその中に以下のように書いておきます。
.svn
.log
.jpg
.png
.gif



「がもうのの詰将棋」はスマートフォン用詰将棋アプリです。
Android端末(google play)⇒  iOS端末(app store)⇒
Technology By: Adobe AIR