忍者ブログ
  • 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/24 22:33 】 |
obj-cかどうかマクロで見分ける
ヘッダファイルがC/C++ファイルから読み込まれたのか、
Obj-Cファイルから読み込まれたのか。
見分けたいときはコレ。


#ifdef __OBJC__
#endif
PR
【2014/06/30 23:53 】 | iPhone | 有り難いご意見(0)
ゲーム中ハイスコアの記録
ハイスコアなどの記録方法。
NSUserDefaults を使う。

記録

void CallSetData(const char *ckey, int data){
NSString* nskey = [NSString stringWithUTF8String:ckey];
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:data forKey:nskey];
[userDefaults synchronize];
}



取得

int CallGetData(const char *ckey) {
NSString* nskey = [NSString stringWithUTF8String:ckey];
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSInteger data = [userDefaults integerForKey:nskey];
return (int)data;
}



参考
【2014/06/26 15:32 】 | iPhone | 有り難いご意見(0)
cocos2dでARC
cocos2d-x 3.1rcで、ARC設定を有効にした。


プロジェクトの設定で
Build Settings の Objective-C Automatic Reference Counting を Yes にする

ただしこれだとコンパイルに失敗する。

一部のファイルをARC対象から除外する。
その方法は


Build phases の Compile Sources から
AppController.mm
RootViewController.mm
main.m
の3つを選択し、Compiler Flagに
-fno-objc-arc
と書く。

これでコンパイルが通る。


ちなみにAppController.mm もARC対象にしたい場合は
コンパイルエラーがでる dealloc や release の行を消せば概ね良く、一カ所だけ

cocos2d::GLView *glview = cocos2d::GLView::createWithEAGLView(eaglView);




という行だけ、キャストに問題があるエラーが出る。ここは

cocos2d::GLView *glview = cocos2d::GLView::createWithEAGLView((__bridge_retained void *)eaglView);




と書き換えればOK。


残り2ファイルも行けるか?


http://tf.hateblo.jp/entry/2013/04/06/175000

cocos2d-x 2.0の記事だけど。多少参考になる
Cocos2D 2.X プロジェクトをARCに対応させる方法
【2014/06/26 15:08 】 | cocos2d-x | 有り難いご意見(0)
AppStoreへ飛ばす
URLスキームを使う

NSURL *myURL = [NSURL URLWithString:@"itms-apps://itunes.apple.com/app/idxxxxxxx"];
[[UIApplication sharedApplication] openURL:myURL];



うーむ簡単。
urlの部分(itunes.apple.com以下)は、AppStore上に実在してればどこでもOK。



もう少しいろいろしたい場合の参考。

iPhone端末内にアプリがある場合はアプリを、ない場合はAppStoreを開くコード

アプリ内でApp Storeが開ける! SKStoreProductViewControllerについて
【2014/06/26 01:21 】 | iPhone | 有り難いご意見(0)
viewの初期化メソッド
ビューコントローラには二つの初期かメソッドがある。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
-(id) initWithCoder:(NSCoder *)aDecoder

nibで定義されていれば前者が、
そうでないアーカイブオブジェクトなら後者が呼ばれる。
必ず行いたい初期化処理があれば、共通のメソッドを作っておいて両方から呼ばせる。


-(void)_init{
//初期化
}

-(id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
[self _init];
}
return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self _init];
}
return self;
}



参考

【2014/06/21 16:13 】 | iPhone | 有り難いご意見(0)
実行時やアーカイブ作成時のcode signエラー
XCodeでアーカイブを作るとき、以下のようなエラーが出ることがある。

code signエラーというわけ。
昔はよく起きたが、最近はXCodeが賢くなって自動でiOS Dev Centerにアクセスしてプロファイルを取得したり作成自体もしてくれたりして便利になっている。
が、今でもときどき起きることがある。


このエラーに遭遇したときは、certificate か、provisioning profile を更新しよう。



provisioning profile の更新は、XCodeのpreference から Account タブをクリックし、 左ペインのApple IDを選択、右ペインの該当するアカウント名をダブルクリック。
小ウィンドウが出てくるので、更新ボタンを押す。これでよし。




もしこれでうまく行かないときは、古いprovisioning profile を手動で消すという方法もある。
provisioning profile は

~/Library/MobileDevice/Provisioning Profiles




に置いてある。ファイル名は固有の英数字になっている。iOS dev Center からダウンロードしたときのファイル名とは違う。
どれが該当のファイルなのか?ということだが、provisioning profile の中身は plist つまりXMLなので読める。

:
:
ExpirationDate
YYYY-MM-DDThh:mm:ssZ
Name
iOS Team Provisioning Profile: XXXXX.XXXXX.XXXXX
TeamIdentifier

XXXXXXXXXXX

TeamName
XXXXXXXXXXX
TimeToLive
XXX
UUID
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
:
:




というふうに書いてある。
Expiration Dateが過ぎているとか、そういうところから判断しよう。


