void BezierBy::update(float time) { if (_target) { float xa = 0; float xb = _config.controlPoint_1.x; float xc = _config.controlPoint_2.x; float xd = _config.endPosition.x; float ya = 0; float yb = _config.controlPoint_1.y; float yc = _config.controlPoint_2.y; float yd = _config.endPosition.y; float x = bezierat(xa, xb, xc, xd, time); float y = bezierat(ya, yb, yc, yd, time); #if CC_ENABLE_STACKABLE_ACTIONS Point currentPos = _target->getPosition(); Point diff = currentPos - _previousPosition; _startPosition = _startPosition + diff; Point newPos = _startPosition + Point(x,y); _target->setPosition(newPos); _previousPosition = newPos; #else _target->setPosition(ccpAdd( _startPosition, Point(x,y))); #endif // !CC_ENABLE_STACKABLE_ACTIONS } }
void QuadBezierBy::update(float time) { if (_target) { float xa = 0; float xb = _config.controlPoint.x; float xd = _config.endPosition.x; float ya = 0; float yb = _config.controlPoint.y; float yd = _config.endPosition.y; float x = bezierat(xa, xb, xd, time); float y = bezierat(ya, yb, yd, time); #if CC_ENABLE_STACKABLE_ACTIONS Vec2 currentPos = _target->getPosition(); Vec2 diff = currentPos - _previousPosition; _startPosition = _startPosition + diff; Vec2 newPos = _startPosition + Vec2(x, y); _target->setPosition(newPos); _previousPosition = newPos; #else _target->setPosition(_startPosition + Vec2(x, y)); #endif // !CC_ENABLE_STACKABLE_ACTIONS } }
void BWBezierBy::update(float time) { if (m_pTarget) { float xa = 0; float xb = m_sConfig.controlPoint_1.x; float xc = m_sConfig.controlPoint_2.x; float xd = m_sConfig.endPosition.x; float ya = 0; float yb = m_sConfig.controlPoint_1.y; float yc = m_sConfig.controlPoint_2.y; float yd = m_sConfig.endPosition.y; float x = bezierat(xa, xb, xc, xd, time); float y = bezierat(ya, yb, yc, yd, time); #if CC_ENABLE_STACKABLE_ACTIONS CCPoint currentPos = m_pTarget->getPosition(); CCPoint diff = ccpSub(currentPos, m_previousPosition); m_startPosition = ccpAdd( m_startPosition, diff); CCPoint newPos = ccpAdd( m_startPosition, ccp(x,y)); m_pTarget->setPosition(newPos); m_previousPosition = newPos; if(m_bRotHead) { CCPoint dirPoint = ccpSub(newPos, currentPos); float fRadian = atanf(dirPoint.y/dirPoint.x); if((dirPoint.y > 0 && dirPoint.x > 0) || (dirPoint.y < 0 && dirPoint.x > 0)) { fRadian = M_PI_2 - fRadian; } else if((dirPoint.y < 0 && dirPoint.x < 0)|| (dirPoint.y > 0 && dirPoint.x < 0)) { fRadian = -M_PI_2 - fRadian; } float m_fRotation = fRadian*180.0/M_PI; m_pTarget->setRotation(m_fRotation); } #else m_pTarget->setPosition(ccpAdd( m_startPosition, ccp(x,y))); #endif // !CC_ENABLE_STACKABLE_ACTIONS } }
void CCBezierBy::update(ccTime time) { if (m_pTarget) { float xa = 0; float xb = m_sConfig.controlPoint_1.x; float xc = m_sConfig.controlPoint_2.x; float xd = m_sConfig.endPosition.x; float ya = 0; float yb = m_sConfig.controlPoint_1.y; float yc = m_sConfig.controlPoint_2.y; float yd = m_sConfig.endPosition.y; float x = bezierat(xa, xb, xc, xd, time); float y = bezierat(ya, yb, yc, yd, time); m_pTarget->setPosition(ccpAdd(m_startPosition, ccp(x, y))); } }
cocos2d::CCPoint Bezier::pointAt(float progress){ const float configIndexF(_configs.size()*progress); const int configIndex(configIndexF); const float time(configIndexF-configIndex); const Bezier::Config & conf(_configs.at(configIndex)); //get the step const cocos2d::CCPoint startPos(configIndex==0? _startPosition: _configs.at(configIndex-1).endPos); const float xa(startPos.x); const float xb(conf.controlPt1.x); const float xc(conf.controlPt2.x); const float xd(conf.endPos.x); const float ya(startPos.y); const float yb(conf.controlPt1.y); const float yc(conf.controlPt2.y); const float yd(conf.endPos.y); return {bezierat(xa, xb, xc, xd, time), bezierat(ya, yb, yc, yd, time)}; }