iOS 〜Mapの利用〜

こんにちは、本日はiOS8で「Map」の利用を行いました。 ここで問題が起きまして、 普通にマップ自体は表示できるのですが、 マップである地点をフォローボタンで現在地として設定したところ、 そのボタンを押すとエラーが出て、 その場所を表示できないのです。 このようなエラーメッセージが出てしまいました。 今利用している書籍はiOS7に対応しているもので、 iOS8から位置情報の取得の仕方が変わったらしいのです。 iOS7までがこの2パターンだったのに対し
  • 常に許可
  • 許可しない
iOS8では
  • 使用中のみ許可
  • 常に許可
  • 許可しない
の3パターンになってしまいました。 ということで、どうやれば位置情報を取得して 許可できるのかというと スクリーンショット 2015-02-04 16.03.12 画像の左にあるプロジェクトナビゲータのinfo.plistを開いて スクリーンショット 2015-02-04 16.04.01 赤く囲んである2つ追加します。 これらは、位置情報を常に許可するものとアプリを使用中のみ許可するものになります。 これを入れる事で、 デバイスの「プライバシー」>「位置情報」で取得できるようになります。 しかし、この状態だと、 わざわざ、設定の変更をしなければならないので、 Objective-Cのコード入力で位置情報が許可されているかどうかを確認して 許可されていなければ、常に許可や使用中のみ許可にすることが出来るようなのです。 しかし、色々試してみたのですが、どうもうまくいかなかったので、 今回は諦めてObjective-Cの知識がもっと付いた時にしっかりと理解しながら そのコードを書いて設定していきたいと思います。 因に今回書いたコードはこちらです。 左下に設定した位置情報のポイントに移動して、 右下は経度、緯度をブックマークした地点に移動します。 スクリーンショット 2015-02-04 16.20.33スクリーンショット 2015-02-04 16.21.30スクリーンショット 2015-02-04 16.21.40 (左:起動後のページ、中央:「Follow」でフォローした場所、右:ブックマークした場所) また今回の事については調べていきたいと思います。 以上うさでした。
blog 2015-02-02 16.07.57

Androidアプリゲームを制作

こんにちは!よしときです。 今日はAndroidの勉強のまとめとして二つの簡単なゲームを作りました。 まず一つ目が横スクロール型のアクションゲームです。 操作はタッチするとジャンプをするだけで、穴に落ちたりブロックに当たらないように進んでいくもので、当たり判定もステージも稚拙ですが、なんとか動作することができました blog 2015-02-02 16.07.57 使った画像は適当に拾ってきた物なのでアレですが、なにより実際に作って動いたってことが嬉しいですね! 今回の構成として シーン1:タイトル画面 シーン2:プレイ シーン3:ゲームオーバー という三つの構成で動いています。それぞれif文やelse if文でシーンをわけ、さらにその中で分岐していくってイメージで作ってました。個人的にinit変数ってのがいまいち分かりづらいです。。   ソースは長いですがこんな感じ メインアクティビティはビューを生成しているだけなので割愛します。 書いてると訳分かんなくなりそうなんですけど、コメントを参考に大きく見ると結構分かりやすい構成です。 マップの生成に配列、ランダム、確率、なんかを使っていて、こういうところに出てくるのだなぁという感想です。   また、ジャンプの処理なんかもそうですが、ただタッチするとジャンプ。だけでなくどんなときにfalseなのかってのもしっかり書かないといけないのだな。ということが分かりました。 その他に速度にあたる部分変えてみたりして遊んでみました。しかし、当たり判定だけはうまく操作できない、、難しいです。。   ひとまずこんな感じでアクションゲームを作った後は簡単なRPGを作ってみました。   RPGはマップ画面と戦闘画面の二つで、 シーン1:マップ シーン2:敵出現 シーン3:コマンド入力 シーン4:攻撃 シーン5:防御(攻撃をうける) シーン6:逃げる という6つとそれに加えてゲームオーバーとスタートに分かれます。 マップは二重配列で座標ごとに木、平地、家、城を配置してつくってあり、主人公は座標で保持しています。 敵と主人公はそれぞれパラメータがあり、攻撃力、守備力、経験値などでレベルが上がって強くなったりもします。 この辺の計算はやってみると分かるんですが、本当ゲーム作ってる人ってすごいなと。 まさに計算だし、それでいて楽しいと感じる具合を決めるのが難しい!! また出現率も今回は簡単なものにしましたが、これも凝ったら大変だろうなぁという印象です。 あ、画像載せます。これも適当な画像を拾ってきて作ったのです。使ってすいません。(一応フリーとあったので、、) blog 2015-02-04 12.18.25 blog 2015-02-04 12.19.25 blog 2015-02-04 12.19.15 blog 2015-02-04 12.19.08   コマンドは画面の左半分か右半分かをタッチすることで判断しているので、画面サイズを取得して、その半分のうちどちらをタッチしたか、という処理をしています。   これも、しっかり動いた上に、どういう風に作っていくのか。ということが分かったのでとても楽しくできました。 しかし、、長い。。これは一人で大きいゲームを作るのは無理だな。と実感しました。   これまたソースを これもメインはビューを生成しているだけなので省いてます。   恐らくこんな一ページで書くことはないのだろうなぁ、、、と思いながらもとりあえず本に従って書いてみましたがどうなんでしょうか。。     最近分かったことですが、本によって結構書き方がまちまちだったりするので、開発環境(会社)によって決まりがあったり、エンジニアによって癖があるのだな。ということです。 色々な本で学んで一番最適な方法を探していこうと思います。
スクリーンショット 2015-02-03 15.31.58

