Hatena::ブログ(Diary)

Buddha-Over-Flow

この日記のはてなブックマーク数
 

2012-03-22 RenderMonkeyでOpenGLESをGeForce8系で実行する方法

[][] RenderMonkeyでOpenGLESをGeForce8系で実行する方法



既に開発が終了しているAMDのRenderMonkeyは、Windows上でOpenGLES2.0シェーダーをテストできるので便利なのだが、GeForce8系だとコンパイルは出来るがプレビューが見れない。

下記のようにすることで解決した。


//------------------------------------------------------------------------------

・nVidiaドライバエミュレーターをインストール (http://developer.nvidia.com/nvemulate)

・Feature Set Emulationを NV40に変更

・GLSL Compiler Device Supportを NV40に変更

・Applyボタンを押してRenderMonkeyを起動、GLESサンプルを試す

・RenderMonkeyを終了したら元に戻す

//------------------------------------------------------------------------------


最新のGeForceであればOpenGL4.1のES互換が使えると思うので、そちら経由でそのまま実行できるのかもしれない。

Desktop 向け OpenGL ES 2.0 実行環境まとめ

2011-09-10 No architectures to compile エラーの対処法

[] No architectures to compile エラーの対処法



XCode4にしてからというもの、以前は正常に実行できていたプロジェクトが、

iPhoneシュミレータでの実行時に下記のエラーを吐くようになった。


No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=i386, VALID_ARCHS=armv7).


i386アーキテクチャの指定がないのが原因のようなので、

ビルド設定の [Valid Architectures] に [i386] を追記すると解決した。

[Architectures]のほうは変更しなくても問題ない模様。

2011-06-17 iOSプロジェクトをコピーによって作成する際の手順

[] iOSプロジェクトをコピーによって作成する際の手順



新規にiOSのXcodeプロジェクトを作る際に、いつも使うライブラリ等のインポート設定などが面倒で、

横着して以前のプロジェクトをコピーして使いたくなる場合がある。


しかしこの作業を適当に勘でやると、アプリ実行時に[Unknown Error]が出て起動できなくなり

ハマる場合がよくあるので、備忘のために下記に正確な手順を書いておく。


iOSプロジェクトのコピーによる作成の手順/ XCode3版

( OldAppをコピー元のプロジェクトとする / NewAppをコピー後の新プロジェクトとする )


  1. OldAppのXCodeプロジェクトフォルダを新しい場所にコピー
  2. コピーしたXCodeプロジェクトフォルダ名をNewAppに変更
  3. NewApp内のOldApp.xcodeprojファイル名をNewApp.xcodeprojに変更
  4. NewApp.xcodeprojをXCodeで開く
  5. グループパネルのTargetsの中のOldAppターゲット名を、NewAppに変更
  6. NewApp.targetを右クリックして情報パネルを開き、ビルド設定内の[Product Name]を、NewAppに変更
  7. Info.plist内の、[Bundle display name]/[Executable file]/[Bundle name]の値を、NewAppに変更
  8. クリーンしてビルドする

以上の手順で基本的には問題なくNewAppのアプリが立ち上がるはずだが、

それでも[Unknown Error]などが出る場合には、下記の点をよく確認する。


  • ビルド設定を変更する場合は、XCode上部メニューのProject/ビルド設定からではなく、目的のTargetの右クリックメニューから開くこと。 (Product Nameの値が違う場合がある)
  • Info.plist内の[Executable file]は、ビルド設定の[Product Name]と同じ名前にしなくてはいけない

それでも駄目なら下記に[Unknown Error]の様々な対処法が書いてあるので参考に。

”Unknown error”でiPhoneシュミレータが起動出来ないとき

2011-04-28 アプリ起動時にプログラム修正点が反映されないときのチェック事項

[] アプリ起動時にプログラム修正点が反映されないときのチェック事項


iPhoneプログラミングで、プログラムを変更し、起動し直したにも関わらず、

変更点が反映されていないことがある場合、考えられる原因は主に下記の2つ。


アプリのサスペンド機能がONになっている

