Cocos2d-x中动作类的扩展

时间:2023-02-08 07:55:46

头文件:CCActionEx.h

#pragma once

#include "..\..\..\cocos2dx\actions\CCActionInterval.h"//包含系统延时类动作头文件
using namespace cocos2d;

/***********************************************
Name:CircleAction
Desc:圆运动轨迹
Auth:Ivan_han@2013-04-23
***********************************************/
/*
   LUA中使用方法:
   --轨迹起点
   self:setPosition(CCPoint(200,300));
   --圆逆时针运动轨迹,参数一为动画时长,参数二为当前圆上位置的对径点坐标,参数三为轨迹方向
   self:runAction(CircleAction:create(3.0, ccp(500,300),1));

    --轨迹起点
    self:setPosition(CCPoint(200,300));
    --圆顺时针运动轨迹,参数一为动画时长,参数二为当前圆上位置的对径点坐标,参数三为轨迹方向
    self:runAction(CircleAction:create(3.0, ccp(500,300),-1));
*/
class  CircleAction : public CCActionInterval
{
public:
    /** initializes the action */
    bool initWithDuration(float duration, const CCPoint& position,int direction);
 
    virtual void startWithTarget(CCNode *pTarget);
    virtual void update(float time);
 
public:
    /** creates the action */
    static CircleAction* create(float duration, const CCPoint& position,int direction);
 
protected: 
    CCPoint m_startPosition;//轨迹起点
    CCPoint m_endPosition;//轨迹终点
 int m_direction;//1表示逆时针Anti-clockwise,-1表示顺时针Clockwise
};

/***********************************************
Name:myAction
Desc:任意运动轨迹,轨迹的参数方程写在LUA脚本中
Auth:Ivan_han@2013-04-23
***********************************************/
/*
   LUA中使用方法:
   --自定义运动轨迹,参数一为动画时长,参数二为表示轨迹参数方程的LUA函数名
   self:runAction(myAction:create(3.0,"CircleTrace"));

   --圆中心为(350,300),半径为150,轨迹起点为(500,300)的逆时针圆轨迹
   --圆运动轨迹,参数一为动画时长,参数二为表示圆轨迹参数方程的LUA函数名,参数三为轨迹起点坐标,参数四为圆心坐标,参数五为正负圈数
   self:runAction(myAction:createCircle(3.0,"CircleTraceFunc",ccp(500,300),ccp(350,300),1));
*/
class  myAction : public CCActionInterval
{
public:
 myAction(){memset(m_TraceFunc,0,sizeof(m_TraceFunc));m_TraceType=0;}

    /** initializes the action */
    bool initWithDuration(float duration,const char *func);
 
    virtual void startWithTarget(CCNode *pTarget);
    virtual void update(float time);
 
public:
    /** creates the action */
 //相当于CC**To
    static myAction* create(float duration,const char *func);
 //带有控制参数的createXXX函数,相当于CC**By
 static myAction* createCircle(float duration,const char *func,const CCPoint& startP,const CCPoint& centerP,float direction);
 
protected:
 char m_TraceFunc[20];//LUA函数名,定义了轨迹的参数方程
 int m_TraceType;//0表示create,1表示createCircle
 //针对圆轨迹的成员变量
    CCPoint m_startP;//轨迹起点
    CCPoint m_centerP;//轨迹中心点
 float m_direction;//1表示逆时针Anti-clockwise,-1表示顺时针Clockwise
};

实现文件CCActionEx.cpp:

 

#include "CCActionEx.h"
#include "..\..\..\cocos2dx\support\CCPointExtension.h"
#include "..\..\..\scripting\lua\cocos2dx_support\CCLuaEngine.h"
#include "..\..\..\scripting\lua\tolua\tolua++.h"

void CircleAction::startWithTarget(CCNode *pTarget){
    CCActionInterval::startWithTarget(pTarget);
    m_startPosition = pTarget->getPosition();//轨迹起点
}
 
