好记性不如铅笔头

C && C++, cocos2dx, 编程

cocos2dx:转盘吸附效果

最近项目中用到了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();
}

 备注:

由于时间紧张,作者没有在网上仔细寻找现成代码, 而是自己写了一套,感觉效果还不错,就没有再搜索其他方案。

发表评论

9 + 10 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据