2011年9月11日日曜日

Mac OSXのGimp でDBPをインストールする。

DBP(DAVID’S BATCH PROCESSOR)とは、Gimpでバッチ処理をするためのプラグインです。
まずは、下記のサイトを参照してください。


http://blog.jondh.me.uk/2011/07/davids-batch-processor-on-os-x/


日本語ではないのでキツイですが…
この下にある"gimp-deps.zip"をダウンロードして解凍します。
解凍したフォルダ"gimp-deps"を、ホームディレクトリにコピーします。


ターミナルで以下のコマンドを実行します。
sudo ln -s ~/gimp-deps/* /opt/local/lib


dpbというコンパイル済みのファイルをダウンロードして、
"環境設定→フォルダ→プラグイン"で設定されているフォルダにコピーします。
下記のようなフォルダになっていると思います。
/Users/"自分の名前"/Library/Application Support/Gimp/plug-ins


Gimpを起動してメニューのフィルタの下に"Batch Process…"という項目が
新たにできていますので、選択して開きましょう。

2011年8月6日土曜日

AVPlayerのAVPlayerItemDidPlayToEndTimeNotificationを受けて終了すると、バスエラーになった。

iOS4.0から実装されたAVPlayerですが、再生の終了通知の"AVPlayerItemDidPlayToEndTimeNotification"を受けたときに適切な終了措置をとらないと、後のアプリの動作で不具合を起こすようです。この件では、アプリが不正終了して落ちました。
具体的には、cocos2dのreplaceSceneでシーンを入れ替えるときに発生しました。
なぜか、Adhocでデバイスにインストールしたときに現象が発生し、Debugでは発生しませんでした。
結局、対策はできて、とりあえず解決はしました。

デバイス:iPodTouch,iPhone3GS
OS:iOS4.3.5
iOS4.3sdk
Xcode3.2.6
Deployment Target iOS4.0

cocos2d 0.99.5

まず、アプリが落ちたときですが、コンソールでは以下のように出力されます。


Aug  5 19:55:35 unknown ReportCrash[162] <Notice>: Formulating crash report for process ???[161]
Aug  5 19:55:35 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.yourcompany.???[0x9ac8]) Job appears to have crashed: Bus error: 10
Aug  5 19:55:35 unknown SpringBoard[28] <Warning>: Application '???' exited abnormally with signal 10: Bus error: 10
Aug  5 19:55:35 unknown ReportCrash[162] <Error>: libMobileGestalt loadBasebandMobileEquipmentInfo: CommCenter error: 1:45
Aug  5 19:55:35 unknown ReportCrash[162] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
Aug  5 19:55:35 unknown ReportCrash[162] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
Aug  5 19:55:36 unknown ReportCrash[162] <Error>: Saved crashreport to /var/mobile/Library/Logs/CrashReporter/???_2011-08-05-195535_iPodTouch-4th.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0

Bus error: 10 といわれてもどうしたらよいか分かりませんでした。


ソース内では、AVPlayerItemDidPlayToEndTimeNotificationを通知名としてAVPlayerからの終了通知を受けるようにしています。

[[NSNotificationCenter defaultCenter] addObserver:self                                                                     selector:@selector(moviePlayBackDidFinishNotification:) 
name:AVPlayerItemDidPlayToEndTimeNotification
                    object:nil];

対策方法ですが、上のコードで登録されたセレクタの moviePlayBackDidFinishNotification 内で、以下のように一旦停止と再生終了時のUIを出すかどうかの設定を行えば、エラーは出なくなりました。


[self.player pause];
[self.player setActionAtItemEnd:AVPlayerActionAtItemEndNone];

原因は、まだ分かりませんが、無理にcocos2dと共存させているのが悪いのでしょうか?

2011年7月3日日曜日

CCVideoPlayerで、OS3.1以前の場合のコントローラを非表示にする。

CCVideoPlayerImpliOS.mで、playMovieAtURLメソッドを変更した。
MPMoviePlayerControllerのコントローラを非表示にするメッセージ。

[theMovie setMovieControlModeMPMovieControlModeHidden];


theMovieはMPMoviePlayerControllerのインスタンス変数。

下のように、このメソッドの頭のほうでも同じ命令があるが、
一番最初のムービー表示のときにコントローラが表示されてしまい。
2回目からは、非表示になるという現象が出ていた。


#ifdef __IPHONE_OS_VERSION_MIN_ALLOWED
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 30200
else if ( [theMovie respondsToSelector:@selector(setMovieControlMode:)] )
{
[theMovie setMovieControlMode: MPMovieControlModeHidden]; 
}
#endif
#endif

そこで以下のように追加した。

-------------- メソッドの途中から -------------------
// iOS 4.0 video player
if ([theMovie respondsToSelector: @selector(view)])
{
[keyWindow addSubview: [theMovie view]];
[ [theMovie view] setHiddenNO];
[ [theMovie view] setFrame: CGRectMake( 0, 0, keyWindow.frame.size.height, keyWindow.frame.size.width)];
[ [theMovie view] setCenter: keyWindow.center ];
        
[self updateOrientationWithOrientation: [[UIApplication sharedApplication] statusBarOrientation]];
// Movie playback is asynchronous, so this method returns immediately.
[theMovie play];
CGSize winSize = [ [CCDirector sharedDirector] winSize];
_videoOverlayView = [ [VideoOverlayView alloc] initWithFrame:CGRectMake(0, 0, winSize.height, winSize.width)];
[keyWindow addSubview: _videoOverlayView ];
}
else // iPhone OS 2.2.1 video player
{
[theMovie play];
// コントローラ非表示  <---------このように追加した
[theMovie setMovieControlMode: MPMovieControlModeHidden];
// add videoOVerlayView
NSArray *windows = [[UIApplication sharedApplication] windows];
if ([windows count] > 1)
{
// Locate the movie player window
UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
// Add our overlay view to the movie player's subviews so it is 
// displayed above it.
CGSize winSize = [ [CCDirector sharedDirector] winSize];
_videoOverlayView = [ [VideoOverlayView alloc] initWithFrame:CGRectMake(0, 0, winSize.height, winSize.width)];
[moviePlayerWindow addSubview: _videoOverlayView ];
}
}
------------ 以降省略 ------------
これで、最初の再生から非表示になったようだ。

2011年6月26日日曜日

CCVideoPlayerで画像をオーバレイ表示してみる

cocos2d-extensionsにCCVideoPlayerというクラスがあり、これは、動画を流しながらcocos2dのスプライトなどを表示することができるのでは?と期待しましたが、そんなに甘くなかったようです。

サンプルプログラムCCVideoPlayerTestを見てみると、
keyWindow上に、
   VideoOverlayView
   MPMovieView
   EAGLView
という階層でUIViewが乗っかっているようです。
ただし、これはOS4.0以降の場合です。
OS3.1の場合は、
   VideoOverlayView
   MPSwapableView
という階層になります。
頑張ればCCDirectorが乗るEAGLViewを上に持ってきてゴニョゴニョ…で、
cocos2dのスプライトやらが使えそうですが、おとなしくUIKitを使うことにしました。
取りあえず以下のコードでビットマップ画像のオーバレイ表示ができました。
ソースのCCVideoTestLayer.mを改造してみました。


- (void) test2CCVideoPlayer
{
[CCVideoPlayer playMovieWithFile: @"OP_MEDETAI-NIGHT.m4v"];
// VideoOverlayView上にビットマップ画像をオーバレイさせる
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"toko_back_small01.png"]];
[imageView setCenter:ccp(240, 80)];
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
NSArray *array = [keyWindow subviews];
NSString *str;
id target;
for (target in array) 
{
str = NSStringFromClass([target class]);
if ([str isEqualToString:@"VideoOverlayView"]) 
{
[(UIView *)target addSubview: imageView];
[imageView release];
CGAffineTransform transformRotate = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI/2);
imageView.transform = transformRotate;
break;
}
}

/*
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2.0];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
img.center = CGPointMake(videoView.center.x, videoView.center.y);
img.alpha = 0.0;
[UIView commitAnimations];
*/
//
}