CircleAction* CircleAction::create(float duration, const CCPoint& position,int direction){
    CircleAction * pmyAction=new CircleAction();
    pmyAction->initWithDuration(duration, position,direction);
    pmyAction->autorelease();
 
    return pmyAction;
}
//这个函数得到初始化数据
bool CircleAction::initWithDuration(float duration, const CCPoint& position,int direction){
    if (CCActionInterval::initWithDuration(duration))
    {
        m_endPosition = position; //轨迹终点,对于圆轨迹,是半圆弧轨迹的终点
  m_direction =direction;
        return true;
    }
 
    return false;
}
void CircleAction::update(float time){
    if (m_pTarget)
    {
        //这里的time就相当于当前时间占总的需要运行时间的百分比
        /*
   这里轨迹就用一个圆
   x=cos(t),y=sin(t),当时间走完就是一圈360°
   对于圆轨迹,圆心坐标C=(m_startPosition+m_endPosition)/2
        */
      CCPoint C=ccp((m_startPosition.x+m_endPosition.x)*0.5,(m_startPosition.y+m_endPosition.y)*0.5);//圆心
   float startarg=atan2(m_startPosition.y-C.y,m_startPosition.x-C.x);//轨迹起点相对于圆心的辐角主值∈(-pi,pi]
      float tempx=(m_startPosition.x-m_endPosition.x)*(m_startPosition.x-m_endPosition.x);
   float tempy=(m_startPosition.y-m_endPosition.y)*(m_startPosition.y-m_endPosition.y);
   float r=sqrt(tempx+tempy)*0.5;//圆的半径
   float x=r*cos(startarg+2*M_PI*time*m_direction);//圆上点相对于圆心的X坐标偏移
   float y=r*sin(startarg+2*M_PI*time*m_direction);//圆上点相对于圆心的Y坐标偏移
   m_pTarget->setPosition(ccpAdd(C,ccp(x,y)));
    }
}

void myAction::startWithTarget(CCNode *pTarget){
    CCActionInterval::startWithTarget(pTarget);
}
 
myAction* myAction::create(float duration,const char *func){
    myAction * pmyAction=new myAction();
    pmyAction->initWithDuration(duration,func);
    pmyAction->autorelease();
 
    return pmyAction;
}
//这个函数得到初始化数据
bool myAction::initWithDuration(float duration,const char *func){
    if (CCActionInterval::initWithDuration(duration))
    {
  strcpy(m_TraceFunc,func);
        return true;
    }
    return false;
}

//带有控制参数的createXXX函数
myAction* myAction::createCircle(float duration,const char *func,const CCPoint& startP,const CCPoint& centerP,float direction)
{
    myAction * pmyAction=new myAction();
    if(pmyAction==NULL)
    {
        return NULL;
    }
 if(pmyAction->CCActionInterval::initWithDuration(duration)==false)
    {
        return NULL;
    }
 strcpy(pmyAction->m_TraceFunc,func);
 pmyAction->m_TraceType=1;
 pmyAction->m_startP=startP;
 pmyAction->m_centerP=centerP;
 pmyAction->m_direction=direction;
    pmyAction->autorelease();
 
    return pmyAction;
}


