如何在cocos2D应用程序中拍照(iOS 6)

时间:2013-07-24 14:35:51

标签: iphone ios objective-c cocos2d-iphone

我知道我需要使用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

请帮助我解决这个问题,提供一些代码或有用的教程或给我你的黄金建议。

1 个答案:

答案 0 :(得分:1)

我猜你的cocos2d图层位于操作表的顶部。我最近写了一个应用程序,它有一个UIKit层,一个Cocos2D层,然后是一个位于cocos2D层顶部的UIKit层。它花了一段时间才开始工作,我写了一篇关于它的博客文章。你可以在这里阅读:http://www.notthepainter.com/full-cocos2d-uikit-integration/

以下是博客中的文字,我希望它有所帮助!

我正在开发基于cocos2d的点击游戏,但我无法两次运行游戏。很明显,我没有正确关闭第一场比赛或正确建立第二场比赛,或两者都没有!

网上有很多教程教你如何在你的Cocos2D应用程序中添加UIKit按钮,或者如何从基于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有游戏UIButtons,得分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];
    }
}

请注意我们如何处理第一次运行与第二次运行不同。对于第二次和后续运行,我们用新的场景替换场景。这避免了所有“重启”问题。还要注意我设置了一个委托。我使用委托协议在我的游戏层和我的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小部件。涅。