83 lines
2.7 KiB
Lua
83 lines
2.7 KiB
Lua
---@class XUiTaikoMasterFlowText
|
|
local XUiTaikoMasterFlowText = XClass(nil, "XUiTaikoMasterFlowText")
|
|
|
|
function XUiTaikoMasterFlowText:Ctor(text, mask)
|
|
self._Text = text
|
|
self._Mask = mask
|
|
self._InitX = false
|
|
self._Sequence = false
|
|
self._StrText = false
|
|
self._StrTextDouble = false
|
|
end
|
|
|
|
function XUiTaikoMasterFlowText:IsPlaying()
|
|
return self._Sequence and true or false
|
|
end
|
|
|
|
function XUiTaikoMasterFlowText:Play()
|
|
if self._Sequence then
|
|
self:Stop()
|
|
end
|
|
self._Sequence, self._InitX = self:CreateTextSequence(self._Text, self._Mask, self._InitX)
|
|
end
|
|
|
|
function XUiTaikoMasterFlowText:Stop()
|
|
if self._Sequence then
|
|
self._Sequence:Kill()
|
|
self._Sequence = false
|
|
if self._InitX then
|
|
-- 复位
|
|
local txtLocalPosition = self._Text.transform.localPosition
|
|
self._Text.transform.localPosition = Vector3(self._InitX, txtLocalPosition.y, txtLocalPosition.z)
|
|
end
|
|
end
|
|
-- 还原text
|
|
if self._Text.text == self._StrTextDouble then
|
|
self._Text.text = self._StrText
|
|
end
|
|
self._StrText = false
|
|
self._StrTextDouble = false
|
|
end
|
|
|
|
function XUiTaikoMasterFlowText:DoubleText(txtName)
|
|
local text = txtName.text
|
|
local space = " "
|
|
if not string.find(text, space) then
|
|
self._StrText = text
|
|
self._StrTextDouble = string.format('%s%s%s', text, space, text)
|
|
txtName.text = self._StrTextDouble
|
|
end
|
|
end
|
|
|
|
function XUiTaikoMasterFlowText:CreateTextSequence(txtName, mask, initX)
|
|
local txtNameWidth = XUiHelper.CalcTextWidth(txtName)
|
|
local txtMaskWidth = mask.sizeDelta.x
|
|
if txtNameWidth <= txtMaskWidth then
|
|
return
|
|
end
|
|
local txtTransform = txtName.transform
|
|
local txtLocalPosition = txtTransform.localPosition
|
|
initX = initX or txtLocalPosition.x
|
|
|
|
-- 两个文本才可以循环滚动
|
|
self:DoubleText(txtName)
|
|
local doubleTxtNameWidth = XUiHelper.CalcTextWidth(txtName)
|
|
local startX = initX
|
|
local endX = initX - (doubleTxtNameWidth - txtNameWidth)
|
|
|
|
local distance = math.abs(endX - startX)
|
|
txtName.transform.localPosition = Vector3(startX, txtLocalPosition.y, txtLocalPosition.z)
|
|
|
|
local DOTween = CS.DG.Tweening.DOTween
|
|
local sequence = DOTween.Sequence()
|
|
local pauseInterval = XTaikoMasterConfigs.MusicPlayerTextMovePauseInterval
|
|
sequence:AppendInterval(pauseInterval)
|
|
local moveSpeed = XTaikoMasterConfigs.MusicPlayerTextMoveSpeed
|
|
local time = distance / moveSpeed
|
|
sequence:Append(txtTransform:DOLocalMoveX(endX, time))
|
|
sequence:Append(txtTransform:DOLocalMoveX(startX, 0))
|
|
sequence:SetLoops(-1)
|
|
return sequence, initX
|
|
end
|
|
|
|
return XUiTaikoMasterFlowText
|