// // BezierEqualPointsAction.cpp // redream_runtime // // Created by 潮伟钦 on 2022/7/18. // #include "BezierEqualPointsAction.hpp" #define DEBUG_PATH false BezierEqualPointsAction* BezierEqualPointsAction::create(float duration, std::vector equalPoints) { BezierEqualPointsAction *ret = new (std::nothrow) BezierEqualPointsAction(); if (ret && ret->initWithDuration(duration, equalPoints)) { ret->autorelease(); return ret; } delete ret; return nullptr; } bool BezierEqualPointsAction::initWithDuration(float duration, std::vector equalPoints) { ActionInterval::initWithDuration(duration); _equalPoints = equalPoints; #if DEBUG_PATH DrawNode* dn = DrawNode::create(); for (Vec2 p : equalPoints) { dn->drawDot(p, 1, Color4F::RED); } dn->retain(); Director::getInstance()->getScheduler()->schedule([=](float dt){ Director::getInstance()->getRunningScene()->addChild(dn); dn->release(); }, Director::getInstance(), 1, 0, 1, false, "!231231231"); #endif _length = 0; Vec2 last = _equalPoints[0]; _count = (int)_equalPoints.size(); for (int i = 1; i < _count; ++i) { Vec2 now = _equalPoints[i]; float curLength = last.distance(now); _length = _length + curLength; last = now; } return true; } void BezierEqualPointsAction::update(float time) { float idx_f = (_count-1) * time; int idx_i = (int)idx_f; idx_i = min(idx_i, (int)(_equalPoints.size() - 1)); idx_i = max(0, idx_i); Vec2 pos = _equalPoints.at(idx_i); float p = idx_f - idx_i; if (p > 0.0f) { // 有余数 if (idx_i+1 < _equalPoints.size()) { Vec2 nextPos = _equalPoints.at(idx_i+1); pos = (nextPos-pos)*p + pos; } } _target->setPosition(pos); #if DEBUG_PATH auto dn = static_cast(Director::getInstance()->getRunningScene()->getChildByTag(213)); if (dn == nullptr) { dn = DrawNode::create(); dn->setTag(213); Director::getInstance()->getRunningScene()->addChild(dn); } dn->drawDot(pos, 3, Color4F::BLUE); #endif }