void myAction::update(float time){
    if (m_pTarget && m_TraceFunc)
    {
  if(m_TraceType==0)
  {
    //这里的time就相当于当前时间占总的需要运行时间的百分比
    CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    lua_State* m_state = pEngine->getLuaState();
    //int recv=pEngine->executeGlobalFunction(m_TraceFunc,1);
    //函数名
    lua_getglobal(m_state,m_TraceFunc);
    //第一个参数压栈
    lua_pushnumber(m_state, time);
    //调用函数
    lua_call(m_state, 1, 1);
    //得到返回值
    CCPoint retP=*(CCPoint*)(tolua_tousertype(m_state,2,0));
    lua_pop(m_state, 1);

    m_pTarget->setPosition(retP);
    return;
  }
  if(m_TraceType==1)
  {
    //这里的time就相当于当前时间占总的需要运行时间的百分比
    CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    lua_State* m_state = pEngine->getLuaState();
    //函数名
    lua_getglobal(m_state,m_TraceFunc);
    //第一个参数压栈
    lua_pushnumber(m_state, time);
    //第二三个参数压栈
    //lua_pushlightuserdata(m_state, &m_startP);
    //void *lp=lua_newuserdata(m_state,sizeof(CCPoint));
    //memcpy(lp,&m_startP,sizeof(CCPoint));
    lua_pushnumber(m_state,m_startP.x);
    lua_pushnumber(m_state,m_startP.y);
    //第四五个参数压栈
    //lua_pushlightuserdata(m_state, &m_centerP);
    //void *lp1=lua_newuserdata(m_state,sizeof(CCPoint));
    //memcpy(lp1,&m_centerP,sizeof(CCPoint));
    lua_pushnumber(m_state,m_centerP.x);
    lua_pushnumber(m_state,m_centerP.y);
    //第六个参数压栈
    lua_pushnumber(m_state,m_direction);
    //调用函数
    lua_call(m_state,6, 1);
    //得到返回值
    CCPoint retP=*(CCPoint*)(tolua_tousertype(m_state,2,0));
    lua_pop(m_state, 1);

    m_pTarget->setPosition(retP);
    return;
  }


    }
}

tolua++用以自动生成LUA<->C++交互接口文件L_CCActionEx.h的pkg文件CCActionEx.pkg:

#pragma once

class  CircleAction : public CCActionInterval
{
    /** creates the action */
    static CircleAction* create(float duration, const CCPoint& position,int direction);
};

class  myAction : public CCActionInterval
{
    /** creates the action */
    static myAction* create(float duration,const char *func);
    static myAction* createCircle(float duration,const char *func,const CCPoint& startP,const CCPoint& centerP,float direction);
};

LUA中使用代码:

 

--[[
三阶贝塞尔曲线(P_0,P_1,P_2,P_3)退化为二阶贝塞尔曲线(P_0,P_1,P_2,即抛物线:起点P_0=控制点P_1,控制点P_2,终点P_3)
参数说明:
startP----轨迹起点
endP----轨迹终点
startAngle----
endAngle----
time----动画时长
]]
function Fish:moveWithParabola(startP,endP,startAngle,endAngle,time)
 local sx = startP.x;
 local sy = startP.y;
 local ex =endP.x;
 local ey =endP.y;

 local h = self:getContentSize().height * 0.5;
 local pos=CCPoint(sx,sy);
 self:setPosition(pos);
 self:setRotation(startAngle);

 -- 贝塞尔曲线
 local bezier=ccBezierConfig:new();
 -- 控制点1(起点)
 bezier.controlPoint_1 = ccp(sx, sy);
 -- 控制点2
 --bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5);
 bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+100); 
 -- 终点
 bezier.endPosition = ccp(endP.x, endP.y);

 local actionMove = CCBezierTo:create(time, bezier);
 local actionRotate = CCRotateTo:create(time, endAngle);
 local action = CCSpawn:createWithTwoActions(actionMove, actionRotate);
 local pcc=CCCallFunc:create(function()
          self:removeFromParentAndCleanup(true)
    end)
 local sq = CCSequence:createWithTwoActions(action,pcc); 
 self:runAction(sq);
end

function CircleTrace(t)
          --圆中心为(350,300),半径为150,轨迹起点为(500,300)的逆时针圆轨迹
          local x=150*math.cos(2*math.pi*t)
          local y=150*math.sin(2*math.pi*t)
          return ccp(350+x,300+y)
end

