[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-02-19 标题cocos2dx学习笔记自定义动作实现圆周运动分类编程 / C C / cocos2dx 标签cocos2dx·自定义动作cocos2dx学习笔记自定义动作实现圆周运动备注数学复习实现方式最近在翻帖子的时候发现很多大牛都自己实现自定义动作而不是通过各种动作进行组合正好最近需要一个圆周运动的效果就自己写了一个自定义的动作这里备注下大致的实现思路。备注该动作并未实际应用在游戏中可能有bug。数学复习截图来自【 http://202.113.29.3/nankaisource/mathhands/Elementary mathematics/0103/010301/01030101.htm 】实现方式可参考这篇文章来实现【 http://blog.csdn.net/u012945598/article/details/17605409 】作者自己也写了一个功能增强版的圆周运动可以实现螺旋线式的圆周运动。代码比较简单就不在细说了。自己的实现CircleMoveAct.h#ifndef__CIRCLE_MOVE_ACT_H__#define__CIRCLE_MOVE_ACT_H__#includecocos2d.h//http://202.113.29.3/nankaisource/mathhands/Elementary%20mathematics/0103/010301/01030101.htmclassCircleMoveAct:publiccocos2d::CCActionInterval{public:boolinitWithDuration(floatduration,constcocos2d::CCPointcenter,floatscaleDiff,floatangle);virtualcocos2d::CCObject*copyWithZone(cocos2d::CCZone*pZone);virtualvoidstartWithTarget(cocos2d::CCNode*pTarget);virtualvoidupdate(floattime);public:staticCircleMoveAct*create(floatduration,constcocos2d::CCPointcenter,floatscale,floatangle);protected:floatm_duration;cocos2d::CCPoint m_center;floatm_scaleDiff;floatm_currScale;floatm_angle;floatm_anglePreFrame;intm_frameCnts;cocos2d::CCPoint m_initPos;};#endif// __CIRCLE_MOVE_ACT_H__CircleMoveAct.cpp#includeCircleMoveAct.hUSING_NS_CC;CircleMoveAct*CircleMoveAct::create(floatduration,constCCPointcenter,floatscale,floatangle){CircleMoveAct*pRetnewCircleMoveAct();pRet-initWithDuration(duration,center,scale,angle);pRet-autorelease();returnpRet;}boolCircleMoveAct::initWithDuration(floatduration,constCCPointcenter,floatscaleDiff,floatangle){if(CCActionInterval::initWithDuration(duration)){this-m_durationduration;this-m_centercenter;this-m_scaleDiffscaleDiff;this-m_currScale1.0f;this-m_angleangle;/************************************************************************//* 计算每次update调用时需要转动的弧度 *//************************************************************************/this-m_anglePreFrameangle/duration*CCDirector::sharedDirector()-getAnimationInterval()/(180/M_PI);this-m_frameCnts0;returntrue;}returnfalse;}CCObject*CircleMoveAct::copyWithZone(CCZone*pZone){CCZone*pNewZoneNULL;CircleMoveAct*pCopyNULL;if(pZonepZone-m_pCopyObject){pCopy(CircleMoveAct*)(pZone-m_pCopyObject);}else{pCopynewCircleMoveAct();pZonepNewZonenewCCZone(pCopy);}CCActionInterval::copyWithZone(pZone);pCopy-initWithDuration(m_duration,m_center,m_scaleDiff,m_angle);CC_SAFE_DELETE(pNewZone);returnpCopy;}voidCircleMoveAct::startWithTarget(CCNode*pTarget){CCActionInterval::startWithTarget(pTarget);m_initPospTarget-getPosition();}voidCircleMoveAct::update(floattime){m_frameCnts;m_currScalem_scaleDiff;CCPoint newPosccpRotateByAngle(m_initPos,m_center,m_frameCnts*m_anglePreFrame);CCPoint diffccpSub(newPos,m_center);newPosdiff*m_currScalem_center;m_pTarget-setPosition(newPos);//debug#if0CCDrawNode*nodeCCDrawNode::create();node-drawDot(newPos,3,ccc4f(128,128,128,128));m_pTarget-getParent()-addChild(node);#endif}正常调用方式CCSize sizeCCDirector::sharedDirector()-getVisibleSize();CCSprite*testCCSprite::create(CloseNormal.png);test-setPosition(ccp(size.width/220,size.height/2));//设置起点test-setAnchorPoint(ccp(0.5,0.5));//设置用时圆心是否缩放(不缩放设置为0.0f)旋转角度CircleMoveAct*actCircleMoveAct::create(10,ccp(size.width/2,size.height/2),0.0f,1500);test-runAction(act);this-addChild(test);截图如下缩放调用方式CCSize sizeCCDirector::sharedDirector()-getVisibleSize();CCSprite*testCCSprite::create(CloseNormal.png);test-setPosition(ccp(size.width/220,size.height/2));//设置起点test-setAnchorPoint(ccp(0.5,0.5));//设置用时圆心缩放递增值0.01f旋转角度CircleMoveAct*actCircleMoveAct::create(10,ccp(size.width/2,size.height/2),0.01f,1500);test-runAction(act);this-addChild(test);截图如下