iOS 〜テキストフィールドのデリゲート〜

こんにちはうさです。 今回はデリゲートについて書いていきます。 デリゲート??初めて聞く用語ですね。 デリゲートとは こちらにも記述されている通り、 イベント等の処理の受付だけを行い、 処理は他のクラスに任せる事のようです。 処理を行う方法としては
  • デリゲートしたいクラスのデリゲートプロトコルの採用を宣言する。
  • デリゲートしたいインスタンスのdelegateプロパティにselfを設定する
  • デリゲートメソッドを実装して処理を定義する
といった事を行います。 デリゲートの大枠を掴めたところで 実際に例としてテキストフィールドを使っていきます。 まずは、Objectライブラリの中から「TextField」をドラッグ&ドロップします。 そのとき、Attributesインスペクタでテキストフィールドが空の時の文言や使用するキーボード等の設定を行います。 そして、先ほどのテキストフィールドをエディタへドロップしプロパティ宣言しました。 ここから、デリゲートプロトコルを宣言していきます。 「ViewControllerクラスのヘッダファイル」の@omterface ViewController:UIViewControllerの後ろにプロトコル宣言をします。 それがこちら 書き方は「<プロトコル>」となります。 続いてViewControllerクラスの実装ファイルに記述していきます。 コードがこちら デリゲートしたいインスタンスのdelegateプロパティにselfを設定するに当たるのがこちらの一行 self.myTextField.delegate = self; これでテキストフィールドのデリゲートになりました。 最後にデリゲートメソッドを記述します。 最初の行がそれに当たります。 以降がそのreturnキーの入力イベントを受け止める処理になります。 [self.view endEditing:YES]; はキーボードを下げる(引っ込める)ことを意味し NSLog(@”入力された文字&gt; %@” , self.myTextField.text); はテキストフィールドに入力された文字を出力します。 return NO; これはテキストフィールドに改行コードを入力しないことを表します。 アプリを起動してテキストフィールドをタップすると キーボードが出現します。 そして、returnキーを押すとキーボードが下がります。 スクリーンショット 2015-02-03 15.31.58 今回で書籍の半分以上終わりましたが、 まだまだわからないことが多いので、より多くのコードに触れて理解を深めていきます。 こちらはその書籍 以上うさでした。
スクリーンショット 2015-02-03 14.46.03

iOS 〜アニメーション〜

こんにちは、うさです。 本日もiOSアプリとObjective-Cの勉強をしていきましたので、 サンプルアプリを通して復習していきます。 アニメーションという事でイメージ画像を4つ用意して その画像を変化させる事で動いているようにみせるアプリを作りました。 今回のアプリを通して思った事は コードを書く作業よりも 画像やUI部品等の配置作業が多いなということです。 手順として、 1.4つのイメージ画像をプロジェクト内に用意して、 「Mediaライブラリ」から最初のイメージをドロップする。 2.イメージ画像に「Tap Gesture Recognizer」(タップするとアクションを起こす)をドロップ 3.イメージ画像をエディタへcontrolキー+ドラッグでプロパティの挿入 4.「Tap Gesture Recognizer」をエディタへcontrolキー+ドラッグでアクション接続 後は、コードを書くのですが、 恐らく10数行しか書いていないと思います。 こちらがそのコード それでは、僕が書いたコードがどんなことをしたのか確認していきます。 まずは、 アニメーションのイメージを入れる為の配列を用意します。 これは実際の値ではないので、ポインタ(*)が付いていますね。 続いてアニメーションを作るコードを書き込みます。 最初に、先ほど用意した配列に4つのイメージ画像を入れています。 次に self.frog.animationImages = animationSeq; はカエルのイメージビューにアニメーションの配列を設定しています。 animationDurationでアニメーションの長さ animationRepeatCountはアニメーションの繰り返しの回数を設定しています。 最後に アニメーションの再生と停止を切り替えています。 isAnimatingはアニメーションが再生中かどうかを判断します。 それをif文で再生したり、停止させたりしています。 以上が書き足したコードでした。 すると、 動きとしては スクリーンショット 2015-02-03 14.46.03スクリーンショット 2015-02-03 14.46.34スクリーンショット 2015-02-03 14.46.09スクリーンショット 2015-02-03 14.46.23 を3回繰り返すアプリとなります。 これをうまく使ってゲーム等を作っているのでしょうか!! 以上うさでした。
blog 2015-02-02 11.43.12

