忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/23 14:23 】 |
デバイスの向きを指定する
iPhone を立て向きで使うか、横向きで使うか。
指定するには、ViewControllerクラスに以下の定義を追加する
(あるいは、プロジェクト作成時にデフォルトでコメント内に記述されていれば、コメントから外す)



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft))
return YES;
return NO;
}

向きを表す定数が、このメソッドに引数として渡されて来るので、
アプリとして対応したい向きの場合にYESを返すようにする。
上記の例だと、デバイスが左向きの場合だけ対応ということなので、デバイスをどういう向きにしても常に左向きとして描画する。
2方向以上の向きでYESを返すようにした場合、デバイスの向きを変えると、画面が「くるっ」と回転するアレが発生する。

定数は以下。


UIInterfaceOrientationPortrait
上下反対
UIInterfaceOrientationPortraitUpsideDown
横向き。ホームボタンが左にある
UIInterfaceOrientationLandscapeLeft
横向き。ホームボタンが右にある
UIInterfaceOrientationLandscapeRight




PR
【2011/08/10 15:35 】 | iPhone | 有り難いご意見(0) | トラックバック()
XCodeのプロジェクトテンプレートを自前で作る
XCodeでゲームを作るときは、 OpenGL ES Application のプロジェクトテンプレートを使って作るのだが、最初に作り始めるまで改造するところが結構多い。

プロジェクトテンプレートとはこれのこと。
XCodeで新規プロジェクトの作成を選ぶと出て来る画面。


ここに、自分で作ったファイルやシェーダを持つプロジェクトテンプレートを追加したい。


※googleで調べて出て来る情報は、XCode3 と XCode4 とが混在していて、バージョン違いでいろいろ変わるようなので要注意。
ここではXCode4 でのやり方を示す。



プロジェクトテンプレートが定義されている場所は、
/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/Application
である。
(とても紛らわしいが、/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application というディレクトリもあり、これは今回使わないので要注意)


ここを見ると、プロジェクトテンプレートが全部入っているのが分かる。




ここにある、OpenGL ES Applicationj.xctemplate をコピーして書き換えて作ってみようという話。
中身はこうなっている。

中身は、プロジェクトを作成したときに生成されるファイル群と同じ。プロジェクト名のところが変数っぽくなっているだけが違い。


これをコピーする。
コピー先はこことは全然別の場所で、
ホームディレクトリ/ライブラリ/Developer/XCode/Templates/
である。
とりあえずここに
OpenGL ES Application.xctemplate
をコピーして置く。名前は
fd Application.xctemplat
とする。
この状態でXCodeを開き、プロジェクトの新規追加を行うと、

というふうに反映される。(XCodeの再起動とかも必要ない)


しかしこのままだと、OpenGL ES Application が使えなくなっている。
fd Applicationが上書きしてしまったようだ。
両方を使えるようにする必要がある。どこかにID的なものが記述されているはずで、それを別名に変える必要がある。

fd Application.xctemplate/TemplateInfo.plist
を開く。
OpenGLESで検索。78行目に
com.apple.dt.unit.OpenGLESApplication
という箇所がある。これを適当に
com.apple.dt.unit.fdApplication
とでも書き換える。
すると、OpenGLES Application と fdApplication がそれぞれXCodeで使えるようになる。



ではいよいよテンプレートを記述していく。
すでにあるファイルの中身を書き換えたり、ファイル名を変えたり。
またファイルを新たに追加する。

ファイル名の変更をしたら、TemplateInfo.plist の中で、ファイル名の変更前から変更後に置換する。
 例えば、ViewController を .m から .mm に変えた場合、 viewcontroller.m で検索引っかかったところの拡張子を全部 .mm に変える。これをしないでXCodeで作った場合、 .mm 名のファイルが作られるが、中身が空っぽということになる。

また、ファイルを追加した場合は、(12行目以降の)ファイル名とパスの組の部分に記述を追加。
EAGLView.m

Path
EAGLView.m

さらに、(120行目あたり)ノード配列の部分にも記述を追加
EAGLView.m

