iphone游戏开发之cocos2d ( 八 )使用加速计(重力感应)控制精灵移动UIAcceleration

来源:互联网 发布:淘宝上旗舰店和专卖店 编辑:程序博客网 时间:2024/05/17 00:58

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];

现在在真机上可以看出效果了;另外今天的代码是在上次的基础上实现的,所以有的地方描述的不够详细,主要是记录一下思路,代码比较粗糙,大家将就看吧;