mirror of https://github.com/axmolengine/axmol.git
151 lines
3.9 KiB
C++
151 lines
3.9 KiB
C++
#include "GearXY.h"
|
|
#include "GComponent.h"
|
|
#include "UIPackage.h"
|
|
#include "tween/GTween.h"
|
|
#include "utils/ByteBuffer.h"
|
|
|
|
NS_FGUI_BEGIN
|
|
USING_NS_AX;
|
|
|
|
GearXY::GearXY(GObject* owner)
|
|
: GearBase(owner),
|
|
positionsInPercent(false)
|
|
{
|
|
}
|
|
|
|
GearXY::~GearXY()
|
|
{
|
|
}
|
|
|
|
void GearXY::init()
|
|
{
|
|
_default = Vec4(_owner->getX(),
|
|
_owner->getY(),
|
|
_owner->getX() / _owner->getParent()->getWidth(),
|
|
_owner->getY() / _owner->getParent()->getHeight());
|
|
_storage.clear();
|
|
}
|
|
|
|
void GearXY::addStatus(const std::string& pageId, ByteBuffer* buffer)
|
|
{
|
|
Vec4 gv;
|
|
gv.x = buffer->readInt();
|
|
gv.y = buffer->readInt();
|
|
|
|
if (pageId.size() == 0)
|
|
_default = gv;
|
|
else
|
|
_storage[pageId] = gv;
|
|
}
|
|
|
|
void GearXY::addExtStatus(const std::string& pageId, ByteBuffer* buffer)
|
|
{
|
|
Vec4* gv;
|
|
if (pageId.empty())
|
|
gv = &_default;
|
|
else
|
|
gv = &_storage[pageId];
|
|
gv->z = buffer->readFloat();
|
|
gv->w = buffer->readFloat();
|
|
}
|
|
|
|
void GearXY::apply()
|
|
{
|
|
Vec4 gv;
|
|
auto it = _storage.find(_controller->getSelectedPageId());
|
|
if (it != _storage.end())
|
|
gv = it->second;
|
|
else
|
|
gv = _default;
|
|
|
|
Vec2 endPt;
|
|
|
|
if (positionsInPercent && _owner->getParent())
|
|
{
|
|
endPt.x = gv.z * _owner->getParent()->getWidth();
|
|
endPt.y = gv.w * _owner->getParent()->getHeight();
|
|
}
|
|
else
|
|
{
|
|
endPt.x = gv.x;
|
|
endPt.y = gv.y;
|
|
}
|
|
|
|
if (_tweenConfig && _tweenConfig->tween && UIPackage::_constructing == 0 && !disableAllTweenEffect)
|
|
{
|
|
if (_tweenConfig->_tweener != nullptr)
|
|
{
|
|
if (_tweenConfig->_tweener->endValue.x != endPt.x || _tweenConfig->_tweener->endValue.y != endPt.y)
|
|
{
|
|
_tweenConfig->_tweener->kill(true);
|
|
_tweenConfig->_tweener = nullptr;
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
Vec2 originPt(_owner->getX(), _owner->getY());
|
|
|
|
if (originPt != endPt)
|
|
{
|
|
if (_owner->checkGearController(0, _controller))
|
|
_tweenConfig->_displayLockToken = _owner->addDisplayLock();
|
|
|
|
_tweenConfig->_tweener = GTween::to(originPt, endPt, _tweenConfig->duration)
|
|
->setDelay(_tweenConfig->delay)
|
|
->setEase(_tweenConfig->easeType)
|
|
->setTargetAny(this)
|
|
->onUpdate(CC_CALLBACK_1(GearXY::onTweenUpdate, this))
|
|
->onComplete(CC_CALLBACK_0(GearXY::onTweenComplete, this));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_owner->_gearLocked = true;
|
|
_owner->setPosition(endPt.x, endPt.y);
|
|
_owner->_gearLocked = false;
|
|
}
|
|
}
|
|
|
|
void GearXY::onTweenUpdate(GTweener* tweener)
|
|
{
|
|
_owner->_gearLocked = true;
|
|
_owner->setPosition(_tweenConfig->_tweener->value.x, _tweenConfig->_tweener->value.y);
|
|
_owner->_gearLocked = false;
|
|
}
|
|
|
|
void GearXY::onTweenComplete()
|
|
{
|
|
if (_tweenConfig->_displayLockToken != 0)
|
|
{
|
|
_owner->releaseDisplayLock(_tweenConfig->_displayLockToken);
|
|
_tweenConfig->_displayLockToken = 0;
|
|
}
|
|
_tweenConfig->_tweener = nullptr;
|
|
_owner->dispatchEvent(UIEventType::GearStop);
|
|
}
|
|
|
|
void GearXY::updateState()
|
|
{
|
|
_storage[_controller->getSelectedPageId()] = Vec4(
|
|
_owner->getX(),
|
|
_owner->getY(),
|
|
_owner->getX() / _owner->getParent()->getWidth(),
|
|
_owner->getY() / _owner->getParent()->getHeight());
|
|
}
|
|
|
|
void GearXY::updateFromRelations(float dx, float dy)
|
|
{
|
|
if (_controller != nullptr && !_storage.empty() && !positionsInPercent)
|
|
{
|
|
for (auto it = _storage.begin(); it != _storage.end(); ++it)
|
|
{
|
|
it->second = Vec4(it->second.x + dx, it->second.y + dy, it->second.z, it->second.w);
|
|
}
|
|
_default.x += dx;
|
|
_default.y += dy;
|
|
|
|
updateState();
|
|
}
|
|
}
|
|
|
|
NS_FGUI_END |