您的位置:首页 > 移动开发 > Cocos引擎

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中添加一个加速计方法

-(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];
现在在真机上可以看出效果了;另外今天的代码是在上次的基础上实现的,所以有的地方描述的不够详细,主要是记录一下思路,代码比较粗糙,大家将就看吧;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