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

本文介绍了如何在Cocos2d应用中利用重力感应来控制精灵的游动,通过调整加速度计的读数和灵敏度,使精灵能够根据用户的手势进行移动。实现过程涉及引入加速度计支持、计算移动距离、限制精灵位置,最终在真机上展示效果。

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的优快云专栏,专栏地址:http://blog.youkuaiyun.com/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];

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




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值