コンテンツプロバイダ

こんにちは!よしときです。 今回はコンテンツプロバイダについて勉強しました。  
コンテンツ プロバイダは、構造化されたデータのセットへのアクセス管理を提供します。これらはデータをカプセル化し、データセキュリティを定義するためのメカニズムを提供します。コンテンツ プロバイダは 1 つのプロセスで、別プロセスで実行するコードと一体となって、データに接続する標準的なインターフェイスを提供します。
とあるのですが、、よーわからん。 簡単に書いてあるやつだと
他のアクティビティにデータを提供する構成要素
とあります。。。   つまり何がしのデータをやり取りする。。?ということですね?共通の保存フィールドみたいなのでやり取りする感じなのかな?   ひとまずやってみることに。今回はDBを使用してやってみました。 blog 2015-02-02 11.43.12 文字列を書き込みでDBにインサートしたり読み込みで表示させたりするものです。 前回やったDBのものと見た目は変わりないのですが、ソースを見るとコンテンツプロバイダから引っ張ってきてるのが分かります。 こういう感じですね。 実際のコンテンツプロバイダのクラスがこちら データベース系の処理が書いてあるだけですが、前回とちがうのは独立していることですね!これで違うアクティビティ間でこのDBを使うことが出来るという感じでしょうか。   ついでにManifest.xmlも載せておきます。   アプリケーション階層にプロバイダータグを追加しています。   これはこれでばんばん使いそうなので覚えておきます!!   そして次にカメラの機能をつかったものを作ったのですが、起動はするもののうまく動作せず。。 おそらく非推奨のCameraクラスを使っているからではないかと思うのですが。。 今回は書くだけ書いて次に回すことにしました。 その他動画、音楽ファイルを扱う物も同様に書くだけ書いてみて感覚だけつかみ、動作は他の機会に回そうと思います。   blog 2015-02-02 12.29.12   エミュレータのカメラ画面ですw 最初はおもしれーと思ってましたが、今は悩みすぎてよいそうですw   以上!!
blog 2015-01-29 14.29.14

ブロードキャストレシーバーとサービス

こんにちは!よしときです! 今回はAndroidのブロードキャストレシーバーとサービスについて学びました。 ブロードキャストレシーバーとはなんぞや、と思ってよくわからないまま作ったのですが「あーこれね!」という感じになりました。 以下画面の「インテントのブロードキャスト」を押すと   blog 2015-01-29 14.29.14       画面下にこいつが出てきますー   blog 2015-02-02 16.23.14   これはアクティビティとは違い、別画面に遷移させずに処理を行えるというメリットがあるらしいです。 しょっちゅうエラー表示でお出ましになるのはこいつでしたのねw   クラスは二つで構成されていて、プログラム本体に当たるものとブロードキャストレシーバーとなるクラスです。 プログラム本体と   ブロードキャストレシーバーのクラス   これに合わせてmanifest.xmlファイルにブロードキャストレシーバーを使いますというのを追加します   こんな感じです。すごくよく使うらしいのでしっかり覚えたいのですが、なんせ長いので徐々に覚えていこうと思います。。       次に行ったのがサービスの勉強です。 サービスというのはバックグラウンドで処理を行うもので、身近なアプリだと節電アプリとかでしょうか。。 アクティビティ(画面)を終了しても実行し続けます。こちらはゲームなんかじゃ余り使わなさそうですが、ツールなんかでは使えそうですね!   画面はこんなかんじ blog 2015-01-29 15.37.00 blog 2015-01-29 15.37.08 blog 2015-01-29 15.37.49 サービスを開始すると上のステータスバーにアイコンが現れてバックグラウンドで実行されていることが分かります。 今回作ったのは数秒ごとにMessageという文字列を表示させるプログラムで、サービスの操作を押すと現在の時刻が表示されるようになります。最後の写真はステータスバーをひっぱりだした写真で、ちゃんと実行されていることが分かります。   ソースは これがメインとなるクラスで、 こちらがサービスとなるクラスです。   さらにこれを起動するにはAIDL(Android Interface Definition Langage)というものが必要です。 これ、ぱっと見はただのインターフェースで、実際インターフェースに似てる動作で、 これを定義するとあるプロセスが別のプロセスのメモリにアクセスできるようになるようです。 なんのこっちゃ 非常にイメージしづらいが、このインターフェースもどきにサービスを投げてやることで別のプロセスでも実行できるという感じだろうか。 今回は こんな感じなんですが、、これを使うとメッセージが他のところでもつかえるよーといったとこかな?うーん、、 分かりづらいですが、結構テンプレ的な使い方のようなので使いながら覚えていこうと思います。。   サービスも先ほどと同様にManifest.xmlでサービスを使いますよーという宣言をしてやります 最後から三行目に<service android:name=”MyService”></service>というのが追加されてますね!これでサービスが使えます!   今回はこんな感じでした!おつかれさまです。
スクリーンショット 2015-02-02 15.12.33

