【2014-02-19】cocos2dx学习笔记:自定义动作实现圆周运动
2026/7/18 5:35:31 网站建设 项目流程

[历史归档]本文原发布于 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__#include"cocos2d.h"//http://202.113.29.3/nankaisource/mathhands/Elementary%20mathematics/0103/010301/01030101.htmclassCircleMoveAct:publiccocos2d::CCActionInterval{public:boolinitWithDuration(floatduration,constcocos2d::CCPoint&center,floatscaleDiff,floatangle);virtualcocos2d::CCObject*copyWithZone(cocos2d::CCZone*pZone);virtualvoidstartWithTarget(cocos2d::CCNode*pTarget);virtualvoidupdate(floattime);public:staticCircleMoveAct*create(floatduration,constcocos2d::CCPoint&center,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:

#include"CircleMoveAct.h"USING_NS_CC;CircleMoveAct*CircleMoveAct::create(floatduration,constCCPoint&center,floatscale,floatangle){CircleMoveAct*pRet=newCircleMoveAct();pRet->initWithDuration(duration,center,scale,angle);pRet->autorelease();returnpRet;}boolCircleMoveAct::initWithDuration(floatduration,constCCPoint&center,floatscaleDiff,floatangle){if(CCActionInterval::initWithDuration(duration)){this->m_duration=duration;this->m_center=center;this->m_scaleDiff=scaleDiff;this->m_currScale=1.0f;this->m_angle=angle;/************************************************************************//* 计算每次update调用时需要转动的弧度 *//************************************************************************/this->m_anglePreFrame=angle/duration*CCDirector::sharedDirector()->getAnimationInterval()/(180/M_PI);this->m_frameCnts=0;returntrue;}returnfalse;}CCObject*CircleMoveAct::copyWithZone(CCZone*pZone){CCZone*pNewZone=NULL;CircleMoveAct*pCopy=NULL;if(pZone&&pZone->m_pCopyObject){pCopy=(CircleMoveAct*)(pZone->m_pCopyObject);}else{pCopy=newCircleMoveAct();pZone=pNewZone=newCCZone(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_initPos=pTarget->getPosition();}voidCircleMoveAct::update(floattime){m_frameCnts++;m_currScale+=m_scaleDiff;CCPoint newPos=ccpRotateByAngle(m_initPos,m_center,m_frameCnts*m_anglePreFrame);CCPoint diff=ccpSub(newPos,m_center);newPos=diff*m_currScale+m_center;m_pTarget->setPosition(newPos);//debug#if0CCDrawNode*node=CCDrawNode::create();node->drawDot(newPos,3,ccc4f(128,128,128,128));m_pTarget->getParent()->addChild(node);#endif}

正常调用方式:

CCSize size=CCDirector::sharedDirector()->getVisibleSize();CCSprite*test=CCSprite::create("CloseNormal.png");test->setPosition(ccp(size.width/2+20,size.height/2));//设置起点test->setAnchorPoint(ccp(0.5,0.5));//设置用时,圆心,是否缩放(不缩放设置为0.0f),旋转角度CircleMoveAct*act=CircleMoveAct::create(10,ccp(size.width/2,size.height/2),0.0f,1500);test->runAction(act);this->addChild(test);

截图如下:

缩放调用方式:

CCSize size=CCDirector::sharedDirector()->getVisibleSize();CCSprite*test=CCSprite::create("CloseNormal.png");test->setPosition(ccp(size.width/2+20,size.height/2));//设置起点test->setAnchorPoint(ccp(0.5,0.5));//设置用时,圆心,缩放递增值0.01f,旋转角度CircleMoveAct*act=CircleMoveAct::create(10,ccp(size.width/2,size.height/2),0.01f,1500);test->runAction(act);this->addChild(test);

截图如下:

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询