iOS4.0以降から、ホームボタンでアプリを終了させた場合でも、

起動状態を維持する機能がデフォルトでONになるようになった。

これが悪さをしている場合があるので、info.plistに下記の設定を行い、この機能をOFFにしてみる。


<key>UIApplicationExitsOnSuspend</key>

<true/>


アプリのinfo.plistがターゲットのバンドルリソースに追加されている

info.plistの場所を変更し、再度プロジェクトに追加した場合などに、バンドルリソースに入ってしまうことがある。この場合、何故か2回目の起動時にもうひとつアプリがインストールされ、以前のアプリが立ち上がることがあるので削除する。

2011-04-27 ”Unknown error”でiPhoneシュミレータが起動出来ないとき

[] "Unknown error"でiPhoneシュミレータが起動出来ないとき


”Failed to launch simulated application: Unknown error.”


まれに上記のエラーが出て、iPhoneシュミレータがうんともすんとも言わなくなることがある。

何せ[Unknown error]なので、どうしようもないわけだけど、実際はいろいろな原因が考えられるようで。


今回の場合は、info.plistの[実行ファイル名]に、記号が入っていたのが原因だった。

[./\n\s]あたりの記号が入っていると上記エラーが起こる模様。

同様に、ターゲットのビルド設定の[プロダクト名]も、記号は受け付けない模様。

アプリケーションの表示名には使える記号も、使えない場合があるので注意。


その他の原因と解決方法はここにいろいろなレポートがある。

http://stackoverflow.com/questions/779115/iphone-failed-to-launch-simulated-application-unknown-error

基本的にinfo.plist/Prefix.pchやファイル/フォルダ名が原因のことが多いようだ。

2010-07-02 iPadでのYoutube最大化画面の制御

[] iPadでのYoutube最大化画面の制御



UIViewControllerを使いたくない主義のせいで、

Youtubeのフルスクリーンの制御で若干はまったのでメモ。


iPadではembedタグを利用することで、UIWebView内に普通にYoutubeプラグインを埋め込むことができる。


YoutubeをUIWebViewに埋め込むと、自動で再生ボタンや最大化ボタンが表示され、

最大化ボタンを押すと、勝手に最大化した画面を出してくれるし、

最小化ボタンを押すと、勝手に元の位置とサイズに戻してもくれるのだけれど、

自動で表示される最大化画面が、デバイスの回転に対応しなかったり位置がずれることがあった。


内部で実際にYoutubeを再生しているのはYoutubePluginという複合クラスのようなんだけど、

プライベートなクラスなので、容易には触れなかった。

Youtube再生画面内の最大化ボタンをタップした瞬間をフックできればいいのだけど、

それも上手くいかなかった。(UIWebView/YoutubePluginはタップのイベントを受け付けないので)


◇結論


デバイスの回転に対応するには


Youtubeを読み込むWebViewの親ビューのどこかでUIViewControllerを使う必要がある模様。

たとえばこんな感じで、「親ビューの階層内のどこか」でUIViewControllerを経由させる。


UIViewController *controller = [[UIViewController alloc] init];
controller.view = webParentView;
[self addSubview:[controller.view autorelease]];

WebViewの直近の親でControllerを使う必要はなくて、

むしろ後に最大化画面の位置とサイズを調整するためには、

なるべくUIWindowに近いところの親ビューをController経由にするほうがいい。


位置とサイズを調整するには


これはUIViewController経由でaddした「親ビューの」位置とサイズに従って追随する模様。

なのでUIDevice等から画面の回転イベントを受け取って、

Controllerを挟んだ親ビューの位置とサイズを調整すれば自動で追随してくれる。

2010-06-09 UIKeyboardのOrientationを指定する方法

[] UIKeyboardのOrientationを指定する方法


UINavigationController等のコントローラーはなるべく使いたくない主義で、

画面の回転に対する処理をすべて自前で書いているような場合、下記の処理を書いておかないと、

UITextField等で自動でキーボードが表示される際に、Orientationが追随してくれない。