iOS 〜初めてのObjective-C〜

こんにちは、うさです。 本日からiOSアプリの勉強を開始しました。 言語は「Objective-C」で開発していきます。 Objective-Cはもとより、 C言語すら勉強していない僕は記述方法から大苦戦です。 基本的なところからどんな意味を持つのかを勉強していきましたので、 僕の頭に叩き込む為に、書いていきます。 (書籍等を見ながら書いていきますが解釈の違いがあるかもしれません。) ということで、一つのアプリを例にとってみます。 そのアプリは「デートピッカーを使っての日数計算」するものです。 まずは、下記のようにウィジェットの配置をしていきます。 X-codeはドラッグ&ドロップで簡単に配置できて便利ですね!!(以前やったAndroidStudioもそうでしたが) スクリーンショット 2015-02-02 15.12.33 そして、アシスタントエディタへ接続してプロパティ宣言等を行い、 完成したコードがこちら!! 今まで勉強してきたJavaなどと違った記載のされ方なので、 インスタンスやメソッドが何をさしているのかわからないですねー!! 基本的なところを確認していくとは言ったものの、 X-codeをインストールした時点で記載が合あった箇所は省いて記述の仕方と意味を理解していきます。 それではまず、ラベルの初期表示するコード NSDateFormatterは日付の書式のクラスでObjective-CではクラスにNSが最初に付くみたいですね。 *formatterは変数なのですが「*」が前についているので何じゃこりゃ!!って感じです。 「*」はint型のように1や2等の実際の値が入るのではなく、 値が記録されているアドレス(参照先)を入れるらしいのです。 「=」の後を見ていって確認します。 [NSDateFormatter alloc]はNSDateFormatterインスタンスを作成し、 initメソッドで初期化を行っています。 これは、実際の値ではなく初期化されたインスタンスを変数formatterとするということですね。 なかなか使いどころが難しいですが、慣れるしかないですね。 で、やっと次の行ですが、 こちらは、formatterの書式を設定しています。 続いて self.toDay.textはJavaでも同じような記述をしていましたが、 「self(自分自身のインスタンス)」の「toDay(プロバティ)」が指している「text(テキスト)」に代入という事ですね。 何を代入するのかというと、 NSDateクラスのdateメソッドで本日の日付をstringFromDateでdate型からstring型へと変更しています 次の も先ほどと同じ値をselectedDataプロパティへ設定しています。 最後の日数の隣のラベルは 「@」は後ろの型を自動的に検知して表示します。 書式間違え等がなくなり、入力を短縮出来るわけですね。 これで、ラベルの初期値がすべて設定されました。 それでは、デートピッカーで設定した日付を検知して選んだ日付と日数に表示していきます。 アクション接続でのメソッドt定義として – (IBAction)changedDate:(UIDatePicker *)sender { と記載されます。 最初に付いている「-」はインスタンスに対して実行するインスタンスメソッドとのこと。 「+」もあり、それはクラスに対して実行するクラスメソッドだそう。 (これは後々理解していきます) IBActionはこのメソッドをUI部品と接続して使う事を示しています。 changedDateというメソッド名とし、 (UIDatePicker *)はデートペッカーという部品のクラスである事を示し、 senderはこのアクションの値になります。 それでは、このアクションについて。 最初の2行は全く同じ処理を行い、 日付の初期設定をしています。 3行目は self.selectedDate.text = [formatter stringFromDate:sender.date]; 「sender」つまりデートペッカーで選んだ日付をselectedDateに表示します。 4行目は toDay(現在の日付)をstring型からdate型へと変換しています。 そして デートピッカーの日付と現在の日付間の秒数を「timeIntervalSinceDate」で求めて秒数を示すインスタンスに代入しています。 その値を secs/(60 * 60 * 24)で”日”へ変更してroundで四捨五入し、numDaysへ代入 最後に days(日数)へnumDaysを代入しています。 すると、デバイスへの表示が以下のようになります。 スクリーンショット 2015-02-02 16.38.47 今回はいろんな♪記号等の意味を確認しながら一つの例を見ていきました。 明日以降もObjective-Cを勉強しながら、 iOSでアプリを作っていきます。 以上、うさでした。