232 lines
6.4 KiB
Plaintext
232 lines
6.4 KiB
Plaintext
autoImport("EventDispatcher")
|
|
autoImport("LuaQueue")
|
|
autoImport("BarrageView")
|
|
FunctionBarrage = class("FunctionBarrage",EventDispatcher)
|
|
|
|
function FunctionBarrage.Me()
|
|
if nil == FunctionBarrage.me then
|
|
FunctionBarrage.me = FunctionBarrage.new()
|
|
end
|
|
return FunctionBarrage.me
|
|
end
|
|
|
|
function FunctionBarrage:ctor()
|
|
self.numLimit = GameConfig.Barrage.MessageCountMax
|
|
self.tickID = 1
|
|
self.uiroot = GameObject.Find("UIRoot")
|
|
self:Reset()
|
|
self.meshIsLoaded = false
|
|
end
|
|
|
|
local vec3 = LuaVector3.New(0, 0, 0)
|
|
local callbackInitializeComplete = nil
|
|
local isInitializeComplete = false
|
|
local isLaunchComplete = false
|
|
local callbackLaunchComplete = nil
|
|
local _meshSelfRotateSpeed = 0
|
|
|
|
function FunctionBarrage:Launch(meshSelfRotateSpeed, callback_launch_complete)
|
|
if(self.running) then return end
|
|
|
|
_meshSelfRotateSpeed = meshSelfRotateSpeed
|
|
callbackLaunchComplete = callback_launch_complete
|
|
|
|
self:Initialize()
|
|
end
|
|
|
|
function FunctionBarrage:Initialize()
|
|
callbackInitializeComplete = callback_intialize_complete
|
|
|
|
if self.transMainCamera == nil or GameObjectUtil.Instance:ObjectIsNULL(self.transMainCamera) then
|
|
self.transMainCamera = GameObject.FindGameObjectWithTag("MainCamera").transform
|
|
end
|
|
|
|
if self.barrage == nil or GameObjectUtil.Instance:ObjectIsNULL(self.barrage.gameObject) then
|
|
self.barrage = BarrageView.new(Game.AssetManager_UI:CreateAsset(ResourcePathHelper.UIView("Barrages"), self.uiroot));
|
|
end
|
|
if self.barrageCam == nil or GameObjectUtil.Instance:ObjectIsNULL(self.barrageCam) then
|
|
self.barrageCam = GameObjectUtil.Instance:DeepFindChild(self.barrage.gameObject,"BarrageCamera"):GetComponent(CameraProjector)
|
|
end
|
|
self.barrageCam.sampleSize = Vector2(BarrageView.activeWidth, self.barrage:GetActiveHeight())
|
|
|
|
if self.goMesh == nil or GameObjectUtil.Instance:ObjectIsNULL(self.goMesh) then
|
|
self:LoadMesh()
|
|
else
|
|
self.barrage.gameObject:SetActive(true)
|
|
self.goMesh:SetActive(true)
|
|
self.running = true
|
|
self:ResetMeshRotSpeed(_meshSelfRotateSpeed)
|
|
if callbackLaunchComplete ~= nil then
|
|
callbackLaunchComplete()
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:OnInitializeComplete()
|
|
if isInitializeComplete then
|
|
isLaunchComplete = true
|
|
if callbackLaunchComplete ~= nil then
|
|
callbackLaunchComplete()
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:LoadMesh()
|
|
local posOfCamera = self.transMainCamera.position
|
|
vec3:Set(posOfCamera.x, posOfCamera.y, posOfCamera.z)
|
|
Asset_Effect.PlayAt(EffectMap.Maps.Barrage, vec3, function (go_mesh)
|
|
self:OnMeshBeLoaded(go_mesh)
|
|
end)
|
|
end
|
|
|
|
function FunctionBarrage:OnMeshBeLoaded(effect_handle)
|
|
self.goMesh = effect_handle.gameObject
|
|
|
|
self.barrageRotateSelf = self.goMesh:GetComponent(RotateSelf)
|
|
self.barrageCam.targetRenderer = self.goMesh:GetComponentInChildren(MeshRenderer)
|
|
|
|
vec3:Set(0, 0, 0)
|
|
Game.TransformFollowManager:RegisterFollowPos(self.goMesh.transform, myselfTransform, vec3, function ()
|
|
|
|
end)
|
|
|
|
self.barrage.gameObject:SetActive(true)
|
|
self.goMesh:SetActive(true)
|
|
self.running = true
|
|
self:ResetMeshRotSpeed(_meshSelfRotateSpeed)
|
|
|
|
self.meshIsLoaded = true
|
|
if self.meshIsLoaded then
|
|
isInitializeComplete = true
|
|
self:OnInitializeComplete()
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:ShutDown()
|
|
if(not self.running) then return end
|
|
|
|
self:Reset()
|
|
|
|
if(self.barrage) then
|
|
self.barrage.gameObject:SetActive(false)
|
|
end
|
|
if(self.goMesh) then
|
|
self.goMesh:SetActive(false)
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:Reset()
|
|
self.waitQueue = {}
|
|
if(self.barrages~=nil) then
|
|
for i=1,#self.barrages do
|
|
self:RemoveBarrage(self.barrages[i])
|
|
end
|
|
end
|
|
self.running = false
|
|
self.barrages = {}
|
|
TimeTickManager.Me():ClearTick(self,self.tickID)
|
|
end
|
|
|
|
function FunctionBarrage:ResetMeshRotSpeed(meshSelfRotateSpeed)
|
|
self.meshSelfRotateSpeed = meshSelfRotateSpeed or 30
|
|
self.duration = 360/self.meshSelfRotateSpeed
|
|
if(self.barrage) then
|
|
self.meshSpeed = BarrageView.activeWidth * (self.meshSelfRotateSpeed/360.0)
|
|
end
|
|
if(self.barrageRotateSelf) then
|
|
self.barrageRotateSelf.rotateSpeed = -math.abs(self.meshSelfRotateSpeed)
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:GetTransformOfMyself()
|
|
return Game.Myself.assetRole.completeTransform
|
|
end
|
|
|
|
-- {id,text,speed,color,fontSize,duration, percent}
|
|
function FunctionBarrage:AddText(data)
|
|
if(not self.running) then return end
|
|
local barrage = self:Find(data.id)
|
|
if(barrage==nil) then
|
|
if(#self.barrages >= self.numLimit) then
|
|
if(self:Find(data.id,self.waitQueue)==nil) then
|
|
self.waitQueue[#self.waitQueue+1] = data
|
|
end
|
|
-- self:Remove(self.barrages[1])
|
|
else
|
|
self:_AddText(data)
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:_AddText(data)
|
|
data.duration = data.duration or self.duration
|
|
if(data.percent == nil) then
|
|
data.percent = self:GetPercent()
|
|
end
|
|
self.barrages[#self.barrages+1] = data
|
|
local go = self.barrage:AddText(data)
|
|
go.transform.localScale = Vector3(1,BarrageView.yScale,1)
|
|
if(data.speed<=self.meshSpeed) then
|
|
LeanTween.delayedCall(go,data.duration,function ()
|
|
self:Remove(data)
|
|
end)
|
|
else
|
|
local deltaSpeed = data.speed - self.meshSpeed
|
|
local deltaDistance = deltaSpeed * data.duration
|
|
local x = go.transform.localPosition.x
|
|
local targetX = math.max(x - deltaDistance, -BarrageView.activeWidth/2)
|
|
LeanTween.moveLocalX(go, targetX, data.duration):setOnComplete(function ()
|
|
self:Remove(data)
|
|
end)
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:Remove(data)
|
|
local index = TableUtil.ArrayIndexOf(self.barrages,data)
|
|
if(index>0) then
|
|
local barrage = self.barrages[index]
|
|
self:RemoveBarrage(barrage)
|
|
TableUtil.Remove(self.barrages,barrage)
|
|
if(#self.waitQueue>0) then
|
|
self:_AddText(table.remove(self.waitQueue, 1))
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:RemoveByID(id)
|
|
local barrage = self:Find(id)
|
|
if(barrage) then
|
|
self:RemoveBarrage(barrage)
|
|
TableUtil.Remove(self.barrages,barrage)
|
|
if(#self.waitQueue>0) then
|
|
self:_AddText(table.remove(self.waitQueue, 1))
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionBarrage:RemoveBarrage(barrage)
|
|
local go = self.barrage:RemoveText(barrage)
|
|
LeanTween.cancel(go)
|
|
end
|
|
|
|
function FunctionBarrage:FindIndex(id,array)
|
|
array = array or self.barrages
|
|
for i=1,#array do
|
|
if id~=nil and array[i].id==id then
|
|
return i
|
|
end
|
|
end
|
|
return 0
|
|
end
|
|
|
|
function FunctionBarrage:Find(id,array)
|
|
array = array or self.barrages
|
|
return array[self:FindIndex(id,array)]
|
|
end
|
|
|
|
function FunctionBarrage:GetPercent()
|
|
local y = (self.transMainCamera.localEulerAngles - self.goMesh.transform.localEulerAngles).y - 180
|
|
-- print("euler y",y)
|
|
y = (y<0) and 360+y or y
|
|
return (math.abs(y))/360
|
|
end |