function EllipseTrace(t)
          --椭圆中心为(350,300),长半径为150,短半径为120,轨迹起点为(500,300),焦点F_1为(260,300),焦点F_2为(440,300)的逆时针椭圆轨迹
          local C=ccp(350,300)
          local a=150
          local b=120
          local c=90
          local x=a*math.cos(2*math.pi*t)
          local y=b*math.sin(2*math.pi*t)
          return ccp(C.x+x,C.y+y)
end

function SinTrace(t)
          --轨迹起点为(500,300),振幅为150的正弦曲线轨迹
          local C=ccp(350,300)
          local a=150
          local x=a*2*math.pi*t
          local y=a*math.sin(2*math.pi*t)
          return ccp(C.x+x,C.y+y)
end

--[[
圆轨迹
参数说明:
t----轨迹参数方程中的参数
startP----轨迹起点坐标
centerP----圆心坐标
direction----取值浮点数,表示圈数,正、负圈数分别表示逆、顺时针旋转
]]
--function CircleTraceFunc(t,startP,centerP,direction)
function CircleTraceFunc(t,startPx,startPy,centerPx,centerPy,direction)
          local startP=ccp(startPx,startPy)
          local centerP=ccp(centerPx,centerPy)
          --圆中心为centerP,半径为r,轨迹起点为startP的direction弧度圆轨迹
          local startarg=math.atan2(startP.y-centerP.y,startP.x-centerP.x);--轨迹起点相对于圆心的辐角主值
          local tempx=(startP.x-centerP.x)*(startP.x-centerP.x);
    local tempy=(startP.y-centerP.y)*(startP.y-centerP.y);
    local r=math.sqrt(tempx+tempy);--圆的半径
          local x=r*math.cos(startarg+2*math.pi*t*direction)
          local y=r*math.sin(startarg+2*math.pi*t*direction)
          return ccp(centerP.x+x,centerP.y+y)
end

function Fish:addPath(pathType)
if(pathType==1)then
   self:moveWithParabola(ccp(200, 300), ccp(500, 300), 0.0, 20.0, 3.0);
end
if(pathType==2)then
   self:setPosition(CCPoint(200,300)); 
    --创建一个移动动画,内部调用create实现。参数一为动画时长,参数二为要移动到的目标点。 
   self:runAction(CCMoveTo:create(3.0, ccp(500,300)));
   --self:runAction(CCRotateTo:create(1, 180.0));
end 
if(pathType==3)then
   --轨迹起点
   self:setPosition(CCPoint(200,300));
   --圆逆时针运动轨迹,参数一为动画时长,参数二为当前圆上位置的对径点坐标,参数三为轨迹方向
   self:runAction(CircleAction:create(3.0, ccp(500,300),1));
end
if(pathType==4)then
   --轨迹起点
   self:setPosition(CCPoint(200,300));
   --圆顺时针运动轨迹,参数一为动画时长,参数二为当前圆上位置的对径点坐标,参数三为轨迹方向
   self:runAction(CircleAction:create(3.0, ccp(500,300),-1));
end
if(pathType==5)then
   --自定义运动轨迹,参数一为动画时长,参数二为表示轨迹参数方程的LUA函数名
   --self:runAction(myAction:create(3.0,"CircleTrace"));
   self:runAction(myAction:createCircle(3.0,"CircleTraceFunc",ccp(500,300),ccp(350,300),2));
end
if(pathType==6)then
   --圆中心为(350,300),半径为150,轨迹起点为(500,300)的逆时针圆轨迹
   --圆运动轨迹,参数一为动画时长,参数二为表示圆轨迹参数方程的LUA函数名,参数三为轨迹起点坐标,参数四为圆心坐标,参数五为正负圈数
   self:runAction(myAction:createCircle(3.0,"CircleTraceFunc",ccp(500,300),ccp(350,300),1));
end
if(pathType==7)then
   --自定义运动轨迹,参数一为动画时长,参数二为表示轨迹参数方程的LUA函数名
   self:runAction(myAction:create(3.0,"EllipseTrace"));