[[UIApplication sharedApplication] setStatusBarOrientation:orientation animated:NO];


UIKeyboardはステータスバーのOrientationによって表示する向きを変えている模様。

UIDeviceではないので注意。


今回はiPadのケースではまったんだけど、

iPhoneのときは普通に追随してたと思うんだけどなぁ...。

2010-05-14 XCode(iPhoneSDK)でLinkが上手くいかない場合の確認事項

[][] XCode(iPhoneSDK)でLinkが上手くいかない場合の確認事項


SQLiteライブラリのリンクの設定でちょっとはまったので備忘録に。


Linkingのエラーが出たら、ビルド設定の【Library Search Path】を確認し、別のパスが優先で指定されていたらその値を削除する

( このとき検索窓を使って設定を探す場合は、Showのところを【All Settings】にしておかないと、

独自定義した値しか表示されず混乱するので注意 )


要はXCodeが勝手にPath設定を追記して、他の環境のライブラリを優先指定しているのが原因。


libxmlなど、別のフレームワークや環境等にも含まれるdylibを指定する場合、同様の問題が起こる可能性がある。


自分の場合は、XAMPPのほうのlibsqliteが優先で指定されていて、

iPhone実機で動作させる際にリンクエラーが出た。


ちなみに、シミュレータと実機ではそれぞれ別のdylibを呼ばないといけないが、

通常は自動でXCodeが切り替えてくれるところを、自前で切り替えたい場合は、

下記のパスを【Library Search Path】に指定すれば良い。


■シミュレータ:

/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.2.sdk/usr/lib


■実機:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.2.sdk/usr/lib

2010-01-23

[][] iPhoneシュミレーターのカメラロール画像を取り出す



備忘録:シュミレーター内に保存された写真は下記の場所に保存されている。

/User/ユーザー名/Library/Application Support/iPone Simulator/SDKバージョン/Media/DCIM/100APPLE


以下のような感じで、アプリ画面のスクリーンショットを撮ったりすると、高解像度の画像が得られて便利。


#import <QuartzCore/CALayer.h>

- (void)getScreenShot {
	
    //現在のスクリーンショットを生成
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    UIGraphicsBeginImageContext(screenRect.size);
	
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];
    CGContextFillRect(ctx, screenRect);
    
    [self.layer renderInContext:ctx];
    
    NSData *pngData = UIImagePNGRepresentation(
                                 UIGraphicsGetImageFromCurrentImageContext());
    UIImage *retImage = [[UIImage imageWithData:pngData] retain];
	
    UIGraphicsEndImageContext();	
	
    //ローカルに保存
    UIImageWriteToSavedPhotosAlbum(retImage, 
                                   self,
                                   @selector(image:didFinishSavingWithError:contextInfo:), 
                                   nil);
	
}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error 
                                            contextInfo:(void*)contextInfo {
	if (!error) {
             NSLog(@"Error %@", [error localizedDescription]);
	}
}

2009-02-22 UIViewの親と子で別々のalpha値をもたせる方法

[][] UIViewの親と子で別々のalpha値をもたせる方法



iPhoneSDKのUIViewで親ビューのalpha値を変更すると、子ビューのalpha値も強制的に同じ値になってしまいますが、以下のようにすると子は親とは別の透明度を持つことが出来るようです。


駄目な例

UIView *oya = [[UIView alloc] init];

oya.alpha = 0.5f;


UIView *ko = [[UIView alloc] init];

ko.alpha = 1.0f;


[oya addSubview:ko]; //子の透明度は0.5fになる


良い例

UIView *oya = [[UIView alloc] init];

oya.backgroundcolor =

[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f];


UIView *ko = [[UIView alloc] init];

ko.backgroundcolor =

[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f];


[oya addSubview:ko]; //子の透明度は1.0fになる


要はUIViewのalphaではなく、UIColorのalphaで透明度を調節することが肝のようです。

これで画像を使わなくても透明度の違う複雑な見た目が簡単に作れるー。

(注:多用すると重くなるたぶん)


これさっき発見したんだけど、もしかして有名な話だったりするのかしら。