直接上代码:

//
// OvalAction.h
// LSWGameIOS
//
// Created by lsw on 14-10-27.
//
// #ifndef __LSWGameIOS__OvalAction__
#define __LSWGameIOS__OvalAction__ #include "cocos2d.h" typedef struct OvalConfig {
cocos2d::Vec2 centerPos;
float a;
float b;
bool moveClockDir;
std::pair<int, int> zOrder;
}LOvalConfig; class MoveOvalBy : public cocos2d::ActionInterval {
public:
MoveOvalBy();
~MoveOvalBy(); bool initWithDuration(float dt, const OvalConfig& c);
virtual MoveOvalBy* clone() const override;
virtual MoveOvalBy* reverse() const override;
virtual void update(float dt);
virtual void startWithTarget(cocos2d::Node *target) override; static MoveOvalBy* create(float dt, const OvalConfig& c); protected:
OvalConfig _config; inline float getPosXAtOval(float dt) {
if (_config.moveClockDir) {
return _config.a * cos(4 * MATH_PIOVER2 * dt);
}
return _config.a * cos(4 * MATH_PIOVER2 * (1 - dt));
} inline float getPosYAtOval(float dt) {
if (_config.moveClockDir) {
return _config.b * sin(4 * MATH_PIOVER2 * dt);
}
return _config.b * sin(4 * MATH_PIOVER2 * (1 - dt));
} }; #endif /* defined(__LSWGameIOS__OvalAction__) */

cpp文件:

//
// OvalAction.cpp
// LSWGameIOS
//
// Created by lsw on 14-10-27.
//
// #include "OvalAction.h" USING_NS_CC; MoveOvalBy::MoveOvalBy()
{ } MoveOvalBy::~MoveOvalBy()
{ } MoveOvalBy *MoveOvalBy::create(float dt, const OvalConfig &c)
{
auto moveOvalBy = new MoveOvalBy();
if (moveOvalBy && moveOvalBy->initWithDuration(dt, c))
{
moveOvalBy->autorelease();
return moveOvalBy;
} return nullptr;
} bool MoveOvalBy::initWithDuration(float dt, const OvalConfig &c)
{
if (ActionInterval::initWithDuration(dt))
{
_config = c;
return true;
} return false;
} void MoveOvalBy::update(float dt)
{
if (_target)
{
float x = getPosXAtOval(dt);
float y = getPosYAtOval(dt);
_target->setPosition(_config.centerPos + Vec2(x, y));
if (dt <= 0.5)
{
_target->setZOrder(_config.zOrder.first);
}
else
{
_target->setZOrder(_config.zOrder.second);
}
}
} MoveOvalBy *MoveOvalBy::clone() const
{
auto moveOvalBy = new MoveOvalBy();
if (moveOvalBy && moveOvalBy->initWithDuration(_duration, _config))
{
moveOvalBy->autorelease();
return moveOvalBy;
} return nullptr;
} MoveOvalBy *MoveOvalBy::reverse() const
{
OvalConfig newConfig;
newConfig.a = _config.a;
newConfig.b = _config.b;
newConfig.centerPos = _config.centerPos;
newConfig.moveClockDir = !_config.moveClockDir;
newConfig.zOrder = _config.zOrder;
return MoveOvalBy::create(_duration, newConfig);
} void MoveOvalBy::startWithTarget(Node *target)
{
ActionInterval::startWithTarget(target);
}

调用方法:

auto s1 = Sprite::create("CloseSelected.png");
addChild(s1);
s1->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));
auto s2 = Sprite::create("CloseNormal.png");
addChild(s2);
OvalConfig c;
c.a = 100;
c.b = 10;
c.centerPos = s1->getPosition();
c.moveClockDir = false;
c.zOrder.first = -1;
c.zOrder.second = 1;
s2->runAction(RepeatForever::create(MoveOvalBy::create(1.0f, c)));

最新文章

  1. laravel中TokenMismatchException异常处理
  2. 0012 win7x64安装CentOS7
  3. BZOJ 1208: [HNOI2004]宠物收养所
  4. json 数据交换格式与java
  5. 【BZOJ】2152: 聪聪可可(点分治)
  6. NimBus一个好的开发框架
  7. android中的Handler
  8. awk多个数组的使用
  9. java提高篇(十四)-----关键字final
  10. HDU 3696 Farm Game
  11. IOS开发创建开发证书及发布App应用(一)——流程说明
  12. 关于java中,json字符串转集合和对象,或者集合转json字符串的解决方法
  13. Devexpress GridControl 多选
  14. 在SoapUI中模拟用户操作
  15. 什么是Zookeeper?
  16. linux下yum安装及配置
  17. Linuxs升级系统自带的openssh
  18. thinkphp 3.2.1 URL 大小写问题 下面有具体说明
  19. windows7下的一个好玩的,你绝对不知道
  20. IO流-基础

热门文章

  1. Incorrect key file for table &#39;/tmp/#sql_882_0.MYI&#39;; try to repair it
  2. 函数fsp_fill_free_list
  3. DataGridView 相关操作
  4. 51nod1556 计算
  5. ASP.NET MVC 4 WebAPI. Support Areas in HttpControllerSelector
  6. HDU 5339 Untitled (暴力枚举)
  7. python练习程序(c100经典例10)
  8. win7下的IP-主机名映射
  9. mysql 在大型应用中的架构演变
  10. makefile实例(3)-多个文件实例优化