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

Posted

技术标签:

【中文标题】如何在 cocos2D 应用程序中拍照(iOS 6)【英文标题】:How can i take photo in cocos2D application (iOS 6) 【发布时间】:2013-07-24 14:35:50 【问题描述】:

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

请在这个问题上帮助我,把代码的sn-p或者有用的教程或者给我你的黄金建议。

【问题讨论】:

【参考方案1】:

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

这是来自博客的文字,希望对您有所帮助!

我正在开发一个基于 cocos2d 的点击游戏,但我无法运行我的游戏两次。很明显,我没有正确关闭第一个游戏或正确构建第二个游戏,或两者兼而有之!

网上有很多教程教你如何将 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 有游戏 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,启用多点触控,然后设置director。 (我把它放在另一个方法中,因为我错误地认为我需要在别处调用它。结果我不需要。)

- (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 小部件。涅槃。

【讨论】:

嘿,感谢您的金色接力,它的解释真棒..:) 但是我如何在我的情况下应用它:我正在从 helloWorldLayer 拍照 我猜你还需要在游戏的 TOP 上添加一层。 我很高兴它有帮助。我记得我的应用程序编码是多么令人沮丧,直到我发现我需要第三层。

以上是关于如何在 cocos2D 应用程序中拍照(iOS 6)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 上拍照并保存在 SQLite 数据库中

Shader程序无法在Cocos2d 2.2 Obj.C iOS 12中运行

Cocos2D 与 iOS6 错误旋转

CDAudioManager (cocos2d, ios) 如何混合游戏音乐和背景音乐,让它们同时播放

如何在ios(Cocos2d)中将字符串转换为音频(声音)文件?

如何从单视图应用程序启动 cocos2D 游戏