miduo_client/Assets/ManagedResources/~Lua/View/SingleStoryPlayerView.lua

321 lines
11 KiB
Lua

SingleStoryPlayerView = {}
local MapPointConfig = ConfigManager.GetConfig(ConfigName.MapPointConfig)
local _PlayTimeStamp = {
[0] = 0,
[1] = 0,
}
function SingleStoryPlayerView:New(gameObject)
local b = {}
b.gameObject = gameObject
b.transform = gameObject.transform
setmetatable(b, { __index = SingleStoryPlayerView })
return b
end
function SingleStoryPlayerView:InitComponent()
self.roleRoot = Util.GetGameObject(self.gameObject,"roleRoot")
self.nameDi = Util.GetGameObject(self.gameObject, "nemeDi")
self.name = Util.GetGameObject(self.nameDi, "name"):GetComponent("Text")
self.roadsList = {}
self.dirList = {}
self.roads = {}
self.startPos = {}
self.index = 1 --当前应该走哪一段 self.roads = self.roadsList[self.index] 第一段是出生点 从第二段开始跑图
self.roadsIndex = 0 --走到当前路线哪一步
self.callList = Stack.New()
self.state = 0
end
function SingleStoryPlayerView:OnOpen(parent)
self.parent = parent
_PlayTimeStamp = {
[0] = 0,
[1] = 0,
}
--LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0])
end
function SingleStoryPlayerView:SetData(data,playerType)
self.playerType = playerType
if self.playerLiveView then
self.playerLiveView:OnClose()
self.playerLiveView = nil
end
self.roleRoot.transform.localScale = Vector3.one
if playerType == 0 then
self:SetRoads0(data)
elseif playerType == 1 then
self:SetRoads1(data)
end
self.gameObject.transform.localPosition = self.startPos
self.gameObject.transform.localScale = Vector3.one * 1.5
end
function SingleStoryPlayerView:SetRoads0(data)
local index = 0
for i = 2 ,#data do
local vecs = string.split(data[i],',')
if #vecs < 3 then
if tonumber(vecs[1]) == 0 then
index = index + 1
if not self.roadsList[index] then
self.roadsList[index] = {}
end
if not self.dirList[index] then
self.dirList[index] = tonumber(vecs[2]) or 1
end
end
else
local road = {}
road.indexType = 0 -- 0 怪 1 人 2 地图
road.vec = Vector3.New(tonumber(vecs[1] or 0),tonumber(vecs[2] or 0),tonumber(vecs[3] or 0))
if tonumber(vecs[4]) and tonumber(vecs[4]) > 0 then
local event = {}
event.eventType = tonumber(vecs[4])
event.groups = {}
for j = 5,#vecs do
table.insert(event.groups,tonumber(vecs[j]))
end
road.event = event
end
table.insert(self.roadsList[index],road)
end
end
-- for k,v in ipairs(self.roadsList) do
-- --LogGreen("Monster k:"..k.." dirList:"..self.dirList[k])
-- for n,m in ipairs(v) do
-- --LogGreen("Monster k:"..k.." n:"..n.." vec:"..tostring(m.vec))
-- end
-- end
self.startPos = self.roadsList[1][1].vec
local pointId = tonumber(data[1])
self.playerLiveView = MonsterLiveView:New(self.roleRoot,pointId)
self:SetWalkDir(self.dirList[1])
end
function SingleStoryPlayerView:SetRoads1(data)
self.playerLiveView = PlayerLiveView:New(self.roleRoot,2,{
skin = PlayerManager.GetPlayerSkin(),
sex = NameManager.roleSex,
ride = 0,
designation = 0,
})
self.playerLiveView:OnOpen(GetPlayerRoleSingleConFig().Scale14)
self.playerLiveView.name = "npc"
--PlayUIAnim(self.gameObject)
local index = 0
for i = 1 ,#data do
if tonumber(data[i][1]) and tonumber(data[i][1]) == 0 then
index = index + 1
if not self.roadsList[index] then
self.roadsList[index] = {}
end
if not self.dirList[index] then
self.dirList[index] = tonumber(data[i][2]) or 1
end
else
local road = {}
road.indexType = tonumber(data[i][1]) -- 0 怪 1 人 2 地图
local vecs = string.split(data[i][2],',')
road.vec = Vector3.New(tonumber(vecs[1]),tonumber(vecs[2]),tonumber(vecs[3]))
if tonumber(data[i][3]) and tonumber(data[i][3]) > 0 then
local event = {}
event.eventType = tonumber(data[i][3])
event.groups = {}
for j = 4,#data[i] do
table.insert(event.groups,tonumber(data[i][j]))
end
road.event = event
end
table.insert(self.roadsList[index],road)
end
end
-- for k,v in ipairs(self.roadsList) do
-- --LogGreen("Player k:"..k.." dirList:"..self.dirList[k])
-- for n,m in ipairs(v) do
-- --LogGreen("Player k:"..k.." n:"..n.." vec:"..tostring(m.vec))
-- end
-- end
self.startPos = self.roadsList[1][1].vec
self:SetWalkDir(self.dirList[1])
end
function SingleStoryPlayerView:RunMap(isSetRoleDir)
self.roadsIndex = 0
self.state = 1
self.index = self.index + 1
self.roads = self.roadsList[self.index]
if self.dirList[self.index] ~= self.eventpoint then
self.eventpoint = self.dirList[self.index]
self:SetRoleDir()
end
if not self.roads or #self.roads < 1 then
self.state = 0
return
end
self.callList:Clear()
for i = #self.roads, 1, -1 do
local data = self.roads[i]
self.callList:Push(function ()
local go = self.gameObject
if data.indexType == 2 then
go = self.parent.map
end
local dis
----LogGreen("isSetRoleDir:"..isSetRoleDir)
if data.indexType == 2 or isSetRoleDir == 10 then
dis = math.abs(self:SetRoleDirAction(data.vec,go.transform.localPosition,false))
else
dis = math.abs(self:SetRoleDirAction(data.vec,go.transform.localPosition,true))
end
local speed = 0
if data.indexType ~= 0 then
speed = (1/600)*dis
else
speed = (1/550)*dis
end
self.tween = go.gameObject.transform:DOLocalMove(data.vec, speed, false):OnStart(function() end):OnUpdate(function() --TODO:测试速度
self:PlayStepSound(data.indexType,isSetRoleDir)
end):OnComplete(function ()
if data.event and data.event.eventType > 0 then
self:SetRoleDir()
self.parent:CheckTrigger(data.event,self)
else
self:StackPop()
end
end):SetEase(Ease.Linear)
end)
end
self:StackPop()
end
function SingleStoryPlayerView:PlaySound(time,Sound,curTimeStamp,timeStamp)
--LogGreen("curTimeStamp:"..curTimeStamp.." timeStamp:"..timeStamp.." curTimeStamp - timeStamp:"..curTimeStamp - timeStamp)
if curTimeStamp - timeStamp >= time then
--LogGreen("播放音效:"..Sound)
SoundManager.PlaySound(Sound)
return true
end
return false
end
function SingleStoryPlayerView:PlayStepSound(indexType,isSetRoleDir)
self.curTimeStamp = GetTimeStamp()
if indexType == 0 then
self.isSet = self:PlaySound(0.5,(isSetRoleDir == 10 and SoundConfig.STORY_VOICE_1_4 or SoundConfig.STORY_FOOT_1_2),self.curTimeStamp,_PlayTimeStamp[0])
if self.isSet then
_PlayTimeStamp[0] = self.curTimeStamp
end
--LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0])
elseif indexType == 1 then
self.isSet = self:PlaySound(0.2,SoundConfig.STORY_FOOT_1_1,self.curTimeStamp,_PlayTimeStamp[1])
if self.isSet then
_PlayTimeStamp[1] = self.curTimeStamp
end
else
self.isSet = self:PlaySound(0.5,(isSetRoleDir == 10 and SoundConfig.STORY_VOICE_1_4 or SoundConfig.STORY_FOOT_1_2),self.curTimeStamp,_PlayTimeStamp[0])
if self.isSet then
_PlayTimeStamp[0] = self.curTimeStamp
end
--LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0])
self.isSet = self:PlaySound(0.2,SoundConfig.STORY_FOOT_1_1,self.curTimeStamp,_PlayTimeStamp[1])
if self.isSet then
_PlayTimeStamp[1] = self.curTimeStamp
end
end
end
-- 角色相关
function SingleStoryPlayerView:SetRoleDirAction(pos,go,indexType)
local du = pos.x - go.x
local dy = pos.y - go.y
if du > 0 then
if indexType then
self:SetWalkDir(WALK_DIR.RUN_RIGHT)
self.eventpoint = 4
end
return du
elseif du < 0 then
if indexType then
self:SetWalkDir(WALK_DIR.RUN_LEFT)
self.eventpoint = 3
end
return du
elseif dy < 0 then
if indexType then
self:SetWalkDir(WALK_DIR.RUN_DOWN)
self.eventpoint = 1
end
return dy
elseif dy > 0 then
if indexType then
self:SetWalkDir(WALK_DIR.RUN_UP)
self.eventpoint = 2
end
return dy
end
return 0
end
function SingleStoryPlayerView:SetWalkDir(dir)
self.playerLiveView:SetWalkDir(dir)
end
-- 角色停止行走时的朝向
function SingleStoryPlayerView:SetRoleDir()
self:SetWalkDir(self.eventpoint)
end
function SingleStoryPlayerView:StackPop()
if self.callList:Count() > 0 then
self.roadsIndex = self.roadsIndex + 1
self.callList:Pop()()
else
self.state = 0
end
end
function SingleStoryPlayerView:StopAction()
self.state = 0
self.callList:Clear()
self.roadsIndex = #self.roads
if self.roadsIndex < 1 then
self:SetRoleDir()
else
local vec = self:SetRoleDirAction(self.roads[self.roadsIndex].vec,self.roads[1].vec,true)
if vec == 0 then
self.eventpoint = self.dirList[self.index]
self:SetWalkDir()
end
self.gameObject.transform.localPosition = self.roads[self.roadsIndex].vec
end
end
function SingleStoryPlayerView:OnClose()
self.roadsList = {}
self.roads = {}
self.startPos = {}
self.index = 1 --当前应该走哪一段 self.roads = self.roadsList[self.index] 第一段是出生点 从第二段开始跑图
self.callList = Stack.New()
self.state = 0
if self.playerLiveView then
self.playerLiveView:OnClose()
end
if self.tween then
self.tween:Kill()
end
--LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0])
_PlayTimeStamp = {
[0] = 0,
[1] = 0,
}
end
function SingleStoryPlayerView:CheckState()
----LogGreen("self.state:"..self.state.." self.index:"..self.roadsIndex.." self.playerType:"..self.playerType.." #self.roadsList:"..#self.roadsList[self.index])
if self.state == 1 or self.roadsIndex < (self.roadsList[self.index] and #self.roadsList[self.index] or 0) then
return true
end
return false
end
return SingleStoryPlayerView