end
if(pathType==8)then
   --自定义运动轨迹,参数一为动画时长,参数二为表示轨迹参数方程的LUA函数名
   self:runAction(myAction:create(3.0,"SinTrace"));
end    
end

 


5月底改为无LUA轻型框架后:
#pragma once

#include "..\..\..\cocos2dx\actions\CCActionInterval.h"//包含系统延时类动作头文件
using namespace cocos2d;

//add by Ivan_han 20130528
typedef void(*pFuncVoid)(void);
typedef CCPoint(*pFuncTrace0)(float t);
typedef CCPoint(*pFuncTrace1)(float t,float startPx,float startPy,float r,float deltArg,float direction,float reservedx,float reservedy);

/***********************************************
Name:CircleAction
Desc:圆运动轨迹
Auth:Ivan_han@2013-04-23
***********************************************/
/*
   LUA中使用方法:
   --轨迹起点
   self:setPosition(CCPoint(200,300));
   --圆逆时针运动轨迹,参数一为动画时长,参数二为当前圆上位置的对径点坐标,参数三为轨迹方向
   self:runAction(CircleAction:create(3.0, ccp(500,300),1));

    --轨迹起点
    self:setPosition(CCPoint(200,300));
    --圆顺时针运动轨迹,参数一为动画时长,参数二为当前圆上位置的对径点坐标,参数三为轨迹方向
    self:runAction(CircleAction:create(3.0, ccp(500,300),-1));
*/
class  CircleAction : public CCActionInterval
{
public:
    /** initializes the action */
    bool initWithDuration(float duration, const CCPoint& position,int direction);
 
    virtual void startWithTarget(CCNode *pTarget);
    virtual void update(float time);
 
public:
    /** creates the action */
    static CircleAction* create(float duration, const CCPoint& position,int direction);
 
protected: 
    CCPoint m_startPosition;//轨迹起点
    CCPoint m_endPosition;//轨迹终点
 int m_direction;//1表示逆时针Anti-clockwise,-1表示顺时针Clockwise
};

