iphone游戏开发之cocos2d ( 八 )使用加速计(重力感应)控制精灵移动UIAcceleration
2013-01-15 14:29
661 查看
holydancer原创,如需转载,请在显要位置注明:
转自holydancer的CSDN专栏,专栏地址:http://blog.csdn.net/holydancer
上次我们实现了一个不停运动的精灵(一个不停摇尾巴的小鱼),今天我们来尝试用重力感应控制这个小鱼的游动,通过摇摆倾斜手上的设备(模拟器不行,像GPS,加速计这些都需要硬件支持的,你懂的),来控制精灵的游动,像好多赛车游戏,都需要用到这种技术;
首先需要强调的是ios设备上,包括大部分设备上的加速计都是支持三轴立体感应的,我们将iphone屏幕向上放到桌上,那么z轴上的力就是-1g,如果竖着放(home键在下)那么Y轴上的力就是-1g;g是单位,我们在应用中调用的一般都是纯粹的符点数字,甩一甩或者摇一下的话,那么作用在某一个方向上的力就会突然加大,力度不同,值也不同,一般情况下绝对值会在1.5左右;另外在cocos2d中,只需要开启加速计支持,不需要再额外设定delegate,该层就可以直接调用-(void)accelerometer: didAccelerate:方法来获取加速计返的数值;
核心方法有两个:
-(void)update:(ccTime)delta
//用来根据返回不同的加速计值来更新精灵的位置;
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
//用来读取加速计返回的值并设定一下灵敏度之类;
在IntroLayer.h中设定一个
CGPoint posChange,用来根据加速计返回的力值来做出不同的精灵移动速率;
在IntroLayer.m中开启加速计功能,我们的操作要在该层上进行,所以该层要响应加速计方法;
layer.isAccelerometerEnabled=YES;
在IntroLayer.m中添加一个加速计方法
其中acceleration.x,acceleration.y分别是在x轴和y轴上的力,有正负之分,代表中左右上下的不同倾斜,acceleration.z我们用不到,这里不考虑;
其中
然后实现update方法,实现每帧画面的变化;
-(void)update:(ccTime)delta
{
CCSprite *sprite = (CCSprite *)[self getChildByTag:1];
CGPoint pos = [self getChildByTag:1].position;
pos.y -= posChange.x;
//因为坐标系的原因,这里要做下反向处理;
//该项目我是默认的横屏的,所以精灵的位置坐标是以左下角为原点的;
pos.x += posChange.y;
//下面是用来使精灵不至于飞到界面外;
if (pos.x>1024) {
//我用的是ipad,所以分辨率为1024 x 768
pos.x = 1024;
posChange.x = 0;
posChange.y = 0;
}
if (pos.x<0) {
pos.x = 0;
posChange.x = 0;
posChange.y = 0;
}
if (pos.y>768) {
pos.y = 768;
posChange.x = 0;
posChange.y = 0;
}
if (pos.y<0) {
pos.y = 0;
posChange.x = 0;
posChange.y = 0;
}
[self getChildByTag:1].position = pos;
CCLOG(@"pos.x = %f,pos.y = %f,sprite.content.size.width=%f",pos.x,pos.y,sprite.contentSize.width);
//用来跟踪精灵的坐标;
}
最后在该层的onEnter方法中记得调用
[selfscheduleUpdate];
现在在真机上可以看出效果了;另外今天的代码是在上次的基础上实现的,所以有的地方描述的不够详细,主要是记录一下思路,代码比较粗糙,大家将就看吧;
转自holydancer的CSDN专栏,专栏地址:http://blog.csdn.net/holydancer
上次我们实现了一个不停运动的精灵(一个不停摇尾巴的小鱼),今天我们来尝试用重力感应控制这个小鱼的游动,通过摇摆倾斜手上的设备(模拟器不行,像GPS,加速计这些都需要硬件支持的,你懂的),来控制精灵的游动,像好多赛车游戏,都需要用到这种技术;
首先需要强调的是ios设备上,包括大部分设备上的加速计都是支持三轴立体感应的,我们将iphone屏幕向上放到桌上,那么z轴上的力就是-1g,如果竖着放(home键在下)那么Y轴上的力就是-1g;g是单位,我们在应用中调用的一般都是纯粹的符点数字,甩一甩或者摇一下的话,那么作用在某一个方向上的力就会突然加大,力度不同,值也不同,一般情况下绝对值会在1.5左右;另外在cocos2d中,只需要开启加速计支持,不需要再额外设定delegate,该层就可以直接调用-(void)accelerometer: didAccelerate:方法来获取加速计返的数值;
核心方法有两个:
-(void)update:(ccTime)delta
//用来根据返回不同的加速计值来更新精灵的位置;
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
//用来读取加速计返回的值并设定一下灵敏度之类;
在IntroLayer.h中设定一个
CGPoint posChange,用来根据加速计返回的力值来做出不同的精灵移动速率;
在IntroLayer.m中开启加速计功能,我们的操作要在该层上进行,所以该层要响应加速计方法;
layer.isAccelerometerEnabled=YES;
在IntroLayer.m中添加一个加速计方法
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { posChange.x = posChange.x *0.4f+ acceleration.x *7.0f; posChange.y = posChange.y *0.4f+ acceleration.y *7.0f; // CCLOG(@"acceleration.x = %f,acceleration.y = %f,posChange.x=%f,posChange.y =%f ",acceleration.x,acceleration.y,posChange.x,posChange.y); if (posChange.x>100) { posChange.x=100; } if (posChange.x<-100) { posChange.x=-100; } if (posChange.y>100) { posChange.y=100; } if (posChange.y<-100) { posChange.y=-100; } }
其中acceleration.x,acceleration.y分别是在x轴和y轴上的力,有正负之分,代表中左右上下的不同倾斜,acceleration.z我们用不到,这里不考虑;
其中
posChange.x = posChange.x *0.4f+ acceleration.x *7.0f;这个计算是为了将返回的不同方向的值转化为每帧精灵移动的距离,0.4和7.0大家可以随意做更改,一般可以多做几次尝试来调试出合适的参数,赛车游戏中不同车的操控感也是因为这个算法不同引起的;
然后实现update方法,实现每帧画面的变化;
-(void)update:(ccTime)delta
{
CCSprite *sprite = (CCSprite *)[self getChildByTag:1];
CGPoint pos = [self getChildByTag:1].position;
pos.y -= posChange.x;
//因为坐标系的原因,这里要做下反向处理;
//该项目我是默认的横屏的,所以精灵的位置坐标是以左下角为原点的;
pos.x += posChange.y;
//下面是用来使精灵不至于飞到界面外;
if (pos.x>1024) {
//我用的是ipad,所以分辨率为1024 x 768
pos.x = 1024;
posChange.x = 0;
posChange.y = 0;
}
if (pos.x<0) {
pos.x = 0;
posChange.x = 0;
posChange.y = 0;
}
if (pos.y>768) {
pos.y = 768;
posChange.x = 0;
posChange.y = 0;
}
if (pos.y<0) {
pos.y = 0;
posChange.x = 0;
posChange.y = 0;
}
[self getChildByTag:1].position = pos;
CCLOG(@"pos.x = %f,pos.y = %f,sprite.content.size.width=%f",pos.x,pos.y,sprite.contentSize.width);
//用来跟踪精灵的坐标;
}
最后在该层的onEnter方法中记得调用
[selfscheduleUpdate];
现在在真机上可以看出效果了;另外今天的代码是在上次的基础上实现的,所以有的地方描述的不够详细,主要是记录一下思路,代码比较粗糙,大家将就看吧;
相关文章推荐
- iphone游戏开发之cocos2d(四)cocos2d中的常用类及使用方法粗览,导演,场景,层,精灵;
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- 【iphone游戏开发】iphone-Cocos2d游戏开发之四:精灵实现缩放,旋转,跳动,移动等动画
- 【iphone游戏开发】iphone-Cocos2d游戏开发之四:精灵实现缩放,旋转,跳动,移动等动画
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- 【iphone游戏开发】iphone-Cocos2d游戏开发之四:精灵实现缩放,旋转,跳动,移动等动画
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- iphone游戏开发之cocos2d ( 十 )使用纹理图册,更方便生成精灵动画
- iphone游戏开发之cocos2d( 十一 )使用CCSpriteBatchNode和纹理图册,提高精灵动画效率;
- 【Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint)
- Python游戏开发-04-键盘方向键控制精灵移动和翻转(基于Python游戏开发-01)
- 《Cocos2d-x for iPhone游戏开发实例详解---1.2 绘制精灵》
- cocos2d-x游戏开发系列教程-坦克大战游戏之虚拟手柄控制坦克移动
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- 如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵
- Cocos2d-x自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》(2)
- cocos2d-x游戏开发系列教程-坦克大战游戏之虚拟手柄控制坦克移动
- Cocos2d-x自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》(2) cocos2dx 3.3移植版