1

ライブラリUIImagePickerControllerから写真を撮るか、手動で撮るために使用する必要があることを知っています。

私のアプリケーションはcocos2D (iOS 6)で、手動またはライブラリから写真を撮る機能を配置する必要があります。

私のコードは次のとおりです。

.hファイル

@interface HelloWorldLayer : CCLayer <UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIActionSheetDelegate>

.mファイル

-(void)btnTakePhotoPressed:(UIButton *) Sender
{
    UIActionSheet *actionsheet = [[UIActionSheet alloc] initWithTitle:@"Take photo" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Take photo from camera", @"Select from library", nil];
    [actionsheet  showFromRect:Sender.frame inView:self.scrollView animated:YES];
}

#pragma Mark -
#pragma Mark - ActionSheet Delegate Methods

  - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
     [[XPSModal sharedInstance] hide];

    UIImagePickerController *imgPicker=[[UIImagePickerController alloc] init];
    imgPicker.delegate=self;
    imgPicker.wantsFullScreenLayout = YES;
    imgPicker.allowsEditing=YES;

    if(buttonIndex == 0)
    {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
            imgPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        else
            imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    }
    else if (buttonIndex==1)
    {
        imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    }

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:imgPicker];
    self.popoverController.delegate = self;
    [self.popoverController presentPopoverFromRect:[self.btnTakePhoto bounds] inView:[[CCDirector sharedDirector] view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    UIImage *newImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [picker dismissModalViewControllerAnimated:YES];
    //[picker.view removeFromSuperview];

    CCSprite *imageFromPicker = [CCSprite spriteWithCGImage:newImage.CGImage key:@"ImageFromPicker"];
    [self addChild:imageFromPicker];

}

このコードを実行するUIImagePickerControllerと表示されますが、画像を選択したり実行したりできません。また、削除することもできませんUIImagePickerController

この問題で私を助けてください、コードのスニペットまたは有用なチュートリアルを入れるか、あなたの黄金の提案をしてください.

4

1 に答える 1

1

あなたのcocos2dレイヤーはアクションシートの上にあると思います。私は最近、UIKit レイヤー、Cocos2D レイヤー、そして cocos2D レイヤーの上に UIKit レイヤーを持つアプリを作成しました。それが機能するようになるまでにしばらく時間がかかり、それについてのブログエントリを書きました. ここでそれを読むことができます: http://www.notthepainter.com/full-cocos2d-uikit-integration/

これがブログのテキストです。お役に立てば幸いです。

cocos2d ベースのタッピング ゲームに取り組んでいましたが、ゲームを 2 回実行できませんでした。最初のゲームを正しくシャットダウンしていなかったり、2 番目のゲームを正しくビルドしていなかったり、あるいはその両方を行っていなかったことは明らかでした!

UIKit ボタンを Cocos2D アプリに追加する方法や、UIKit ベースのアプリから Cocos2D を起動する方法を教えるチュートリアルがウェブ上にたくさんあります。しかし、私は両方を行う必要がありました。ゲームの下に UIViewController が必要で、ゲームの上に UIKit ウィジェットが必要でした。私は多くの時間を読んで、これが私が思いついたものです。

まず、Xcode プロジェクトのビルドは悪夢でした。最終的に cocos2d/box2d テンプレートを使用してから、不要なファイルを取り除き、元のファイルをすべて追加し直しました。AppDelegate.m ファイルは、cocos2d 以外のアプリのように見えます。これは、AppDelegate で cocos2d 環境を構築するようにアドバイスする多くのチュートリアルの粒度に反します。私はそれに苦労し、金曜日のほとんどは運がなかったので、月曜日に Cocos2DSingleton を入れたところ、ほぼ初めて実行されました。

これが私の GameViewController の viewDidLoad メソッドです:

- (void)viewDidLoad
{
    [super viewDidLoad];

    srandom(time(0));

    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];

    TTCocos2DSingleton *shared = [TTCocos2DSingleton sharedCocos2D];
    CCGLView *glView = [shared currentGLView];

    [self.view insertSubview:glView atIndex:1];
}

