[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2014-01-21| 标题:cocos2dx:转盘吸附效果|分类:编程 / C && C++ / cocos2dx |标签:cocos2dx·吸附效果
cocos2dx:转盘吸附效果
- 转盘吸附效果的大致实现
- 首先是两个转盘的旋转函数:
- 然后重写Layer的触摸:
- 备注:
最近项目中用到了cocos2dx来开发一个基于陀螺仪的demo,忙了半个星期,一边学习一边开发,总算搞了出来。这里备份下开发中学习到的一些cocos2dx知识。
转盘吸附效果的大致实现
demo中用到了一个圆形的转盘,并且要求转盘转动时会吸附。这里备份下大致的代码实现:
首先是两个转盘的旋转函数:
voidXX::switchCircleA(floatangle){floatold=circleSprite->getRotation();if(fabsf(old-angle)<5){return;}floatspeed=360/0.3f;floattimeNeed=fabsf(old-angle)/speed;circleSprite->stopAllActions();CCRotateTo*rotateTo=CCRotateTo::create(timeNeed,angle);circleSprite->runAction(rotateTo);}voidXX::switchCircleB(){intangle=circleSprite->getRotation();if(angle<0){angle=angle+360;}if(angle%90>45){angle=(angle/90+1)*90;}else{angle=(angle/90)*90;}intspriteIdx=angle/90;switch(spriteIdx){case0:case4:{//funA()break;}case1:{//funB()break;}case2:{//funC()break;}case3:{//funD()break;}break;default:}circleSprite->stopAllActions();CCRotateTo*rotateTo=CCRotateTo::create(0.5f,angle);CCEaseBackOut*ease=CCEaseBackOut::create(rotateTo);circleSprite->runAction(ease);}然后重写Layer的触摸:
//使能触摸begin:this->setTouchEnabled(true);//endvoidXX::ccTouchesBegan(CCSet*pTouches,CCEvent*pEvent){if(pTouches->count()!=1){return;}CCTouch*curTouch=(CCTouch*)(pTouches->anyObject());cocos2d::CCPoint currTouchPoint=curTouch->getLocation();//计算起始触摸偏移角度initOffsetAngle//计算起始转盘已经旋转的角度initAngleCCPoint center=XXXX;initOffsetAngle=ccpToAngle(ccpSub(currTouchPoint,center));initOffsetAngle=CC_RADIANS_TO_DEGREES(initOffsetAngle);initAngle=circleSel->getRotation();。。}voidXX::ccTouchesMoved(CCSet*pTouches,CCEvent*pEvent){if(pTouches->count()!=1){return;}CCTouch*curTouch=(CCTouch*)(pTouches->anyObject());CCPoint newPoint=curTouch->getLocation();//防止回调过快导致转盘闪动,按一定策略丢弃部分Move回调。。//根据起始触摸偏移角度,转盘起始角度,当前触摸点偏移角度,计算转盘的当前角度angleCCPoint center=XXXX;floatnewAngle=ccpToAngle(ccpSub(newPoint,center));newAngle=CC_RADIANS_TO_DEGREES(newAngle);angle=-newAngle+initOffsetAngle+initAngle;switchCircleA(angle);}voidXX::ccTouchesEnded(CCSet*pTouches,CCEvent*pEvent){switchCircleB();}voidXX::ccTouchesCancelled(CCSet*pTouches,CCEvent*pEvent){switchCircleB();}备注:
由于时间紧张,作者没有在网上仔细寻找现成代码, 而是自己写了一套,感觉效果还不错,就没有再搜索其他方案。