/***********************************************
Name:myAction
Desc:任意运动轨迹,轨迹的参数方程写在LUA脚本中
Auth:Ivan_han@2013-04-23
***********************************************/
/*
LUA中使用方法:
--自定义运动轨迹,参数一为动画时长,参数二为表示轨迹参数方程的LUA函数名
self:runAction(myAction:create(3.0,"CircleTrace"));

--圆中心为(350,300),半径为150,轨迹起点为(500,300)的逆时针圆轨迹
--圆运动轨迹,参数一为动画时长,参数二为表示圆轨迹参数方程的LUA函数名,参数三为轨迹起点坐标,参数四为圆心坐标,参数五为正负圈数
self:runAction(myAction:createCircle(3.0,"CircleTraceFunc",ccp(500,300),ccp(350,300),1));
*/
class myAction : public CCActionInterval
{
public:
myAction(){memset(m_TraceFunc,0,sizeof(m_TraceFunc));m_TraceType=0;m_Func=0;m_Func1=0;m_t=0;}

/** initializes the action */
bool initWithDuration(float duration,float InitElapsed,const char *func);

virtual void startWithTarget(CCNode *pTarget);
virtual void update(float time);

public:
/** creates the action */
//相当于CC**To
static myAction* create(float duration,float InitElapsed,const char *func);
/*
带有控制参数的createXXX函数,相当于CC**By
参数说明:
centerP/rdeltArg----对于圆轨迹、摆线轨迹,分别代表圆心坐标、圆的半径和辐角主值增量
reserved----作为保留参数进一步刻画摆线轨迹,reserved.y=0时为水平向右的摆线轨迹
*/
static myAction* createCircle(float duration,float InitElapsed,const char *func,const CCPoint& startP,const CCPoint& centerP,float direction);
static myAction* createCycloid(float duration,float InitElapsed,const char *func,const CCPoint& startP,const CCPoint& rdeltArg,float direction,const CCPoint& reserved);

//add by Ivan_han 20130528
bool initWithDuration(float duration,float InitElapsed,pFuncVoid fun);
static myAction* createTrace0(float duration,float InitElapsed,pFuncTrace0 fun);
static myAction* createTrace1(float duration,float InitElapsed,pFuncTrace1 fun,const CCPoint& startP,const CCPoint& rdeltArg,float direction,const CCPoint& reserved);

//add by Ivan_han 20130531
void setFunc1(pFuncVoid Func1){m_Func1=Func1;}

//利用定义求一元实函的一阶导数,add by Ivan_han 20130608
static float dif1fx(float(*fx)(float),float x)
{
return (fx(x+0.0000001)-fx(x))/0.0000001;
}
static CCPoint dif1fx(pFuncTrace0 Func,float t)
{
float dx=(Func(t+0.0000001).x-Func(t).x);
float dy=(Func(t+0.0000001).y-Func(t).y);
return CCPoint(dx,dy);
}
protected:
char m_TraceFunc[20];//LUA函数名,定义了轨迹的参数方程
int m_TraceType;//-2表示create,-1表示createCircle和createCycloid,0表示createTrace0,1表示createTrace1
//针对圆轨迹、摆线轨迹的成员变量
CCPoint m_startP;//轨迹起点
CCPoint m_centerP;//轨迹中心点,保存参数centerP/rdeltArg
float m_direction;//1表示逆时针Anti-clockwise,-1表示顺时针Clockwise
//针对移动的圆轨迹(摆线轨迹)额外的成员变量
CCPoint m_reserved;//进一步刻画摆线轨迹

//轨迹的方程,add by Ivan_han 20130528
pFuncVoid m_Func;

//轨迹的切向量方程,add by Ivan_han 20130531
pFuncVoid m_Func1;

//上一次设置切向的时刻,m_t∈[0,1]
float m_t;
};

#include "CCActionEx.h"
#include "..\..\..\cocos2dx\support\CCPointExtension.h"

void CircleAction::startWithTarget(CCNode *pTarget){
    CCActionInterval::startWithTarget(pTarget);
    m_startPosition = pTarget->getPosition();//轨迹起点
}
 
CircleAction* CircleAction::create(float duration, const CCPoint& position,int direction){
    CircleAction * pmyAction=new CircleAction();
    pmyAction->initWithDuration(duration, position,direction);
    pmyAction->autorelease();
 
    return pmyAction;
}
//这个函数得到初始化数据
bool CircleAction::initWithDuration(float duration, const CCPoint& position,int direction){
    if (CCActionInterval::initWithDuration(duration))
    {
        m_endPosition = position; //轨迹终点,对于圆轨迹,是半圆弧轨迹的终点
  m_direction =direction;
        return true;
    }
 
    return false;
}
void CircleAction::update(float time){
    if (m_pTarget)
    {
        //这里的time就相当于当前时间占总的需要运行时间的百分比
        /*
   这里轨迹就用一个圆
   x=cos(t),y=sin(t),当时间走完就是一圈360°
   对于圆轨迹,圆心坐标C=(m_startPosition+m_endPosition)/2
        */
      CCPoint C=ccp((m_startPosition.x+m_endPosition.x)*0.5,(m_startPosition.y+m_endPosition.y)*0.5);//圆心
   float startarg=atan2(m_startPosition.y-C.y,m_startPosition.x-C.x);//轨迹起点相对于圆心的辐角主值∈(-pi,pi]
      float tempx=(m_startPosition.x-m_endPosition.x)*(m_startPosition.x-m_endPosition.x);
   float tempy=(m_startPosition.y-m_endPosition.y)*(m_startPosition.y-m_endPosition.y);
   float r=sqrt(tempx+tempy)*0.5;//圆的半径
   float x=r*cos(startarg+2*M_PI*time*m_direction);//圆上点相对于圆心的X坐标偏移
   float y=r*sin(startarg+2*M_PI*time*m_direction);//圆上点相对于圆心的Y坐标偏移
   m_pTarget->setPosition(ccpAdd(C,ccp(x,y)));
    }
}