注意すべきビューがあります。GameViewController には、ゲーム UIButton、スコア UILabels、およびその他のゲーム タイプの UI ウィジェットがあります。これにより、手作業でレイアウトするのではなく、Interface Builder で多くのゲーム コントロールを行うことができます。最初に、乱数ジェネレーターをシードするためだけに srandom を初期化します。ゲームがフルスクリーンなので、ステータスバーを非表示にします。

シングルトン経由で cocos2d インスタンスを取得し、その glView を取得して、これを GameViewController のビューのインデックス 1 に挿入します。これにより、すべてのゲーム コントロールの下に配置されます。後で sharedCocos2D メソッドを紹介します。viewWillAppear を見てみましょう。

- (void) viewWillAppear:(BOOL)animated
{
    if(![[CCDirector sharedDirector]  runningScene]){
        CCScene *scene = [MyGameLayer scene];

        myGame = [MyGameLayer node];
        myGame.delegate = self;

        [scene addChild: myGame];

        [[CCDirector sharedDirector] runWithScene:scene];
    } else {
        // we have a scene already, replace the original to get a new game
        [[CCDirector sharedDirector] startAnimation];

        CCScene *scene = [MyGameLayer scene];

        myGame = [MyGameLayer node];
        myGame.delegate = self;

        [scene addChild: myGame];

        [[CCDirector sharedDirector] replaceScene:scene];
    }
}

最初の実行を 2 回目の実行とは異なる方法で処理することに注意してください。2 回目以降の実行では、シーンを新しいものに置き換えます。これにより、すべての「再起動」の問題が回避されます。また、デリゲートを設定していることにも注意してください。デリゲート プロトコルを使用して、ゲーム レイヤーと UIViewController の間で通信します。

私のシングルトン パターンは、Duck Rowing ブログから来ています。これは、ブログとしてはかなり素晴らしい名前であることを認めなければなりません。ここですべてのシングルトン コードを紹介するつもりはありません。このブログは cocos2d に関するものですが、cocos2d 環境を構築する方法は次のとおりです。

+ (TTCocos2DSingleton *) sharedCocos2D;
{
    static dispatch_once_t onceQueue;

    dispatch_once(&onceQueue, ^{
        if (sharedInstance) {
            return;
        }
        sharedInstance = [[TTCocos2DSingleton alloc]init];
        // Create an CCGLView with a RGB565 color buffer, and a depth buffer of 0-bits
        sharedInstance->glView = [CCGLView viewWithFrame:[[UIScreen mainScreen] bounds]
                             pixelFormat:kEAGLColorFormatRGB565 //kEAGLColorFormatRGBA8
                             depthFormat:0  //GL_DEPTH_COMPONENT24_OES
                      preserveBackbuffer:NO
                              sharegroup:nil
                           multiSampling:NO
                         numberOfSamples:0];
        [sharedInstance->glView setMultipleTouchEnabled:YES];
        [sharedInstance setupDirector];
    });
    return sharedInstance;

}

シングルトンは、CCGLView をセットアップし、マルチタッチを有効にしてから、ディレクターをセットアップします。(他の方法で呼び出す必要があると誤って考えたので、別のメソッドに入れました。その必要はなかったことがわかりました。)

- (void)setupDirector
{
    CCDirectorIOS *director = (CCDirectorIOS*) [CCDirector sharedDirector];

    [director setView:glView];
    [director enableRetinaDisplay:YES];
    director.wantsFullScreenLayout = YES;
    [director setDisplayStats:NO];
    [director setAnimationInterval:1.0/60];
}

setupDirector では、cocos2d アプリに必要な通常のサスペクトを設定します。これで、ゲームを複数回プレイできるようになりました。その下に完全な UIViewController/UINavController があり、ゲームの上に UIKit ウィジェットがあります。涅槃。

于 2013-07-24T14:40:02.360 に答える