30歳から始めたプログラミング -11ページ目

「タップスポット」アップル審査終了です!

久しぶりのアプリリリースで色々と手間取ってしまいましたがようやくアップルの審査終了しました。

 

審査自体はかなりスピーディーになっていて驚きました。しかしながらその分厳しい審査でした。

 

 

★審査による今回の指摘

ープレゼントの内容について詳細な説明を要求

ー利用規約(EULA)の追加とユーザーに条件について同意させる仕組みの導入

ー不快コンテンツや不快ユーザーの一般ユーザーによるブロッキング機能の追加

ーユーザーコンテンツの厳正な管理

 

 

タップスポットはユーザーが写真等を投稿できるので一般的なゲームアプリよりも厳正な運営が求められるようで、仕組みや法的にガチガチにする必要があるようです。個人的にはどうせ誰も投稿どころかダウンロードもされないって(笑)と思っていてもアップル側には責任がありますから仕方ないですよね。

 

とても勉強になりましたし、デザインをなるべく壊さないようにブロック機能を追加する作業はちょっと楽しかったです。

 

今回の審査担当の人がなんだかフレンドリーというか人間味がある人だったのが新鮮で気持ちよかったです。前にリリースしたアプリのときはぶっきらぼうで冷淡なイメージだったので・・・。

 

審査の人に

 

Thank you

 

とか言われたの初めてかもしれません。

 

 

いつも「Information Needed」レビュー番号ー内容みたいなボットのようなメールばかりだったので・・・。

 

 

何はともあれ水曜日の16時にリリースします!

興味がある方は公序良俗を守って遊んでみてくださいね!

 

次のアプリ脱出サスペンスその2もそこそこいい感じです。

こちらもお楽しみに!

 

 

 

スイフト(swift)で効率的にアニメーションを表現する方法?

とりあえず自分の中で結論が出たのでメモしておきます。

 

 

スイフトと言うかアップル製の言語ではゲームで使えそうなアニメーションを作るときはanimateKeyframesWithDurationとその中で使うaddKeyframeWithRelativeStartTimeを利用するのが良いでしょう。

 

これらはキーフレームアニメーションと言って指定した時間内で時間を分割し、順番に連続したアニメーションを動かすことが出来ます。

 

他のアニメーションは1つの動作しか行えないため状況によっては扱い難かったのでキーフレームを選びました

 

基本の形は以下の様な感じ

 

let duration = 10.0 //全体を通した時間(NSTimeInterval型)

let delay = 0.0 //遅延時間(NSTimeInterval型)

let options = .CalculationModeLinear //オプション、いろんなオプションがある

 

UIView.animateKeyframesWithDuration(duration, delay: delay, options: options, animations: {

            UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 1/10, animations: {

                //0秒から1/10秒(つまり1秒)かけてビューの透明度を1にする

                somethingView.alpha = 1

            })

            UIView.addKeyframeWithRelativeStartTime(1/10, relativeDuration: 5/10, animations: {

               //1/10(つまり1秒目)から5/10秒(つまり5秒)間何もしない

            })

            UIView.addKeyframeWithRelativeStartTime(6/10, relativeDuration: 4/10, animations: {

                //6/10秒(つまり6秒目)から4/10秒(つまり4秒)かけてビューの透明度を0にする

                somethingView.alpha = 0

            })

            }, completion: { finished in

                // 最後に実行する処理

                somethingView.removeFromSuperview() //ビューを削除する

            }

 )

 

上記のように記述すれば連続したアニメーションを順に実行することが出来ます。しかしながら透明度の変更、回転、移動以外は出来ないようで音を鳴らす処理だとかテキストを変更する処理を間に挟んでも無視されすべて0秒目から実行されてしまいます。

 

そこでなにかよい方法は無いかと思い考えたところマルチスレッド機能を使って意図的に遅延実行させてみることにしました

 

具体的には以下のように

 

var seconds: Double = 5

var dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))

dispatch_after(dispatchTime, dispatch_get_main_queue(), {

     //5秒目に行う処理(例えば音を鳴らす処理などを追加する)※コードは割愛

})

seconds = 10

dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))

dispatch_after(dispatchTime, dispatch_get_main_queue(), {

     //10秒目に行う処理(例えばテキストの表示内容を変更する)※コードは割愛

})

 

 

こんな形でコードを書けばアニメーションに合わせてテキストを変更したり、音を鳴らしたりといった表現ができるようになります。ただもしかして微妙に同期がずれて音再生等の処理がズレてしまうかもしれないのでまだまだ改善の余地があるかもしれません。

 

ちなみに私の作った1作目の脱出ゲームの冒頭アニメーションはsleep()とアニメーションと音声再生を組み合わせて作っています。こちらは1つずつ処理を実行するので同期がずれること(音ズレやテキスト変更ズレ)は無いように感じますが全然スマートさが感じられません。

 

しかしスイフト、もう少しなんかなぁ

 

Optional型とかアンラップとか

スイフトの不満を今日も書いていきます!おそらく次のアプリが完成するまで備忘録を兼ねて更新頻度上がるかもしれません

 