これで、新たなファイルがテンプレートに追加されるようになる。
(ソースやヘッダだけでなく、jpgも追加できることを確認。)
(ただし、EAGLView.m らと同じディレクトリに置いていないとコピーできなかった。ディレクトリを掘った場所に置いていたら、コピーができなかった。なぜかはよくわからない)



あと、***AppDelegate.m/h だが、これらはなぜかテンプレートディレクトリ内にファイルが置いていない。
TemplateInfo.plist を良く読むと、この中にAppDelegate 内の関数定義などが一部書いてある。
どうやら、大本となる***AppDelegate.m/h の定義はどこか他から取ってきていて、そのうち一部のメソッドやらをTemplateInfo.plist の記述で上書きしているようだ。

この大本がどこにあるのかはまだ不明。
だが、TemplateInfo.plist 内の***AppDelegateのメソッド定義を全部削除し、他のファイルと同様、ファイル名とパスの定義だけのものに差し替えたら、(もちろんテンプレートディレクトリに***AppDelegate.m/hファイルを置く)ちゃんとそちらの定義が上書きされた。
(ただし、***AppDelegate.mm ファイルを使おうとしたら、***AppDelegate.m を上書きしないので、プロジェクトを作成したときに ***AppDelegate.m と ***AppDelegate.mm の両方が作られてしまった。)



【2011/08/09 18:34 】 | iPhone | 有り難いご意見(0) | トラックバック()
XCode4を使ってみた
XCode4。3とかなり変わっている。
役に立ちそうなショートカットコマンドをここに書いておく。


ビュー系
Cmd + 1 プロジェクト
Cmd + 2 シンボル
Cmd + 3 検索
Cmd + 4 Issue(ビルド時の警告とエラー)
Cmd + 5 デバッグ
Cmd + 6 ブレークポイント一覧
Cmd + 7 ログ
Cmd + 0 ナビゲータ(左のカラム)表示ON/OFF
Shift + Cmd + 2 オーガナイザ表示
Shift + Cmd + Y デバッグエリア表示


ファイル移動系
Ctrl + 1 関連するアイテム
Ctrl + 2 カーソル位置の履歴(戻る)
Ctrl + Cmd + 2 カーソル位置の履歴(進む)  ←入れ替えた
Ctrl + 3 ファイル履歴(戻る)  ←入れ替えた
Ctrl + Cmd + 3 ファイル履歴(進む)
Ctrl + 4 プロジェクトディレクトリ以下表示
Ctrl + 5 グループのファイル一覧
Ctrl + 6 ファイル内の関数一覧
Ctrl + 7 問題の表示(?)


