最近项目中用到了cocos2dx来开发一个基于陀螺仪的demo,忙了半个星期,一边学习一边开发,总算搞了出来。这里备份下开发中学习到的一些cocos2dx知识。
CONTENTS
转盘吸附效果的大致实现
demo中用到了一个圆形的转盘,并且要求转盘转动时会吸附。这里备份下大致的代码实现:
首先是两个转盘的旋转函数:
void XX::switchCircleA(float angle) { float old = circleSprite->getRotation(); if (fabsf(old - angle) < 5) { return; } float speed = 360 / 0.3f; float timeNeed = fabsf(old - angle) / speed; circleSprite->stopAllActions(); CCRotateTo *rotateTo = CCRotateTo::create(timeNeed, angle); circleSprite->runAction(rotateTo); } void XX::switchCircleB() { int angle = circleSprite->getRotation(); if (angle < 0) { angle = angle + 360; } if (angle % 90 > 45) { angle = (angle / 90 + 1) * 90; }else { angle = (angle / 90 ) * 90; } int spriteIdx = angle / 90; switch (spriteIdx) { case 0: case 4: { //funA() break; } case 1: { //funB() break; } case 2: { //funC() break; } case 3: { //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); //end void XX::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) { if (pTouches->count() != 1) { return; } CCTouch *curTouch = (CCTouch *)(pTouches->anyObject()); cocos2d::CCPoint currTouchPoint = curTouch->getLocation(); //计算起始触摸偏移角度initOffsetAngle //计算起始转盘已经旋转的角度initAngle CCPoint center = XXXX; initOffsetAngle = ccpToAngle(ccpSub(currTouchPoint, center)); initOffsetAngle = CC_RADIANS_TO_DEGREES(initOffsetAngle); initAngle = circleSel->getRotation(); 。。 } void XX::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) { if (pTouches->count() != 1) { return; } CCTouch *curTouch = (CCTouch *)(pTouches->anyObject()); CCPoint newPoint = curTouch->getLocation(); //防止回调过快导致转盘闪动,按一定策略丢弃部分Move回调 。。 //根据起始触摸偏移角度,转盘起始角度,当前触摸点偏移角度,计算转盘的当前角度angle CCPoint center = XXXX; float newAngle = ccpToAngle(ccpSub(newPoint, center)); newAngle = CC_RADIANS_TO_DEGREES(newAngle); angle = -newAngle + initOffsetAngle + initAngle; switchCircleA(angle); } void XX::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) { switchCircleB(); } void XX::ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) { switchCircleB(); }
备注:
由于时间紧张,作者没有在网上仔细寻找现成代码, 而是自己写了一套,感觉效果还不错,就没有再搜索其他方案。
发表评论