さて昨日はアニメーションを効率的に書く方法を試行錯誤してました。その際、時間を測りたかったのでNSTimer(これもセレクタで指定なので不便)を使ってアニメーション処理中の経過時間を表示する仕組みを作ろうとしていたのですが、ここでハマりました。

 

ラベルのテキスト(label.text)を数値型に変換しなければならないのですが、これがとてつもなく厄介でした

 

objective-cなら

 

 

(int)[label.text integerValue]

 

 

と書けば問答無用でラベルのテキストを数値型(int)に変換してくれるにもかかわらずスイフトの場合はOptional型をアンラップしなければ計算も出来ず数値にも変換されませんでした。しかも自分の環境はswift1.1でweb上によくあるswift2.0以降のメソッドは使えないため余計にこんがらがってしまいました。

 

結局

 

 

var stringNumber:String = label.text! //アンラップ

var numberFromString = stringNumber.toInt()! //アンラップ

 

 

こんな感じにすることによってもともとOptional型のlabel.textをアンラップすることによって普通の数値として扱うことが出来ました

 

ところでOptional型やアンラップってなんですか?何回説明読んでもなんのためにあるのかわからないのですが。なんでnilやNullを認めちゃダメなの?それからletって必要ですか?varだけで良くない?ジャバスクリプトが恋しい

 

 

アニメーションの効率的(っぽい)書き方についてはまた今度にします。Cocos2DやUnityはあえて使ってません。Unityは次の次の次のアプリくらいから使う予定です。

 

 

 

(追記)

UIViewのframe指定用の数値がただのfloatでは受け付けなくなってる!CGFloat型にしないとうまく処理されませんでした。Objective-cから退化してませんか?それは流石に言いすぎか。

 

(追記2)

ー Optional型 ー 

nilを受け付けることができる型

計算とか変換とか出来ない処理が多い

ラップされた状態

「?」はOptional型を表す

 

ー アンラップ ー

Optional型を取り除くこと「!」とかが有名

変換や計算もできるようになる

nilは受け付けない(nilは0扱いでいいのに…)

 

ー let ー

定数

なぜかswiftでは良く目にする

#defineより使いにくく厳格且つ気軽

 

 

swiftでも同じなのか・・・?jQueryのselectorはあんなに便利なのに・・・

次のアプリはスイフトを使って開発しようと思っていたので現在コツコツ調べているのですが、どうやらやっぱりボタンはセレクターを使う方法から変わってないようですね。

 

アップルの言語(Objective-cとswift)ではボタンを押した時の処理にセレクターという仕組みを使うのですがこれが非常に使いにくいです。

 

別の言語(ジャバスクリプト、VisualC#、VB)ではボタンを押すときに変数(引数)を普通の関数と同じように渡すことができるのですがなぜかアップルの言語はそれが出来ないんですよね。

 

アップルはリストを作ってそれぞれにボタンを割り振りたい時一つ一つ毎にメソッドを書くことを想定しているのでしょうか?それとも各ボタンの処理の振り分けはタグを使うことを前提にしているのでしょうか?

 

かなり新しい言語ということで期待していたのですがジャバスクリプトの足元にも及ばない古い設計のようで非常に落胆しています。ボタン押したらメソッド実行!が最もシンプルなのに・・・

 

もしかしたら解決方法があるのかもしれませんが検索してすぐ出てこない時点で諦めています。誰か知恵をください。スタックオーバーフローにも公式ドキュメントでも見つけられなかったから無理か。はー

 

 

 

 

新作アプリ「タップスポット」まもなく完成しそうです

本来3ヶ月〜6ヶ月程度で完成予定だったアイフォンアプリ4作目の「タップスポットが」ようやく陽の目を見られそうです。

 

これは写真の一部を見つけてタップするだけの簡単なゲームです。それだけでは味気ないのでなるべく綺麗な画像と音楽を厳選してみました。更にユーザー保有の画像をアップロードしてユーザーが問題を作成したり、他ユーザーの投稿問題をプレイすることも出来ます。

 

別アプリで加工した写真などをゲームとして投稿するなんて遊び方も面白いのでは無いかと思っています。

 

イメージとしてはweb上にあるような投稿サイトとアプリゲームを融合させたようなものです。

 

今回は挑戦的にいろいろな機能を盛り込んでみました。都合により割愛した機能も多少ありますが予定していた機能の大半を盛り込むことが出来たのでひとまずは満足です。

 

 

  デザインについては個人的に納得いっていませんが、システム的には編集可能なお知らせ機能やプレゼント機能、双方向でメッセージを送れるお問い合わせ機能、投稿画像の簡易編集機能やポイント制プレイ機能、ゲームバランス調整等色々な経験が積めて楽しい開発でした。

 

最後のバランス調整が終われば晴れてアップルに申請を行いますので興味を持って頂けた方はもうしばらくお待ち下さい。

 

そして次はようやく脱出サスペンスその2、その3の開発を開始する予定です。さあ頑張るぞ!