void myAction::startWithTarget(CCNode *pTarget){
    CCActionInterval::startWithTarget(pTarget);
}

//add by Ivan_han 20130528
bool myAction::initWithDuration(float duration,float InitElapsed,pFuncVoid fun)
{
 if (CCActionInterval::initWithDuration(duration,InitElapsed))
 {
  m_Func=fun;
  return true;
 }
 return false;
}

myAction* myAction::createTrace0(float duration,float InitElapsed,pFuncTrace0 fun)
{
 myAction * pmyAction=new myAction();
 pmyAction->initWithDuration(duration,InitElapsed,(pFuncVoid)fun);
 pmyAction->m_TraceType=0;
 pmyAction->autorelease();

 return pmyAction;
}

myAction* myAction::createTrace1(float duration,float InitElapsed,pFuncTrace1 fun,const CCPoint& startP,const CCPoint& rdeltArg,float direction,const CCPoint& reserved)
{
 myAction * pmyAction=new myAction();
 if(pmyAction==NULL)
 {
  return NULL;
 }
 if(pmyAction->CCActionInterval::initWithDuration(duration,InitElapsed)==false)
 {
  return NULL;
 }
 pmyAction->m_Func=(pFuncVoid)fun;
 pmyAction->m_TraceType=1;
 pmyAction->m_startP=startP;
 pmyAction->m_centerP=rdeltArg;
 pmyAction->m_direction=direction;
 pmyAction->m_reserved=reserved;
 pmyAction->autorelease();

 return pmyAction;
}
 
myAction* myAction::create(float duration,float InitElapsed,const char *func){
    myAction * pmyAction=new myAction();
    pmyAction->initWithDuration(duration,InitElapsed,func);
 pmyAction->m_TraceType=-2;
    pmyAction->autorelease();

    return pmyAction;
}
//这个函数得到初始化数据
bool myAction::initWithDuration(float duration,float InitElapsed,const char *func){
    if (CCActionInterval::initWithDuration(duration,InitElapsed))
    {
  strcpy(m_TraceFunc,func);
        return true;
    }
    return false;
}

//带有控制参数的createXXX函数
myAction* myAction::createCircle(float duration,float InitElapsed,const char *func,const CCPoint& startP,const CCPoint& centerP,float direction)
{
    return myAction::createCycloid(duration,InitElapsed,func,startP,centerP,direction,CCPoint(0,0));
}

//带有控制参数的createXXX函数
myAction* myAction::createCycloid(float duration,float InitElapsed,const char *func,const CCPoint& startP,const CCPoint& rdeltArg,float direction,const CCPoint& reserved)
{
    myAction * pmyAction=new myAction();
    if(pmyAction==NULL)
    {
        return NULL;
    }
 if(pmyAction->CCActionInterval::initWithDuration(duration,InitElapsed)==false)
    {
        return NULL;
    }
 strcpy(pmyAction->m_TraceFunc,func);
 pmyAction->m_TraceType=-1;
 pmyAction->m_startP=startP;
 pmyAction->m_centerP=rdeltArg;
 pmyAction->m_direction=direction;
 pmyAction->m_reserved=reserved;
    pmyAction->autorelease();
 
    return pmyAction;
}

