321 lines
11 KiB
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 |