1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- //
- // BezierEqualPointsAction.cpp
- // redream_runtime
- //
- // Created by 潮伟钦 on 2022/7/18.
- //
- #include "BezierEqualPointsAction.hpp"
- #define DEBUG_PATH false
- BezierEqualPointsAction* BezierEqualPointsAction::create(float duration, std::vector<Vec2> 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<Vec2> 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<DrawNode*>(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
- }
|