void myAction::update(float time){
    if (m_pTarget && (m_TraceFunc||m_Func))
    {
if(m_TraceType==0)
{
CCPoint retP=((pFuncTrace0)m_Func)(time);
//add by Ivan_han 20130608
if(g_pShipMgr!=NULL)
retP=g_pShipMgr->SP2CP(retP);//代表点
m_pTarget->setPosition(retP);
//针对某些任意曲线轨迹有闪烁情况
if(time-m_t<0.05 && m_t>getInitElapsed())
return;
//根据结点轨迹的切线方向更新结点的CW值
CCPoint arg1=dif1fx(((pFuncTrace0)m_Func),time);
if(g_pShipMgr!=NULL)
arg1=g_pShipMgr->SD2CD(arg1);//代表方向
float m_fArg=m_pTarget->getArg();
float angle=(m_fArg-atan2(arg1.y,arg1.x))*180/M_PI;
m_pTarget->setRotation(angle);
m_t=time;
return;
}

if(m_TraceType==1)
  {
   CCPoint retP=((pFuncTrace1)m_Func)(time,m_startP.x,m_startP.y,m_centerP.x,m_centerP.y,m_direction,m_reserved.x,m_reserved.y);
   m_pTarget->setPosition(retP);
   if(m_Func1)
   {
    //根据结点轨迹的切线方向更新结点的CW值,add by Ivan_han 20130531
    CCPoint arg1=((pFuncTrace1)m_Func1)(time,m_startP.x,m_startP.y,m_centerP.x,m_centerP.y,m_direction,m_reserved.x,m_reserved.y);
    float m_fArg=m_pTarget->getArg();//M_PI;
    float angle=(m_fArg-atan2(arg1.y,arg1.x))*180/M_PI;
    m_pTarget->setRotation(angle);
   }
   return;
  }
  if(m_TraceType==-2)
  {
    ////这里的time就相当于当前时间占总的需要运行时间的百分比
    //CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    //lua_State* m_state = pEngine->getLuaState();
    ////int recv=pEngine->executeGlobalFunction(m_TraceFunc,1);
    ////函数名
    //lua_getglobal(m_state,m_TraceFunc);
    ////第一个参数压栈
    //lua_pushnumber(m_state, time);
    ////调用函数
    //lua_call(m_state, 1, 1);
    ////得到返回值
    //CCPoint retP=*(CCPoint*)(tolua_tousertype(m_state,2,0));
    //lua_pop(m_state, 1);

    //m_pTarget->setPosition(retP);
    return;
  }
  if(m_TraceType==-1)
  {
    ////这里的time就相当于当前时间占总的需要运行时间的百分比
    //CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    //lua_State* m_state = pEngine->getLuaState();
    ////函数名
    //lua_getglobal(m_state,m_TraceFunc);
    ////第一个参数压栈
    //lua_pushnumber(m_state, time);
    ////第二三个参数压栈
    ////lua_pushlightuserdata(m_state, &m_startP);
    ////void *lp=lua_newuserdata(m_state,sizeof(CCPoint));
    ////memcpy(lp,&m_startP,sizeof(CCPoint));
    //lua_pushnumber(m_state,m_startP.x);
    //lua_pushnumber(m_state,m_startP.y);
    ////第四五个参数压栈
    ////lua_pushlightuserdata(m_state, &m_centerP);
    ////void *lp1=lua_newuserdata(m_state,sizeof(CCPoint));
    ////memcpy(lp1,&m_centerP,sizeof(CCPoint));
    //lua_pushnumber(m_state,m_centerP.x);
    //lua_pushnumber(m_state,m_centerP.y);
    ////第六个参数压栈
    //lua_pushnumber(m_state,m_direction);
    ////第七八个参数压栈
    //lua_pushnumber(m_state,m_reserved.x);
    //lua_pushnumber(m_state,m_reserved.y);
    ////调用函数
    //lua_call(m_state,8, 1);
    ////得到返回值
    //CCPoint retP=*(CCPoint*)(tolua_tousertype(m_state,2,0));
    //lua_pop(m_state, 1);

    ////m_pTarget->setPosition(CCPoint(m_startP.x+retP.x,m_startP.y+retP.y));//改为相对位置以支持CCRepeatForever无限次重复动画
    //m_pTarget->setPosition(retP);
    return;
  }


    }
}