轨迹同步与坐标系转换

20130524~20130528捕鱼客户端架构改变:
把用LUA实现游戏逻辑的重型框架改为用C++实现游戏逻辑的轻型框架。
20130528开始在2.0-x-2.03_branch_231_NoScript轻型框架中用C++写游戏逻辑。
20130524鱼轨迹同步功能的客户端动作类代码修改。
20130525鱼轨迹同步功能的服务器端代码修改。
20130527基于现有捕鱼代码中椅子ID<->视图ID之间的转换公式,给出收发坐标数据时,服务器端坐标<->客户端本地坐标的转换公式。
20130528在无Lua工程中测试鱼轨迹和鱼轨迹阵,测试用轨迹编辑器生成的轨迹数据生成三阶贝塞尔曲线轨迹。
【网狐捕鱼的轨迹同步:有服务器轨迹建立时间但没有根据客户端收到轨迹包的时间差建立同步的轨迹,服务器有简单的轨迹管理(有轨迹建立和轨迹销毁,无轨迹更新),后进桌子的玩家收不到服务器端先前下发的轨迹,客户端没有考虑建立轨迹动作对象时的动作已消逝时间InitElapsed=ClientBuildTime-ServerBuildTime。——结论:完全没有做轨迹同步】
#define FISH_ALIVE_TIME    20       //存活时间
鱼轨迹结构体有一个字段
 DWORD       dwBuildTime;       //建立时间
//服务器建立鱼轨迹时
pServerFishTrace->dwBuildTime=::time(NULL);
//服务器遍历鱼轨迹,清除鱼轨迹
  //判断时间
  if (dwNowTime>=(pServerFishTrace->dwBuildTime+FISH_ALIVE_TIME))
  {
   DestroyFishTrace(pServerFishTrace);
   continue;
  }
【欢乐捕鱼的轨迹同步:轨迹建立时间以服务器端的为准,进入桌子后,举手的玩家会收到服务器端桌子内所有存活的轨迹数据,每条轨迹服务器端发给每个客户端只发一次,客户端根据时间差InitElapsed建立同步的轨迹。】
LONGLONG lPutFishTime = GetTickCount64(); // 获得当前的ms 时间
CCActionInterval类添加了一个成员变量m_InitElapsed,在CCActionInterval、CCMoveTo、CCMoveBy、CCSequence、CCActionEase、CircleAction、myAction、CCBezierBy、CCBezierTo等动作类调用CCActionInterval::initWithDuration函数的地方添加了一个控制参数InitElapsed,其他动作类暂未添加。
Cocos2d-x需要修改的地方:
修改1:CCAction.h/CCFiniteTimeAction类增加一个虚函数
//获取延时动作对象创建时,该延时动作已消逝的时间,add by Ivan_han 20130524
 
virtual float getInitElapsed(void) { return 0; }
修改2:CCActionInterval.h/.cpp/CCActionInterval类增加一个成员变量和成员函数,initWithDuration、actionWithDuration、create这三个函数加上一个参数float InitElapsed=0
//获取延时动作对象创建时,该延时动作已消逝的时间,add by Ivan_han 20130524
   
inline float getInitElapsed(void) { return m_InitElapsed; }
float m_InitElapsed;//动作已经消逝时间,add by Ivan_han 20130524
bool initWithDuration(float d,float InitElapsed=0);
CC_DEPRECATED_ATTRIBUTE static CCActionInterval* actionWithDuration(float d,float InitElapsed=0);
static CCActionInterval* create(float d,float InitElapsed=0);
cpp文件的改动:
CCActionInterval* CCActionInterval::actionWithDuration(float d,float InitElapsed/*=0*/)
{
return CCActionInterval::create(d,InitElapsed);
}

CCActionInterval* CCActionInterval::create(float d,float InitElapsed/*=0*/)
{
CCActionInterval *pAction = new CCActionInterval();
pAction->initWithDuration(d,InitElapsed);
pAction->autorelease();
return pAction;
}

bool CCActionInterval::initWithDuration(float d,float InitElapsed/*=0*/)
{
m_fDuration = d;
m_InitElapsed=InitElapsed;//add by Ivan_han 20130524
// prevent division by 0
// This comparison could be in step:, but it might decrease the performance
// by 3% in heavy based action games.
if (m_fDuration == 0)
{   
m_fDuration = FLT_EPSILON;
}
m_elapsed = 0;
m_bFirstTick = true;
return true;
}

CCObject* CCActionInterval::copyWithZone(CCZone *pZone)

CCZone* pNewZone = NULL;
CCActionInterval* pCopy = NULL;
if(pZone && pZone->m_pCopyObject) 
{  
//in case of being called at sub class  
pCopy = (CCActionInterval*)(pZone->m_pCopyObject);
}
else
 {  
pCopy = new CCActionInterval();    
pZone = pNewZone = new CCZone(pCopy); 
}
CCFiniteTimeAction::copyWithZone(pZone);
CC_SAFE_DELETE(pNewZone);
pCopy->initWithDuration(m_fDuration,m_InitElapsed);
return pCopy;
}
void CCActionInterval::step(float dt)
{
if (m_bFirstTick)

m_bFirstTick = false;
m_elapsed = MAX (0, MIN(m_InitElapsed,m_fDuration));//add by Ivan_han 20130524
}
else
{   
m_elapsed += dt;

this->update(MAX (0,// needed for rewind. elapsed could be negative            
MIN(1, m_elapsed /
MAX(m_fDuration, FLT_EPSILON)// division by 0                 
));
}

修改3:CCSequence::initWithTwoActions
CCActionInterval::init
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值