ソース系
Cmd + クリック 定義にジャンプ
Cmd + Ctrl + D 定義にジャンプ
Cmd + ] 右シフト
Cmd + [ 左シフト
Opt + Cmd + ← 折り畳む
Opt + Cmd + → 開く
Opt + クリック クイックヘルプ
Ctrl + Cmd + ? クイックヘルプ
Opt + Cmd + ? APIリファレンス
Ctrl + Opt + Cmd + / ドキュメント検索


デバッグ系
Cmd + B ビルド
Cmd + ' 次のビルドエラー位置にジャンプ
Cmd + R 実行
Cmd + . 中止
Ctrl + Cmd + Y 一時停止
F6 ステップオーバー
F7 ステップイン
F8 ステップアウト
Cmd + \ ブレークポイント追加
Cmd + Y ブレークポイント有効化




【2011/07/21 22:25 】 | iPhone | 有り難いご意見(0) | トラックバック()
XCodeとSDKがダウンロードできない
XCodeとSDKを更新しようとして、
http://developer.apple.com/xcode/index.php
からダウンロードしようとしたら、



Access denied

と言われた。。

ADC サポートセンターに問い合わせて、と英語でのたまっている。

なんでよ!?

と思って、とりあえずメンバーセンターに入ってみたら、
SDKが4.3に更新されて、もろもろのことに同意を求めるメッセージが出ていた。

それに同意して、もう一度ダウンロード試してみたら、できた。


そういうことか。
「同意が必要です」くらいのメッセージ出してよね。

【2011/07/15 16:09 】 | iPhone | 有り難いご意見(0) | トラックバック()
アプリをAppleに提出するまで
アプリが完成したら、App Storeに置こう。
そのために、完成したアプリをAppleに提出する必要がある。

まず、Apple Menber Centerに登録することと、
iOS Developer Program を購入していることが前提。



また、アプリ名は当然のことながら、自分の会社名(またはチーム名)を考えておくと良い。
それから、サポート用のURLが必要なので、ブログでも開いておくと良いだろう。


意外と時間がかかる。
今回は動作確認やアプリのファイル構成を変えたりした時間も含めたためもあるが、6時間もかかった。

まず、アプリを完成させたら、
ここのチェック項目を全部済ます

これが全部済んだら、アプリそのものを作る作業は終わったということ。

【2011/06/03 02:42 】 | iPhone | 有り難いご意見(0) | トラックバック()
いろいろなディレクトリの場所
前もこういう記事を書いたような気もするが、検索しても出てこなかったので
たぶんまとめて書いたことはないんだろう。



ユーザ名(英字)
NSUserName()
XXXX

ユーザ名(漢字)
NSFullUserName()
名名名名

ホームディレクトリ
NSHomeDirectory()
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13

指定ユーザのホームディレクトリ
NSHomeDirectoryForUser(@"XXXX")
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13

テンポラリディレクトリ(不明)
NSTemporaryDirectory()
/var/folders/16/1607jAmvGO45jkoiNniJ6E+++TI/-Tmp-/

ルートディレクトリ
NSOpenStepRootDirectory()
/


バンドルのパス
[[NSBundle mainBundle] bundlePath]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app

バンドルのリソースパス
[[NSBundle mainBundle] resourcePath]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app

バンドルの実行パス
[[NSBundle mainBundle] executablePath]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/action

[[NSBundle mainBundle] pathForAuxiliaryExecutable: [[NSBundle mainBundle] executablePath]]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/action

バンドルのプライベートフレームワークへのパス
[[NSBundle mainBundle] privateFrameworksPath]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/Frameworks

バンドルのシェアードフレームワークへのパス
[[NSBundle mainBundle] sharedFrameworksPath]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/SharedFrameworks

バンドルのシェアードサポートパス
[[NSBundle mainBundle] sharedSupportPath]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/SharedSupport

バンドルのビルトインプラグインへのパス
[[NSBundle mainBundle] builtInPlugInsPath]
/Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/PlugIns


【2011/05/31 18:09 】 | iPhone | 有り難いご意見(0) | トラックバック()
アプリのリリース前に
確認すべきこと

ビルド構成をReleaseでリビルドして、ワーニングやエラーが無いか?

当然のことながら、バグは無いか?

iPhone/iPad/iPod、どのデバイスで動作するアプリかを正しく設定したか?

動作確認したデバイスとOSのバージョンは控えた?

バックアップを取った?

アプリのタイトルを決めた?

Icon.png(72x72)を描いてプロジェクトに追加した?

データを確認した?
セーブデータを空にした状態で問題なく動いた?

無用なデータを載せていないか?(もう使っていない画像ファイルとか)

広告は載せた?(必要なら)


スクリーンショットを撮る
XCodeのオーガナイザで。


xxxx-info.plistの記入

xxxx-info.plist の Bundle display name に記入する。無記入だと、プロジェクトの名前がアプリ名になる。
これがアプリ固有の識別名になる。
ここの名前を変えてビルド実行すると、別のアプリとして作られる。実機iPhone上にも新たなアイコンが出て別のアプリとして起動するし、シミュレータ実行すれば、iPhone Simulatorディレクトリ下に新たにディレクトリが追加される。
ゲームを最初の状態から開始したいときは、名前を変えちゃうのが楽で確実。
履歴を残す意味で、バージョン管理ツールでいうタグのようなつもりで、ときどき名前を変えていてもいいかも。

xxxx-info.plistの Icon file にファイル名を追記する。(ファイル名をIcon.pngのままにするなら書いてなくても良い)
Localization native development region を Japan に。
Bundle identifier の yourcompany の部分を自分固有の名前に。




問題ないなら、次はDeveloper Centerへ行っての作業に成ります。

【2011/05/31 05:08 】 | iPhone | 有り難いご意見(0) | トラックバック()
iAdを組み込む
iAdを組み込む方法。


まず、iOS4以降であること。

XCodeを開く

iAdフレームワークを追加
プロジェクトビュー→Frameworks→右クリック→追加→既存のフレームワーク→iAd.framework

viewController.h に以下のように追記

#import

@interface mylViewController : UIViewController
{
//iAd
ADBannerView *adView_;
}


viewController.mm に以下のように追記

- (void)viewDidLoad
{
//super
[super viewDidLoad];

//iAd
adView_ = [[ADBannerView alloc] initWithFrame:CGRectZero];
adView_.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
[self.view addSubview:adView_];
}

- (void)viewDidUnload
{
//iAd
[adView_ removeFromSuperview];

//super
[super viewDidUnload];
}


で、オシマイ。なんとこれだけ。
1分で終わる。

【2011/05/08 16:24 】 | iPhone | 有り難いご意見(0) | トラックバック()
メモリが足りなくなるとき
iOS4以降では、アプリを中断して、別のアプリを実行することが出来る。
中断されてバックグラウンドに行っているアプリは、フォアグラウンドに戻って来るときのため、メモリ上にまだ存在している。

しかし、フォアグラウンドのアプリがメモリを消費してシステムのメモリが足りなくなったとき、
バックグラウンドのアプリのメモリが解放されるときがある。


解放されてしまったアプリを再開すると、アプリの頭から開始される。
これは市販のアプリでもそうなっているものが多い。
(解放されていなければ、中断した状態からアプリを再開できる…iOS4以降対応のアプリなら)


デバッグ実行していると、

プログラムはシグナルを受信しました:“0”。

と出て終了してしまう。

バックグラウンドのアプリが終了してしまったというログが
XCode→オーガナイザ→デバイスログ
に残るわけではないので、(実行中アプリ自体がメモリ確保に失敗した場合は、Crash とか Low Memory といったログが残るが)
確認する方法はこれしか見つけていない。(他にもあるんだろうか)





**以下、仕様的な話**



使用可能なメモリ領域が少なくなったとき、
- (void)didReceiveMemoryWarning
が呼ばれる。
または、
AppDelegate の applicationDidReceiveMemoryWarningメソッド

UIApplicationDidReceiveMemoryWarningNotification
でも通知を受け取れる。
ただしこれらの通知は、フォアグラウンドで実行中のアプリにしか行われない。

この通知を受け取ったら、使っていないメモリを速やかに解放する必要がある。
キャッシュやイメージオブジェクトなどが望ましい。あとで必要になったときに再生成できるからである。

規定の動作の例として、例えばビューコントローラの場合、visibleでないビューを解放する。
(ビューが解放されたかどうかは、viewDidUnload の処理が呼ばれるかどうかで確認することができる。なお、viewDidUnload は dealloc 後には呼ばれない)



なお、メモリ不足をシミュレートする機能が、iOSシミュレータには付いている。
アプリをシミュレータで起動した状態で
iOSシミュレータ→ハードウェア→メモリ警告をシミュレート
とすると、すぐに前述の MemoryWarning 系の通知が飛んでくる。


参考:iOS Application Programming Guide pp.120~
【2011/05/08 16:00 】 | iPhone | 有り難いご意見(0) | トラックバック()
NSTimer
NSTimerクラス。
タイマーの機能が使える。

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html

インスタンスを生成するメソッドはいくつかあるけれど、今回はこれを使う。

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 60.0 target:self selector:@selector(timerEvent) userInfo:nil repeats:YES];

intervalがタイマー間隔
targetとselectorが、時間が来たときに呼ばれるインスタンスとメソッド。
userInfoはnilにしておく(のが良いとリファレンスにも書いてある)
repeatsは、繰り返すかどうか。

タイマーを発動させるときは、
[timer fire];

タイマーを止めるときは、
[timer invalidate];

以上。簡単。


注意すべき点としては、invalidateを呼び出すと、timerインスタンスが無効になる。
この状態でタイマーを再開しようと思って単に
[timer fire];
とすると、落ちてしまう。

この場合、
timer = [NSTimer scheduledTimerWithTimeInterval...];
からやり直さなければならない。


【2011/05/07 18:38 】 | iPhone | 有り難いご意見(1) | トラックバック()
<<前ページ | ホーム | 次ページ>>