それでもだめなら?
Certificate が無い可能性もある。
自分で作ったprovisioning profile でないなら特に、Certificateは取ってきておく必要がある。
iOS Dev Centerからdownloadして、ファイルをダブルクリック。キーチェーンに追加されたのを確認しよう。XCodeも再起動。


これでうまく行くはずだ。

【2014/06/14 02:03 】 | iPhone | 有り難いご意見(0)
twitter投稿機能
twitterやfacebookとの連動をする方法について。
Social.framework というのに入っている。このフレームワークはデフォルトで用意されている。

#import <Social/Social.h>
で使用できる。

cocos2d-xの場合は、AppController.mmに以下のように書く。

if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {
SLComposeViewController *twitter = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[twitter setInitialText:initialText];
[self.viewController presentViewController: twitter animated:YES completion:NULL];
}





要するに、twitter用のあのダイアログはViewController扱い。
起動時にデフォルトで入れる文章が initialText にあたる。
投稿ボタンやキャンセルボタンを押すとダイアログは閉じ、ViewController も閉じる。
再度投稿させる場合は、再度ViewControllerを作るわけ。

completionHandler にメソッドを登録しておくと、投稿ないしキャンセルしたときにコールバックが飛んでくる。

typedef void (^SLComposeViewControllerCompletionHandler)
(SLComposeViewControllerResult result);
resultは以下のどっちか
SLComposeViewControllerResultCancelled
SLComposeViewControllerResultDone




ただし、投稿に成功・失敗したとは違うことに注意。
「投稿」ボタンを押したが、twitterのパスワードが登録されていなくて投稿に失敗した、のような場合でも、resultは SLComposeViewControllerResultDone のほうが渡されてくる。

【2014/06/13 23:40 】 | iPhone | 有り難いご意見(0)
iPhoneシリーズ画面サイズやOS
iPhone各機種の比較。

端末     画面サイズ   初期OS
iPhone4S   640x960    5.0
iPhone5   640x1136    6.0
iPhone5c   640x1136    7.0
iPhone5s   640x1136    7.0

作ったアプリの画面サイズが 640x960 で動くか、640x1136 で動くかどうかの判断は、アプリ内に
Default-568h@2x.png
というファイルがあるかどうかによるらしい。
公式マニュアル

ずいぶん分かりにくい。注意しよう。

【2014/06/13 11:41 】 | iPhone | 有り難いご意見(0)
iRate導入
レーティングしてもらうために出すダイアログ。
定番は iRate

分かりやすい説明の記事

iRate.h
iRate.mm
の2ファイルを置くだけで良い。

設定内容として以下のようなコードを起動直後に行っておく。

[[iRate sharedInstance] setAppStoreID:APP_ID];

[[iRate sharedInstance] setUsesUntilPrompt:1]; //1回起動でプロンプト出す
[[iRate sharedInstance] setEventsUntilPrompt:1]; //1回イベント通過でプロンプト出す
[[iRate sharedInstance] setDaysUntilPrompt:2.f]; //「あとで」の場合、2日後に再度プロンプト出す

[[iRate sharedInstance] setMessageTitle:@"AppStoreレビュー"];
[[iRate sharedInstance] setMessage:@"このアプリをAppStoreでレビューしませんか?"];
[[iRate sharedInstance] setRateButtonLabel:@"いますぐレビューする"];
[[iRate sharedInstance] setRemindButtonLabel:@"あとで"];
[[iRate sharedInstance] setCancelButtonLabel:@"レビューしない"];





とある画面を一定回数通ったらダイアログを出す、をしたいときは

[[iRate sharedInstance] logEvent:NO];




というのを呼べばいい。設定した内容に応じて、ダイアログを出してくれる。
ただしこれも、開発中(APP_IDが存在しない)ときはダイアログが出ないので注意。(後述)

自分で明示的に呼び出すこともできて、

[[iRate sharedInstance] promptForRating];




とすれば良い。必ずダイアログが出る。


また、レーティング済みかどうかは

[[iRate sharedInstance] ratedAnyVersion];




で分かる。
ただしこれは実際にApp Storeに書き込んだかどうかではなく、アプリ内で保存している変数値でチェックしていることに注意。

