我知道我需要使用 UIImagePickerController
从library 拍照或手动 拍照。
我在 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
。
请在这个问题上帮助我,把代码片段或有用的教程或给我你的黄金建议。
最佳答案
我猜您的 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];
}
有一个 View 需要注意的事情。 GameViewController 有游戏 UIButtons、得分 UILabels 和其他游戏类型的 UI 小部件。这让我可以在 Interface Builder 中做很多游戏控制,而不是手动布置它们。我首先初始化 srandom 只是为了播种随机数生成器。然后我隐藏了状态栏,因为游戏是全屏的。
我通过单例获取我的 cocos2d 实例,获取它的 glView 并将其插入到 GameViewController 的 View 中的索引 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];
}
}
请注意我们如何以不同方式对待第一次运行和第二次运行。对于第二次和后续运行,我们用新场景替换场景。这避免了所有“重启”问题。另请注意,我设置了一个委托(delegate)。我使用委托(delegate)协议(protocol)在我的游戏层和我的 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,启用多点触控,然后设置 Controller 。 (我把它放在另一个方法中,因为我错误地认为我需要在别处调用它。结果我不需要。)
- (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 小部件。涅盘。
关于iphone - 我如何在 cocos2D 应用程序中拍照 (iOS 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17837144/