对cocos2d iphone的朝向处理的改进
2010-05-04 00:27
148 查看
我用cocos2d iphone作为我的iPhone/iPad游戏已经有一阵子了。cocos2d iphone是个经过考验的、方便使用的引擎,而且让你几乎可以很快地进行gameplay方面的开发。最近它加入了iPad的支持。然而,Apple对于iPad游戏的审批似乎比iPhone更严格了一些。因为iPad Human Interface Guideline中对于朝向敏感方面,对开发者做出了更高的要求。
鉴于以上原因,我准备让我的游戏变得对朝向改变更友好一点。在cocos2d iphone中,朝向的改变可以用注册UIDeviceOrientationDidChangeNotification事件后,再调用一些CCDirector的方法予以解决:
代码CGAffineTransform CGAffineTransformInterpolate(const CGAffineTransform *t0, const CGAffineTransform *t1, float factor)
{
// clamp factor to [0, 1]
if ( factor > 1 )
factor = 1;
if ( factor < 0 )
factor = 0;
return CGAffineTransformMake(t0->a*(1-factor) + t1->a*factor,
t0->b*(1-factor) + t1->b*factor,
t0->c*(1-factor) + t1->c*factor,
t0->d*(1-factor) + t1->d*factor,
t0->tx*(1-factor) + t1->tx*factor,
t0->ty*(1-factor) + t1->ty*factor);
}
// in your CCDirector.m:
- (void) setDeviceOrientation:(ccDeviceOrientation) orientation
{
if( deviceOrientation_ != orientation ) {
deviceOrientation_ = orientation;
targetTransform_ = CGAffineTransformIdentity;
elapsedSinceLastOrientationChange_ = 0;
CGSize s = [openGLView_ frame].size;
float w = s.width / 2;
float h = s.height / 2;
switch( deviceOrientation_) {
case CCDeviceOrientationPortrait:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortrait animated:NO];
break;
case CCDeviceOrientationPortraitUpsideDown:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortraitUpsideDown animated:NO];
targetTransform_ = CGAffineTransformTranslate(targetTransform_, w, h);
targetTransform_ = CGAffineTransformRotate(targetTransform_, CC_DEGREES_TO_RADIANS(180));
targetTransform_ = CGAffineTransformTranslate(targetTransform_, -w, -h);
break;
case CCDeviceOrientationLandscapeLeft:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];
targetTransform_ = CGAffineTransformTranslate(targetTransform_, w, h);
targetTransform_ = CGAffineTransformRotate(targetTransform_, -CC_DEGREES_TO_RADIANS(90));
targetTransform_ = CGAffineTransformTranslate(targetTransform_, -h, -w);
break;
case CCDeviceOrientationLandscapeRight:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeLeft animated:NO];
targetTransform_ = CGAffineTransformTranslate(targetTransform_, w, h);
targetTransform_ = CGAffineTransformRotate(targetTransform_, CC_DEGREES_TO_RADIANS(90));
targetTransform_ = CGAffineTransformTranslate(targetTransform_, -h, -w);
break;
default:
NSLog(@"Director: Unknown device orientation");
break;
}
}
}
-(void) applyLandscape
{
static float m[16];
if ( elapsedSinceLastOrientationChange_ < 0.25f )
{
currentTransform_ = CGAffineTransformInterpolate(¤tTransform_, &targetTransform_,
elapsedSinceLastOrientationChange_ / 0.25f);
elapsedSinceLastOrientationChange_ += dt;
}
else
{
currentTransform_ = targetTransform_;
}
CGAffineToGL(¤tTransform_, m);
glMultMatrixf(m);
}
现在,cocos2d的朝向处理就可以有漂亮的切换动画了。我把patch文件上传了,如果有兴趣的话可以下载看看。我是基于cocos2d iphone 0.99.0的代码做的。
鉴于以上原因,我准备让我的游戏变得对朝向改变更友好一点。在cocos2d iphone中,朝向的改变可以用注册UIDeviceOrientationDidChangeNotification事件后,再调用一些CCDirector的方法予以解决:
代码CGAffineTransform CGAffineTransformInterpolate(const CGAffineTransform *t0, const CGAffineTransform *t1, float factor)
{
// clamp factor to [0, 1]
if ( factor > 1 )
factor = 1;
if ( factor < 0 )
factor = 0;
return CGAffineTransformMake(t0->a*(1-factor) + t1->a*factor,
t0->b*(1-factor) + t1->b*factor,
t0->c*(1-factor) + t1->c*factor,
t0->d*(1-factor) + t1->d*factor,
t0->tx*(1-factor) + t1->tx*factor,
t0->ty*(1-factor) + t1->ty*factor);
}
// in your CCDirector.m:
- (void) setDeviceOrientation:(ccDeviceOrientation) orientation
{
if( deviceOrientation_ != orientation ) {
deviceOrientation_ = orientation;
targetTransform_ = CGAffineTransformIdentity;
elapsedSinceLastOrientationChange_ = 0;
CGSize s = [openGLView_ frame].size;
float w = s.width / 2;
float h = s.height / 2;
switch( deviceOrientation_) {
case CCDeviceOrientationPortrait:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortrait animated:NO];
break;
case CCDeviceOrientationPortraitUpsideDown:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortraitUpsideDown animated:NO];
targetTransform_ = CGAffineTransformTranslate(targetTransform_, w, h);
targetTransform_ = CGAffineTransformRotate(targetTransform_, CC_DEGREES_TO_RADIANS(180));
targetTransform_ = CGAffineTransformTranslate(targetTransform_, -w, -h);
break;
case CCDeviceOrientationLandscapeLeft:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];
targetTransform_ = CGAffineTransformTranslate(targetTransform_, w, h);
targetTransform_ = CGAffineTransformRotate(targetTransform_, -CC_DEGREES_TO_RADIANS(90));
targetTransform_ = CGAffineTransformTranslate(targetTransform_, -h, -w);
break;
case CCDeviceOrientationLandscapeRight:
[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeLeft animated:NO];
targetTransform_ = CGAffineTransformTranslate(targetTransform_, w, h);
targetTransform_ = CGAffineTransformRotate(targetTransform_, CC_DEGREES_TO_RADIANS(90));
targetTransform_ = CGAffineTransformTranslate(targetTransform_, -h, -w);
break;
default:
NSLog(@"Director: Unknown device orientation");
break;
}
}
}
-(void) applyLandscape
{
static float m[16];
if ( elapsedSinceLastOrientationChange_ < 0.25f )
{
currentTransform_ = CGAffineTransformInterpolate(¤tTransform_, &targetTransform_,
elapsedSinceLastOrientationChange_ / 0.25f);
elapsedSinceLastOrientationChange_ += dt;
}
else
{
currentTransform_ = targetTransform_;
}
CGAffineToGL(¤tTransform_, m);
glMultMatrixf(m);
}
现在,cocos2d的朝向处理就可以有漂亮的切换动画了。我把patch文件上传了,如果有兴趣的话可以下载看看。我是基于cocos2d iphone 0.99.0的代码做的。
相关文章推荐
- [iphone-cocos2d]关于Loading的若干处理和讨论
- Cocos2D-iphone CCLayer中的两种触摸(touch)处理方式
- cocos2d怎么设置屏幕朝向?横屏 or 竖屏设置
- cocos2d-x中文显示处理
- iPhone开发之游戏篇(1) --- cocos2d的基本概念
- cocos2d 设置iphone竖屏
- cocos2d-x /cocos2d-iphone在mac下环境搭建
- iPhone应用程序编程指南(事件处理)
- cocos2d-iphone编译
- 总结阐述Cocos2d-X与Cocos2d-iphone区别
- Java 处理 iphone拍照后 图片EXIF属性翻转90度的方法
- cocos2d-iPhone基础
- iphone-NSDate日期处理
- Cocos2D-iphone 开发之 音效引擎 CocosDenshion
- PostgreSQL的MVCC并发处理-----转载自互联网,并有所改进
- Cocos2d-iphone 文本渲染系统
- iphone NSString 字符串处理:截取字符串、匹配字符串、分隔字符串
- iPhone开发中的图像处理相关要点
- cocos2d-x基本知识点:事件处理机制之触屏事件1
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)