- (void)setRatedThisVersion:(BOOL)rated
{
[[NSUserDefaults standardUserDefaults] setObject:(rated? self.applicationVersion: nil) forKey:iRateRatedVersionKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}




さて、コンパイルに失敗する場合があるが、それはARCが有効になっていないからかも。
このページを参考にして対応しよう。


問題はAPP_ID。アプリを申請したときに出てくる固有のID。これはサブミット作業を進めておかないと取得されない。
実際には、APP_IDでなく、バンドルIDでもレビュー画面に飛べる。
だからAPP_IDがなくてもいいんだけど、ぶっつけ本番になるから確認したいところ。
多分、サブミット作業をバイナリアップロード前(情報登録)のところまで進めておけば、APP_IDが発行されるんで、それを入れておくところまでやっておこう。

APP_IDまで入れた状態で、しかしまだAppStoreにページが存在していない状態(URLは決定しているけどね)で、
[[iRate sharedInstance] logEvent:NO];
を呼び出すと、ログに以下の文章が出る。

iRate could not find this application on iTunes. If your app is not intended for App Store release then you must specify a custom ratingsURL. If this is the first release of your application then it's not a problem that it cannot be found on the store yet



つまり、ダイアログは表示されなかったけど、AppStoreにページがないだけだから安心して、ということだ。
提出前のチェックとしては、このメッセージを信じて実装完了としよう。
【2014/06/11 19:07 】 | iPhone | 有り難いご意見(0)
cocos2d-xにアイモバイル広告導入
フレームワークを入れるまではマニュアル通りでOK。
コードを書く段になるとややこしい。
cocos2d-xなのでビューコントローラがテンプレートと違っているとか、コードがC++で書かれているからObj-C側が呼び出しにくいとかそういう問題を解決していく必要がある。

この辺、appCCloudだとcocos2d版SDKも用意されていてとても開発者フレンドリーなのだが、見込める広告収入はアイモバイルのほうが高いとのことなので、そもそも何のためにゲーム作ってるのかと考えると頑張ってアイモバイルを入れることに意味がある。

バナー広告
まずバナー広告を入れる。
バナー広告はViewとして用意されている。(IMobileAdView)
なので、いずれかのビューに addSubview する形を取る。
cocos2d-xの場合、RootViewController が用意されていて、このビューコントローラについているビューは CCEAGLView である。設定箇所は AppController.mm になる。
つまりこのCCEAGLViewに addSubview することになる。

なので、そのままAppController.mmの
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
メソッド内で addSubview しちゃえばよい。マニュアルに書いてあるコードをほぼそのまま使えるぞ。
あとは…分かるな?
もうこれで表示されるぞ!
ちゃんとアイモバイルのほうで設定はしてあるな?シミュレータ上では表示されないぞ!

アイコン広告
アイコン広告を入れる。
仕組みはバナー広告と同じ。Viewとして提供されているので、適切なビューに addSubview するだけ。生成時の引数の形が少し違うだけ。(並べるアイコンの数の指定があったりする)
やることはバナーと同じだ!
マニュアルによると、1画面に出せる広告は1種類だけ、と書いてあるけど、別にそんなこともなくバナーとアイコン同時に出せる。


ミディアムレクタングル広告
なぜか別のSDKとして提供されている。(一緒にしろよ
なぜかこっちはパブリッシャーIDとかが文字列指定になってる。(揃えろよ
表示するとき、ビューコントローラを指定する方法と、ビューを指定する方法とがある。どっちでも好きな方を使おう

//登録
[ImobileSdkAds registerWithPublisherID:@"publisherId" MediaID:@"mediaId" SpotID:@"spotid"];
//広告取得開始
[ImobileSdkAds startBySpotID:@"spotid"];

//ビューコントローラ指定で表示
[ImobileSdkAds showBySpotID:@“spotId“ ViewController:viewController Position:CGPointMake(x, y)];
//ビュー指定で表示
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(x, y, width, height)];
[view addSubview:subview];
[ImobileSdkAds showBySpotID: @"spotId" View:subview];



ちなみにこちらには、広告取得が完了したときに呼び出すdelegateが指定できる。
クラスにIMobileSdkAdsDelegate を継承させて
[ImobileSdkAds setSpotDelegate:@"spotid" delegate:self];
としておくと、
- (void)imobileSdkAdsSpot:(NSString *)spotid didReadyWithValue:(ImobileSdkAdsReadyResult)value
というメソッドが呼び出される。
これ以降、表示メソッドを呼び出すと広告が出る。(この前に表示メソッド呼んでも何も起きないので注意)
(バナーとかアイコン広告は準備でき次第表示されるので、先にビューを作っておいても構わない。ミディアムレクタングルとかのインライン系はそうでないので、必ず広告取得完了したかの確認をすること)

ちなみに、Web上で広告スポットの登録をしてから実際に使えるようになるまで何時間もかかるので注意。
この間、広告はでないしエラーも出ない。(お粗末!
「安心しろ!君のプログラムは間違ってなんかいない!」



雑感
とりあえず、SDKは相当お粗末。(この点appCCloudは優秀だった)
バナー・アイコン版とインタースティシャル版でSDKが別になってるし、
インタースティシャル版のサンプルプロジェクトで広告表示されないし(何のサンプル?)
中のコードも大概な感じ。

if (IMOBILE_SDK_ADS_SPOT_ID_1 == nil || [IMOBILE_SDK_ADS_SPOT_ID_1 isEqualToString:@""] ) {
//.....
} else if (IMOBILE_SDK_ADS_SPOT_ID_1 != nil || ![IMOBILE_SDK_ADS_SPOT_ID_1 isEqualToString:@""]) {
//........
}



書いた人プログラミング素人なの?

【2014/06/11 14:14 】 | cocos2d-x | 有り難いご意見(0)
<<前ページ | ホーム | 次ページ>>